Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as any employee
-
ExploitSubstitute another employee's emp_id/allowance_id/deduction_id
-
ExecutionServer loads record without authorization check
-
ImpactRead victim's salary, allowances, and loan schedules
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V8 - Authorization Authorization checks on every request
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires an authenticated Horilla account at any privilege level - the attacker only needs to be a logged-in employee (PR:L); no payroll-view permission and no record ownership are needed, which is precisely the flaw. Exploitation targets the payroll endpoints backing allowances_deductions_tab, view_single_allowance, and view_single_deduction in Horilla 1.5.0-85 and earlier, by substituting the emp_id, allowance_id, or deduction_id identifiers. What LIMITS exploitation: the attacker must possess valid credentials (insider or compromised account), so it is not remote-unauthenticated; impact is confidentiality-only (data disclosure, no modification). Aggravating limitation on defenders: no complete patch exists, and the available fix only covers allowances_deductions_tab, so full remediation is not yet possible. |
| Impact | This is a genuine but moderate-priority authorization flaw, not an inflated high-CVSS finding. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N = 6.5) is internally consistent with the description: network-reachable, low complexity, requires an authenticated low-privilege account (any employee), no user interaction, and pure confidentiality impact with no integrity or availability effect. The real risk is bounded by three factors that raw CVSS does not fully convey: (1) it is authorization-only - an authenticated employee reading peers' payroll/loan data, which is an insider-threat and privacy-breach vector rather than a remote-takeover primitive; (2) the affected product is niche open-source HR software with a small footprint; and (3) no EPSS score, no CISA KEV listing, and no public exploit code are present in the provided intelligence, so there is no signal of active or automated exploitation. However, exploitation is trivial once an attacker has any valid employee login (simple IDOR - increment/substitute emp_id, allowance_id, or deduction_id), and the leaked data (full salary structures, loan disbursements, repayment schedules) is highly sensitive PII/financial data, which justifies the C:H rating. A notable aggravating factor: the vendor advisory (GHSA-c38j-fg3w-7rph) explicitly states no complete fixed version is available, and the patch commit only adds an authorization check to allowances_deductions_tab - leaving view_single_allowance and view_single_deduction potentially still exposed. The one clear data-quality conflict: the source tag labels this 'Authentication Bypass,' but the description and CWE-862 (Missing Authorization) make clear this is an authorization/IDOR issue, not an authentication bypass. |
| Exploit ScenarioDerived | A logged-in employee (or a compromised low-privilege account) browses to the payroll allowance/deduction endpoints and simply substitutes another employee's emp_id, allowance_id, or deduction_id in the request. The application loads and returns the target's salary structure, allowance/deduction amounts, and personal loan disbursement and repayment data without checking record ownership or payroll-view permissions. No public exploit code is identified, but the attack requires only a browser and trivial parameter manipulation. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 25, 2026
Authenticated employees can read other employees' payroll records in Horilla HR 1.5.0-85 and earlier by substituting the emp_id, allowance_id, or deduction_id identifiers on the allowances_deductions_tab, view_single_allowance, and view_single_deduction endpoints in payroll/views/component_views.py. Exploitation requires only a valid logged-in account at any privilege level - no payroll-view permission and no ownership of the target record are needed - and exposes salary structures, allowance and deduction amounts, personal loan disbursements, and repayment schedules, making this a confidentiality-only disclosure flaw rated CVSS 6.5. There is no confirmed active exploitation (no CISA KEV listing) and no public exploit identified at time of analysis, but the absence of a complete fixed version leaves defenders with limited options.
RemediationAI
No vendor-released complete patch or fixed version was identified at time of analysis; the only upstream change is commit a17fdbbbfe9a276560d5f82e8360ab1910e623bf (referenced in advisory GHSA-c38j-fg3w-7rph at https://github.com/horilla/horilla-hr/security/advisories/GHSA-c38j-fg3w-7rph), which hardens allowances_deductions_tab by requiring either record ownership via employee_get or both payroll.view_allowance and payroll.view_deduction permissions, returning handle_no_permission otherwise - apply this patch if you can, but note it does not cover view_single_allowance or view_single_deduction, so full remediation is not yet possible. As compensating controls, add a request-level authorization check (middleware, decorator, or a backported mirror of the upstream handle_no_permission logic) on the two unpatched views that verifies the requested allowance_id or deduction_id belongs to the caller's own employee record; the trade-off is custom code that must be maintained and retested against future releases. Alternatively, restrict network access to the /payroll/ view paths to trusted internal ranges or a VPN and strip or validate emp_id/allowance_id/deduction_id parameters at the reverse proxy, accepting reduced usability for legitimate HR staff working remotely. Finally, since exploitation requires only a valid low-privilege account, tighten account provisioning and session hygiene, monitor payroll endpoint access logs for identifiers that do not match the requesting session's employee, and treat unusual cross-employee record lookups as potential insider or credential-compromise activity.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Horilla is a Django-based HR and CRM application, and the affected code lives in the payroll view layer (payroll/views/component_views.py) where object-level authorization is inconsistently applied. The root cause is CWE-862 (Missing Authorization): the functions allowances_deductions_tab, view_single_allowance, and view_single_deduction load records selected directly by user-supplied identifiers (emp_id, allowance_id, deduction_id) without verifying that the requesting user owns the record or holds the corresponding payroll permissions. This is effectively an insecure direct object reference pattern layered on top of a missing permission gate. The CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N vector confirms it is network-reachable, low complexity, requires low privileges (any authenticated session), needs no user interaction, and results in high confidentiality impact with no integrity or availability effect. The upstream commit a17fdbbbfe9a276560d5f82e8360ab1910e623bf adds a check to allowances_deductions_tab that calls handle_no_permission(request) unless the requester's employee_get matches the target employee or the user holds both payroll.view_allowance and payroll.view_deduction - notably, that diff addresses only one of the three vulnerable functions.
Know when Django gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Any authenticated employee (PR:L) can trivially substitute IDs over the network (AV:N/AC:L) to read sensitive salary/loan data (C:H); no write or availability impact (I:N/A:N).
Primary rating from Vendor (github).
CVSS VectorVendor: github
DescriptionCVE.org
Horilla is an HR and CRM software. In 1.5.0-85 and earlier, payroll/views/component_views.py does not consistently authorize access in allowances_deductions_tab, view_single_allowance, and view_single_deduction before loading records selected by emp_id, allowance_id, or deduction_id. An authenticated employee can substitute those identifiers to read another employee's salary structure, allowance and deduction amounts, personal loan disbursements, and repayment schedules without owning the record or holding payroll-view permissions. No complete fixed version is available as of this review.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
The package python/cpython from 0 and before 3.6.13, from 3.7.0 and before 3.7.10, from 3.8.0 and before 3.8.8, from 3.9
In Django 1.10.x before 1.10.8 and 1.11.x before 1.11.5, HTML autoescaping was disabled in a portion of the template for
An issue was discovered in Django 3.2 before 3.2.14 and 4.0 before 4.0.6. Rated critical severity (CVSS 9.8), this vulne
Django 3.1.x before 3.1.13 and 3.2.x before 3.2.5 allows QuerySet.order_by SQL injection if order_by is untrusted input
Django before 1.11.27, 2.x before 2.2.9, and 3.x before 3.0.1 allows account takeover. Rated critical severity (CVSS 9.8
An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti
Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE
Django 1.11 before 1.11.29, 2.2 before 2.2.11, and 3.0 before 3.0.4 allows SQL Injection if untrusted data is used as a
Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j
Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex
Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros
Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju
EUVD-2026-87362
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB