Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessAuthenticate as low-privileged user
-
DeliveryStore free-text value with whitespace-padded formula
-
ExploitPrivileged user exports records to CSV/XLSX
-
ExecutionVictim opens file and accepts security prompt
-
PersistSpreadsheet evaluates cell as formula
-
ImpactOutbound data disclosure or DDE command execution
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V1 - Encoding and Sanitization CSV injection prevention
|
| Exploitation Conditions | Exploitation requires an authenticated low-privileged EspoCRM account (PR:L) able to store a free-text field value, plus a crafted payload where a formula trigger character (+, -, @, =) is preceded by whitespace or a control character so that the first-byte-only sanitizeCellValue() check fails to prepend the single-quote neutralization prefix. Impact is not self-contained: a SEPARATE privileged user must export the affected records to CSV or XLSX, open the resulting file, AND accept the spreadsheet application's formula/security prompts (UI:R) before the cell is evaluated. Data disclosure (e.g., outbound fetch formulas) is the baseline outcome; command execution is further LIMITED to legacy configurations with DDE explicitly enabled in the spreadsheet software. Affected: all EspoCRM versions prior to 9.3.9. Key limiting factors: dependency on victim interaction and prompt acceptance, low-privilege (not anonymous) access, and non-default DDE for the code-execution case. |
| Impact | This is a moderate, conditional risk best treated as a medium-priority hygiene fix rather than an urgent emergency. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N, base 5.4) is internally consistent with the description: a network-reachable CRM, low attack complexity to store the payload, low-privilege authentication required (PR:L), and mandatory user interaction (UI:R) because a separate privileged user must export, open the file, and actively accept spreadsheet security prompts before any impact occurs. The scope change (S:C) correctly reflects that the payload executes outside EspoCRM in the victim's spreadsheet application. Publicly available exploit code exists (vendor advisory GHSA-xrwp-2gph-985x plus the fix commit and release), which raises the practical likelihood of copycat attempts, but this is NOT the same as active exploitation - the CVE is not in CISA KEV and no EPSS score was provided in the input, so widespread automated exploitation cannot be asserted. The real-world risk is throttled by a long interaction chain (attacker-stored value → privileged export → file opened → security prompts accepted) and by the fact that the most severe outcome (command execution via DDE) depends on legacy, non-default spreadsheet configurations. Net: a legitimate issue to patch, but its medium CVSS and heavy reliance on victim behavior make it a priority-two item rather than a drop-everything event. EPSS and KEV are both absent/negative, consistent with the conclusion that no mass exploitation is confirmed. |
| Exploit ScenarioDerived | A low-privileged EspoCRM user enters a crafted free-text field value (e.g., in a contact or lead record) where a formula such as =WEBSERVICE(...) or a DDE payload is prefixed with a space or control character so EspoCRM's single-quote neutralization is skipped. Later an administrator or manager exports those records to CSV/XLSX and opens the file; upon accepting the spreadsheet's security prompt, the cell is evaluated as a formula, leaking data outbound or, on legacy DDE-enabled setups, executing a command. Public exploit/advisory detail exists, lowering the bar for reproduction. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 15, 2026
EspoCRM versions prior to 9.3.9 fail to neutralize spreadsheet formula triggers in exported CSV and XLSX files, because sanitizeCellValue() only inspects the first byte of a cell value. An authenticated low-privileged user can store free-text content such as " =cmd|' /C calc'!A0" (whitespace or a control character before the trigger), so the leading single-quote neutralization prefix is never applied; a separate privileged user must then export the affected records, open the file, and accept the spreadsheet application's formula/security prompts before the cell is evaluated, enabling outbound data disclosure and, on legacy configurations with DDE enabled, command execution. Tracked as CWE-1236 with CVSS 3.1 base score 5.4 (AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:N), and publicly available exploit code exists; no confirmed active exploitation (CISA KEV) was identified. This is a moderate, conditional risk best treated as a medium-priority hygiene fix rather than an urgent emergency.
RemediationAI
Upgrade EspoCRM to version 9.3.9 or later, which is the vendor-released patch that replaces the per-processor first-byte checks with the shared Util::sanitizeCellValue() that left-trims " \t\r\n\v\0" before testing for '+', '-', '@' or '=' (commit f209248efd0d63bc8f7906cb96c07020a758eead, release https://github.com/espocrm/espocrm/releases/tag/9.3.9, advisory GHSA-xrwp-2gph-985x). If immediate upgrade is not possible, reduce exposure by restricting the ability of low-privileged users to create or edit free-text fields that flow into exports, and treat every exported CSV/XLSX as untrusted input: open exports only in spreadsheet software with formula evaluation of untrusted data blocked or in Protected View, and keep DDE disabled - this removes the command-execution branch, but the data-exfiltration branch remains possible for formulas that do not rely on DDE, so the upgrade is still required. Note that disabling export functionality for low-privileged roles or limiting export to administrators eliminates the storage half of the attack chain but degrades reporting workflows for regular users, and that server-side sanitization filters on incoming text fields are not a reliable substitute because the bypass relies on whitespace/control characters that legitimate data may contain.
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 issue is classic CSV/spreadsheet formula injection (CWE-1236, Improper Neutralization of Formula Elements in a CSV File), an injection class that targets the consumer of exported data rather than the web application itself. EspoCRM's export pipeline is implemented in PHP across three export backends: application/Espo/Tools/Export/Format/Csv/Processor.php, application/Espo/Tools/Export/Format/Xlsx/OpenSpoutProcessor.php and application/Espo/Tools/Export/Format/Xlsx/PhpSpreadsheetProcessor.php. Each carried its own private sanitizeCellValue() that returned the value untouched if it was empty or numeric and otherwise checked a single byte, in_array($value[0], ['+', '-', '@', '=']), prepending a single quote only when that first character was a formula trigger. Formula parsers in Excel, LibreOffice Calc and similar tools ignore or strip leading whitespace and control characters before interpreting a cell as a formula, so a value beginning with a space, horizontal tab, CR, LF, vertical tab or NUL followed by '=', '+', '-', or '@' bypassed the check entirely while still evaluating as a formula when opened. The fix centralizes the logic into a new Espo\Tools\Export\Processor\Util::sanitizeCellValue() that left-trims whitespace and control characters with ltrim($value, " \t\r\n\v\0") and then inspects the first remaining character, quoting the original (untrimmed) value when a trigger is found. The CVSS vector is network vector with low privileges required (PR:L), user interaction required (UI:R), and changed scope (S:C), reflecting that the payload executes in the victim's spreadsheet application rather than inside EspoCRM, with limited confidentiality and integrity impact and no availability impact.
Know when Espocrm 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:R/S:C/C:L/I:L/A:N
Low-privilege authenticated user stores the payload (PR:L, AC:L, AV:N), a privileged victim must open the export and accept prompts (UI:R), and execution leaves EspoCRM for the spreadsheet app (S:C) with limited data/command impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
EspoCRM is an open source customer relationship management application. Prior to 9.3.9, application/Espo/Tools/Export/Format/Csv/Processor.php, application/Espo/Tools/Export/Format/Xlsx/OpenSpoutProcessor.php, and application/Espo/Tools/Export/Format/Xlsx/PhpSpreadsheetProcessor.php inspect only the first byte in sanitizeCellValue(). An authenticated low-privileged user can store a free-text value whose formula trigger is preceded by whitespace or a control character, causing CSV or XLSX export to omit the leading single-quote formula-neutralization prefix. When a privileged user opens the exported file and accepts applicable spreadsheet security prompts, spreadsheet software can ignore the whitespace or control-character prefix and evaluate the cell as a formula, permitting outbound data disclosure and, on legacy configurations with DDE enabled, command execution. This issue is fixed in version 9.3.9.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Directory traversal vulnerability in EspoCRM before 2.6.0 allows remote attackers to include and execute arbitrary local
PHP object deserialization in EspoCRM versions prior to 9.3.7 lets an authenticated administrator achieve remote code ex
Path traversal in EspoCRM's formula scripting engine allows authenticated administrators to achieve arbitrary file read/
EspoCRM version 7.1.8 is vulnerable to Unrestricted File Upload allowing attackers to upload malicious file with any ext
EspoCRM 5.6.4 is vulnerable to user password hash enumeration. Rated high severity (CVSS 8.8), this vulnerability is rem
Authorization bypass in EspoCRM 5.8.5 lets an authenticated low-privilege user reuse or manipulate Basic-Authorization a
EspoCRM deployments before 10.0.5 allow an authenticated user with Email Account scope to retrieve other users' stored I
CSV Injection in Create Contacts in EspoCRM 7.1.8 allows remote authenticated users to run system commands via creating
Boolean-based blind SQL injection in EspoCRM versions 8.1.0 through 9.3.7 allows an authenticated non-administrator to i
Path traversal in EspoCRM admin template management allows authenticated administrators to read, create, overwrite, or d
Server-side request forgery in EspoCRM before 10.0.4 allows authenticated users to route outbound HTTP requests to inter
Stored cross-site scripting in EspoCRM 9.3.3 and below enables an authenticated attacker to execute arbitrary JavaScript
EUVD-2026-102105
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB