CVE-2026-63431
Executive Summary
CVE-2026-63431 is a broken access control vulnerability (CWE-862) in Horilla, an open source HR and CRM platform. Versions 1.5.0-85 and earlier fail to consistently enforce authorization checks in the payroll module before loading records. Any authenticated employee can manipulate identifiers such as emp_id, allowance_id, or deduction_id to read other employees' salary structures, allowance and deduction amounts, personal loan disbursements, and repayment schedules. The vulnerability requires only a low-privileged authenticated session, no user interaction, and yields high confidentiality impact, which is reflected in its CVSS v3.1 base score of 6.5.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Technical Analysis
The vulnerability resides in the payroll module of Horilla. Specifically, the file payroll/views/component_views.py contains at least three view functions — allowances_deductions_tab, view_single_allowance, and view_single_deduction — that do not consistently authorize access before loading records. These views accept user-supplied identifiers (emp_id, allowance_id, deduction_id) and use them to query the database without verifying that the requesting user owns the record or holds the requisite payroll-view permissions.
From a code-level perspective, the flaw is a classic Insecure Direct Object Reference (IDOR) nested within a missing function-level access control (CWE-862). The application fails to perform an ownership check or a permission check on the resolved object. An authenticated employee with a valid session can substitute the identifiers in requests to the affected views. Because the queries are driven directly by these parameters, the backend returns the corresponding records regardless of the caller's identity or role.
The attack surface is the web application's payroll endpoints exposed by these views. Exploitation is remote (AV:N) and requires low privileges (PR:L) — only a valid employee account. No user interaction (UI:N) is needed. The impact is limited to confidentiality (C:H), as the description does not indicate any ability to modify or delete records. Integrity and availability impacts are none.
Sparse technical detail is available beyond the NVD description; no public PoC, Nuclei template, or exploit code exists. The specific URL paths and parameter encodings are not enumerated in the advisory, and no patch has been released. Therefore, the attack mechanism is best described at the vulnerability-class level: unauthenticated object references in payroll views that lack per-object authorization.
Exploitation Scenarios
No public PoC is available; the attack chain is inferred from the vulnerability class described in the NVD entry.
Reconnaissance/Target Identification: An attacker identifies an internet-facing Horilla instance (e.g., via Shodan dork
http.title:"Horilla"). They register or obtain a low-privileged employee account. If registration is disabled, the attacker may use credentials from prior breaches or social engineering. The attacker maps the payroll module by browsing the application as a normal employee and noting the allowance/deduction tabs.Triggering the Flaw: The attacker navigates to the payroll component views —
allowances_deductions_tab,view_single_allowance, orview_single_deduction— and observes the request parameters. Because the views do not enforce ownership or permission checks, the attacker substitutes their ownemp_idwith that of another employee (e.g., a manager or executive). Similarly, they iterateallowance_idanddeduction_idvalues.Payload/Execution Method: The exploitation is a simple parameter tampering at the HTTP request level. The attacker sends crafted GET or POST requests to the affected endpoints with modified identifiers. No special payload encoding is required; the backend loads and returns the corresponding records. The attacker may automate enumeration of
emp_id,allowance_id, anddeduction_idto extract data at scale.Post-Exploitation Impact: The attacker gains read access to another employee's salary structure, allowance and deduction amounts, personal loan disbursements, and repayment schedules. This data can be used for financial fraud, identity theft, corporate espionage, or targeted phishing. The breach is difficult to detect because it uses legitimate application functionality and authenticated sessions, blending with normal traffic. No data modification or denial of service is possible per the CVSS vector, but the confidentiality loss is high.
Impact Assessment
The vulnerability exposes sensitive payroll and financial data. Affected systems are Horilla deployments running version 1.5.0-85 or earlier with the payroll module enabled. The blast radius includes all employees whose records are stored in the system, as any authenticated employee can enumerate identifiers to read others' data. Business impact includes regulatory exposure (e.g., GDPR, CCPA, HIPAA if health-related deductions are included), reputational damage, and potential insider threat enablement. CVSS v3.1 base score is 6.5 (Medium), with subscores: AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N. The high confidentiality impact combined with low attack complexity and no user interaction makes this a serious data disclosure risk, though the need for authentication keeps the score in the medium range. The EPSS score is not yet available from FIRST.org, and there is no evidence of active exploitation or CISA KEV listing.
Detection Guidance
Sigma Rule
title: Horilla Payroll IDOR - Excessive Object Identifier Enumeration
id: 3f8c2a1e-9b4d-4f7a-8c1e-2d6f9a0b3e5c
status: experimental
description: Detects requests to Horilla payroll views with manipulated emp_id, allowance_id, or deduction_id parameters, indicating attempted IDOR exploitation.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-63431
author: Threat Intelligence Team
date: 2026-01-01
tags:
- attack.t1190
- attack.t1078
logsource:
category: webserver
product: apache
detection:
selection_endpoint:
cs-uri-stem|contains:
- '/payroll/'
- 'component_views'
- 'allowances_deductions_tab'
- 'view_single_allowance'
- 'view_single_deduction'
selection_params:
cs-uri-query|contains:
- 'emp_id='
- 'allowance_id='
- 'deduction_id='
condition: selection_endpoint and selection_params
fields:
- c-ip
- cs-username
- cs-uri-stem
- cs-uri-query
falsepositives:
- Legitimate HR administrators accessing multiple employee records
level: medium
YARA Rule
rule CVE_2026_63431_Horilla_IDOR
{
meta:
description = "Detects references to vulnerable Horilla payroll views in web logs or source code"
author = "Threat Intelligence Team"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-63431"
date = "2026-01-01"
severity = "medium"
strings:
$view1 = "allowances_deductions_tab" ascii wide nocase
$view2 = "view_single_allowance" ascii wide nocase
$view3 = "view_single_deduction" ascii wide nocase
$param1 = "emp_id" ascii wide nocase
$param2 = "allowance_id" ascii wide nocase
$param3 = "deduction_id" ascii wide nocase
$file = "component_views.py" ascii wide nocase
condition:
$file and any of ($view*) and any of ($param*)
}
Suricata IDS Rule
alert http any any -> any any (msg:"CVE-2026-63431 Horilla Payroll IDOR Attempt"; flow:established,to_server; http.uri; content:"/payroll/"; http.uri; content:"component_views"; http.uri; content:"emp_id"; http.uri; content:"allowance_id"; http.uri; content:"deduction_id"; classtype:attempted-recon; reference:cve,2026-63431; reference:url,https://nvd.nist.gov/vuln/detail/CVE-2026-63431; sid:202663431; rev:1;)
Elastic Detection
sequence by user.id with maxspan=5m
[ network where url.path : "*component_views*" and url.query : "*emp_id=*" and url.query : "*allowance_id=*" ]
[ network where url.path : "*view_single_allowance*" or url.path : "*view_single_deduction*" ]
Splunk SPL Query
index=web sourcetype=access_combined
| search (uri_path="*component_views*" OR uri_path="*allowances_deductions_tab*" OR uri_path="*view_single_allowance*" OR uri_path="*view_single_deduction*")
| rex field=uri_query "(?<param_name>[^=&]+)=(?<param_value>[^&]+)"
| where param_name IN ("emp_id","allowance_id","deduction_id")
| stats count dc(param_value) as unique_ids values(param_value) as ids by src_ip, user, uri_path
| where unique_ids > 10
| sort - unique_ids
Wazuh OSSEC Rule
<group name="web,appsec,">
<rule id="100631" level="10">
<decoded_as>web-accesslog</decoded_as>
<url>/payroll/.*(component_views|allowances_deductions_tab|view_single_allowance|view_single_deduction)</url>
<regex>emp_id=|allowance_id=|deduction_id=</regex>
<description>CVE-2026-63431: Horilla payroll IDOR attempt detected</description>
<mitre>
<id>T1190</id>
</mitre>
<group>cve_2026_63431,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch confidence: 0/4 (UNPATCHED — no patch evidence from any tracked source).
Immediate Mitigations:
- Restrict access to Horilla instances to trusted networks or VPN-only.
- Enforce strong authentication and consider MFA for all employee accounts.
- Implement a Web Application Firewall (WAF) rule to block or alert on requests with sequential or anomalous
emp_id,allowance_id, ordeduction_idparameters. - Audit payroll view usage for abnormal patterns (e.g., one user accessing many different employee records).
- Apply the principle of least privilege: ensure only payroll-authorized roles can access the payroll module at the network level.
Patch/Upgrade Steps:
- No fixed version is available. Monitor the Horilla project repository and vendor channels for an official patch.
- When a patch is released, upgrade to the latest version immediately. Verify that the patch adds ownership and permission checks in
allowances_deductions_tab,view_single_allowance, andview_single_deduction. - If a patch is not forthcoming, consider custom code hardening: add explicit
request.userownership checks and permission decorators inpayroll/views/component_views.py.
Long-Term Hardening:
- Adopt a secure development lifecycle with mandatory authorization review for all views that accept object identifiers.
- Implement centralized access control mechanisms (e.g., Django's
@login_requiredand customhas_permchecks) for every view. - Regularly conduct code reviews and penetration tests focusing on IDOR and broken access control.
- Log and monitor all access to sensitive payroll data with alerting on anomalous read volumes.
References
- https://nvd.nist.gov/vuln/detail/CVE-2026-63431
- https://cwe.mitre.org/data/definitions/862.html
- Horilla project repository (monitor for security advisories) — https://github.com/horilla-opensource/horilla
- OWASP Top 10: Broken Access Control — https://owasp.org/Top10/A01_2021-Broken_Access_Control/
- No known threat actor campaigns or exploit-in-the-wild evidence is available at this time.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.