Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as HR/payroll user
-
ExploitSubmit crafted filter value to ECS report
-
ExecutionInject SQL into unparameterized WHERE clause
-
ImpactRead sensitive salary and employee records
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Parameterized queries, prepared statements
MITRE ATT&CK
2 techniques across 2 tactics: Initial Access, Persistence 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 user with HR/Payroll privileges sufficient to access the 'Salary Payments via ECS' report; the attacker injects SQL through the report's filter values (department, branch, company, month, or year), which were concatenated directly into the query string. Exploitation is limited to Frappe HR versions prior to 15.60.3 (15.x line) and 16.7.1 (16.x line). The principal limiting factor is the authentication and authorization requirement - a valid HR-level account is needed - so this is an insider or post-credential-compromise vector rather than an anonymous remote attack; no special non-default configuration is required for the vulnerable report itself. |
| Impact | This is a moderate, authentication-gated SQL injection (CWE-89) with a self-consistent CVSS 3.1 vector (6.5, AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N). The signals align and present no contradictions: network-reachable but requiring valid credentials (PR:L), low complexity, and confidentiality-only impact (C:H, I/A:N), consistent with a read-oriented report query that exposes employee, gross_pay, and net_pay data. No EPSS score, no CISA KEV listing, and no public exploit code were provided, so there is no evidence of active or at-scale exploitation. The practical risk is therefore bounded by the requirement for an authenticated HR user - the attacker is already a semi-trusted insider or someone who has compromised HR credentials. This is a legitimate 'patch in normal cycle' issue rather than an emergency: the SQL injection is real and confirmed by the vendor fix commit (migration from string interpolation to the parameterized frappe.qb query builder), but the privilege prerequisite and absence of exploitation signals keep it well below the urgency of an unauthenticated RCE. Missing data to note: EPSS probability is absent (cannot quantify likelihood) and KEV status is not confirmed, so prioritization relies on CVSS and code evidence alone. |
| Exploit ScenarioDerived | An authenticated user with access to the HR/Payroll module opens the 'Salary Payments via ECS' report and enters a crafted value into a filter field (department, branch, company, month, or year). Because the report built its WHERE clause via unsafe Python string interpolation, the injected SQL executes against the database, letting the attacker read sensitive salary and employee records beyond their intended scope. No public exploit code was identified at the time of analysis, but the vulnerable pattern is clearly visible in the vendor's fix commit. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 16, 2026
SQL injection in the 'Salary Payments via ECS' report of Frappe HR (HRMS) lets an authenticated HR/payroll user read sensitive database records by supplying crafted report filter values. The vulnerability affects Frappe HR releases before 15.60.3 on the 15.x line and before 16.7.1 on the 16.x line, and is rated CVSS 3.1 6.5 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N); because the CVSS vector specifies PR:L, exploitation requires a valid low-privileged account and is therefore an insider or post-compromise vector rather than an anonymous remote attack. No public exploit code and no confirmed active exploitation (CISA KEV) were identified at time of analysis, and the issue is resolved by vendor patches 15.60.3 and 16.7.1.
RemediationAI
Vendor-released patch: upgrade to Frappe HR 15.60.3 or 16.7.1 (or later) as published at https://github.com/frappe/hrms/releases/tag/v15.60.3 and https://github.com/frappe/hrms/releases/tag/v16.7.1; the fix commits are d823d20c49493c2959e809d41c862c037c8109e6 and e9eef45425072b4e3cefea71683d515d63906d66, and the advisory is https://github.com/frappe/hrms/security/advisories/GHSA-c32r-q985-64xr. Where immediate upgrading is not possible, the most effective compensating control is to restrict who can run the 'Salary Payments via ECS' report: remove the HR/Payroll report permissions from untrusted or broadly provisioned accounts (Frappe Role Permission Manager and report-level role restrictions), since the attack requires an authenticated HR-privileged user and no anonymous path exists - the trade-off is that legitimate HR staff lose access to this payroll reconciliation report. Additionally, reduce the blast radius of the database account used by the Frappe site (least-privilege DB user, no cross-application grants) and monitor/review payroll report execution logs for anomalous filter values containing SQL syntax such as quotes, UNION, or stacked statements; these measures limit exposure but do not remove the injection flaw itself, so patching remains the primary remediation.
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
The root cause is CWE-89, improper neutralization of special elements used in an SQL command. In hrms/payroll/report/salary_payments_via_ecs/salary_payments_via_ecs.py, the get_conditions() function built a WHERE fragment by performing Python string interpolation of user-controlled filter values (department, branch, company, month, year) into fragments such as "department = '%s'", and get_data() then passed that fragment directly into a frappe.db.sql() call against the tabSalary Slip table via a %-format. The upstream fix (commit d823d20c49493c2959e809d41c862c037c8109e6, with a companion commit e9eef45425072b4e3cefea71683d515d63906d66) replaces the raw SQL string with the Frappe query builder: it constructs typed filter clauses (SalarySlip.department filters['department'], Extract('month', SalarySlip.start_date) int(filters['month']), and so on) combined with the docstatus = 1 predicate and executed through frappe.qb.from_(SalarySlip).select(...).where(base_where).run(as_dict=True). This parameterization/escaping through the ORM layer removes the injection primitive entirely. The affected component is the HRMS application layer on top of the Frappe framework, and the CPE cpe:2.3:a:frappe:hrms:*:*:*:*:*:*:*:* confirms the whole product line is treated as affected prior to the fixed releases. Successful exploitation yields read access to database records reachable by the report query, which the assessment scores as high confidentiality impact with no integrity or availability impact.
Know when Frappe 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
Network-accessible web report requiring an authenticated HR user (PR:L), low complexity; the injected query reads records so C:H, with no write or availability impact (I:N/A:N).
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Frappe HR is an open-source human resources management solution (HRMS). Prior to 15.60.3 and 16.7.1, the Salary Payments via ECS report constructs report conditions with unsafe SQL string interpolation. An authenticated HR user supplies crafted Salary Payments via ECS report filter values. The affected Salary Payments via ECS report allows the user to inject SQL through report filter values. Successful exploitation can access sensitive database records. This issue is fixed in versions 15.60.3 and 16.7.1.
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
Attack Technique
SQL injection exploits the way applications construct database queries by mixing user input directly into SQL statements.
Stored cross-site scripting leading to code execution in Frappe Framework 15.89.0 (and the ERPNext application built on
An exploitable SQL injection vulnerability exists in the authenticated part of ERPNext v10.1.6. Rated high severity (CVS
An exploitable SQL injection vulnerability exists in the authenticated part of ERPNext v10.1.6. Rated high severity (CVS
An exploitable SQL injection vulnerability exists in the authenticated part of ERPNext v10.1.6. Rated high severity (CVS
An exploitable SQL injection vulnerability exists in the authenticated part of ERPNext v10.1.6. Rated high severity (CVS
Authenticated SQL injection in Frappe ERPNext through 15.89.0 allows low-privilege users to extract arbitrary database c
SQL injection in Frappe ERPNext through 15.89.0 lets an authenticated attacker with a valid session and access to the Pa
Authenticated server-side template injection in Frappe ERPNext through 15.89.0 lets a user who can create or modify an A
An SQL injection vulnerability exists in the frappe.desk.reportview.get functionality of ERPNext 11.1.38. Rated high sev
Arbitrary file read in the Frappe full-stack web application framework allows remote unauthenticated attackers to retrie
SQL injection in Frappe HelpDesk 1.14.0 dashboard functionality allows authenticated attackers to execute arbitrary SQL
In Frappe ERPNext 15.57.5, the function get_rfq_containing_supplier() at erpnext/buying/doctype/request_for_quotation/re
EUVD-2026-103172
NVD
CVE.org
GitHub
Exploit-DB