Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconAuthenticate as administrator
-
DeliveryUpload crafted SQL to import-database endpoint
-
ExploitBypass validateSqlContent keyword whitelist
-
InstallRUNSCRIPT executes H2 FILE_READ/CSVWRITE/CREATE ALIAS
-
C2Write startup files to user-site location
-
ExecuteTrigger application Python interpreter to load them
-
ImpactCommand execution as JVM service account
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Code injection prevention, sandbox exec
MITRE ATT&CK
2 techniques across 2 tactics: Execution, Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires all of the following: (1) an authenticated administrator account; (2) the application running on its DEFAULT H2 database backend; (3) 'security mode' enabled; and (4) the ability to reach POST /api/v1/database/import-database to upload a crafted SQL file processed by RUNSCRIPT. Limiting factors that reduce real-world exposure: instances configured with an external database (e.g. PostgreSQL) instead of H2 are not affected, and the attacker must already hold administrative privileges, so this is a configuration-and-privilege-gated flaw rather than a default-config unauthenticated exploit. |
| Impact | The CVSS 3.1 base score of 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) is driven by network reachability, low complexity, no user interaction, a scope change, and full CIA impact - but the single most important mitigating signal is PR:H: exploitation requires an authenticated administrator. This is therefore not an unauthenticated internet-facing RCE but a privilege-escalation/post-authentication issue where an existing admin breaks out of the application to OS command execution as the JVM service account. No EPSS score was supplied, the CVE is not listed in CISA KEV, and no public exploit was provided in the input, so exploitation status is 'no public exploit identified at time of analysis.' Real-world urgency is further constrained by configuration dependency: it only applies to the default H2 database backend with 'security mode,' so deployments using an external database (e.g. PostgreSQL) are not in scope. Net assessment: a genuine high-severity flaw worth patching promptly for H2-backed instances, but materially lower real-world risk than the 9.1 headline implies because it presupposes administrative access and a specific default configuration rather than anonymous exploitation. |
| Exploit ScenarioDerived | An authenticated Stirling-PDF administrator (or an attacker who has already obtained admin credentials) on a default H2-database instance uploads a crafted SQL file to POST /api/v1/database/import-database. Because DatabaseService.validateSqlContent() only checks that each semicolon-split statement contains an allowed keyword, the attacker smuggles dangerous H2 functions (FILE_READ, CSVWRITE, CREATE ALIAS) past the whitelist, which RUNSCRIPT then executes to read/write files and ultimately chain into OS command execution. No public proof-of-concept was provided in the input, though the advisory describes a working command-execution chain. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 14, 2026
Arbitrary file access and operating-system command execution in Stirling-PDF prior to 2.13.2 are reachable by an authenticated administrator who uploads a crafted SQL file to POST /api/v1/database/import-database on instances running the default H2 database backend with security mode enabled. DatabaseService.validateSqlContent() splits the normalized input on semicolons and accepts a statement if it merely contains an allowed keyword, so dangerous H2 constructs such as FILE_READ, CSVWRITE and CREATE ALIAS slip past the whitelist and execute when RUNSCRIPT processes the import; the demonstrated chain writes attacker-controlled startup files to a user-site location and triggers the application's Python interpreter to load them, yielding command execution as the JVM service account. The CVSS 3.1 base score of 9.1 (CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:H) reflects network reachability with full confidentiality, integrity and availability impact and a scope change, but PR:H means the attacker must already hold administrative privileges and non-H2 deployments are unaffected; no public exploit code identified at time of analysis, and the issue is fixed in version 2.13.2.
RemediationAI
Vendor-released patch: upgrade to Stirling-PDF 2.13.2 (https://github.com/Stirling-Tools/Stirling-PDF/releases/tag/v2.13.2), which incorporates the fix from commit d06d3cabaf5b8a7dcd0dbfc584828d8e687e5dd5 and pull request 6796 and is the only durable remediation for the insufficient SQL keyword whitelist in DatabaseService.validateSqlContent(). Where immediate upgrading is not possible, migrate the instance from the default embedded H2 backend to an external database such as PostgreSQL, which removes the H2 RUNSCRIPT execution path entirely - the trade-off is a data migration exercise plus ongoing operational overhead for the database server. Additionally, restrict or block POST /api/v1/database/import-database at the reverse proxy or API gateway so that only trusted administrative networks can reach it, accepting that legitimate database restore workflows must be performed from those networks. As a containment measure for the command-execution chain, run the JVM under a dedicated low-privilege service account and mount the application installation and any user-site Python directories read-only (or writable only by root), which prevents the attacker from writing the startup files the interpreter would load - with the trade-off that some in-place update and plugin features may stop working. If the embedded Python interpreter integration is not required, disable it to break the second stage of the exploitation chain, and audit logs for calls to the database import endpoint, for H2 FILE_READ/CSVWRITE/CREATE ALIAS usage, and for unexpected Python startup files created under the service account. Monitor the vendor advisory GHSA-mrr8-934j-4g8m (https://github.com/Stirling-Tools/Stirling-PDF/security/advisories/GHSA-mrr8-934j-4g8m) for updated guidance; no public exploit code was identified at time of analysis, but the primitive is trivially reachable by anyone already holding administrator credentials.
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
Stirling-PDF is a self-hosted Java/Spring web application for PDF manipulation that can persist its own configuration and database through a built-in H2 database. The vulnerable feature is the database import endpoint, which accepts a SQL dump and feeds it to H2's RUNSCRIPT command; before execution, DatabaseService.validateSqlContent() attempts to screen the input by normalizing it, splitting on semicolons, and accepting each statement that contains any keyword from an allow-list. That is a denylist-by-keyword design failure rather than a parser: because the check is a substring 'contains' test on allowed keywords, statements using H2-specific functions (FILE_READ for reading local files, CSVWRITE for writing files, and CREATE ALIAS for defining Java-backed procedures) are accepted as long as they also mention an allowed token, and RUNSCRIPT then evaluates them with full database-engine privileges. This is CWE-94 (Improper Control of Generation of Code), i.e. code injection into an interpreter - here the H2 SQL engine rather than a traditional shell. The escalation to OS command execution relies on H2's file primitives to drop attacker-controlled startup files into a user-site Python location, then causing the application's bundled Python interpreter to load those startup files, which runs system commands as the JVM service account. The fix is an upstream code change: the linked commit d06d3cabaf5b8a7dcd0dbfc584828d8e687e5dd5 and pull request 6796 accompany release v2.13.2, although the visible portion of that commit also contains unrelated Batik/SVG external-resource hardening, so the exact validation rewrite is not fully observable from the provided diff. The vulnerability is configuration- and privilege-gated: the assessed vector carries PR:H and the prerequisites include an authenticated administrator account, the default embedded H2 backend, and security mode enabled.
Know when Python 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:H/UI:N/S:C/C:H/I:H/A:H
Network-reachable admin endpoint (AV:N/AC:L/PR:H as it needs administrator auth); breakout from the app to OS command execution justifies S:C with full C/I/A impact.
Primary rating from Vendor (github).
CVSS VectorVendor: github
Lifecycle Timeline
2DescriptionCVE.org
Stirling-PDF is a locally hosted web application that facilitates various operations on PDF files. Prior to 2.13.2, an authenticated administrator using the default H2 database and security mode can upload a crafted SQL file to POST /api/v1/database/import-database. DatabaseService.validateSqlContent() splits normalized input on semicolons and accepts a statement when it contains any allowed keyword, allowing dangerous H2 functions such as FILE_READ and CSVWRITE, plus CREATE ALIAS, to bypass the insufficient whitelist and execute side effects when RUNSCRIPT processes the file. This permits arbitrary file access. The demonstrated operating-system command execution chain writes attacker-controlled startup files to a user-site location and then triggers an application Python interpreter configured to load those startup files, resulting in command execution as the JVM service account. This issue is fixed in version 2.13.2.
Articles & Coverage 1
Technical POC Analysis
CWE-94: Code Injection.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
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
Code injection occurs when an application accepts user input and passes it directly into a language interpreter or evaluator without proper sanitization.
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
EUVD-2026-101594
NVD
CVE.org
EPSS
Vulnrichment
GitHub
Exploit-DB