Skip to main content

Horilla HR EUVDEUVD-2026-87362

| CVE-2026-63431 MEDIUM
Missing Authorization (CWE-862)
2026-09-25 security-advisories@github.com
6.5
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate as any employee
  2. Exploit
    Substitute another employee's emp_id/allowance_id/deduction_id
  3. Execution
    Server loads record without authorization check
  4. Impact
    Read 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.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
No patch listed yet 0.2% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

horilla-hr ≤ 1.5.0-85

Affected Packages

euvd horilla_hr no fix

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

Vendor (github) PRIMARY 6.5 MEDIUM
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
vuln.today AI 6.5 MEDIUM

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).

3.1 AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (github).

CVSS VectorVendor: github

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

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

EPSS Score
0.2%
Top 90% exploitable
Prevalence
Low
Niche open-source HR/CRM platform, limited production deployment footprint
Social Media
1
Sightings
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment CIRCL GitHub VulDB

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.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.2%
Patch available No
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Django

View all
CVE-2021-23336 MEDIUM POC
5.9 Feb 15

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

CVE-2017-12794 MEDIUM POC
6.1 Sep 07

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

CVE-2022-34265 CRITICAL POC
9.8 Jul 04

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

CVE-2021-35042 CRITICAL POC
9.8 Jul 02

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

CVE-2019-19844 CRITICAL POC
9.8 Dec 18

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

CVE-2026-61594 CRITICAL POC
9.1 Sep 16

An authentication/authorization bypass in the djust Python live-view framework (versions prior to 1.0.7) lets unauthenti

CVE-2026-61599 HIGH POC
8.8 Sep 16

Unauthenticated arbitrary Python module import in djust before 1.0.7 lets any client that can reach the WebSocket or SSE

CVE-2020-9402 HIGH POC
8.8 Mar 05

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

CVE-2016-6186 MEDIUM POC
6.1 Aug 05

Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/j

CVE-2026-93456 HIGH POC
8.4 Sep 18

Forged content modification in django-page-cms through 2.0.13 lets unauthenticated remote attackers exploit five CSRF-ex

CVE-2026-61593 HIGH POC
8.1 Sep 16

Cross-site request forgery in djust's Server-Sent-Events transport affects all versions prior to 1.0.7 and allows a cros

CVE-2026-61590 HIGH POC
7.4 Sep 16

Unauthenticated remote attackers can read live Django view and session state and invoke server-side handlers through dju

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy