Skip to main content

Stirling-PDF EUVDEUVD-2026-101594

| CVE-2026-85714 CRITICAL
Code Injection (CWE-94)
2026-10-14 security-advisories@github.com
9.1
CVSS 3.1 · Vendor: github
View

Attack ChainAIDerived

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

  1. Recon
    Authenticate as administrator
  2. Delivery
    Upload crafted SQL to import-database endpoint
  3. Exploit
    Bypass validateSqlContent keyword whitelist
  4. Install
    RUNSCRIPT executes H2 FILE_READ/CSVWRITE/CREATE ALIAS
  5. C2
    Write startup files to user-site location
  6. Execute
    Trigger application Python interpreter to load them
  7. Impact
    Command 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.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.6% exploitation probability (EPSS)

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

Alert me

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

Stirling-PDF < 2.13.2

Affected Packages

euvd stirling_pdf fix: 2.13.2

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

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

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.

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

Primary rating from Vendor (github).

CVSS VectorVendor: github

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

Lifecycle Timeline

2
Patch available
Oct 14, 2026 - 20:34 EUVD
CVE Published
Oct 14, 2026 - 19:42 cve.org
CRITICAL 9.1

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

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

EPSS Score
0.6%
Top 51% exploitable
Prevalence
Medium
popular self-hosted PDF web app, common in homelab but limited enterprise footprint
Data Quality
6 sources
Confidence: High

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 CRITICAL
CISA KEV No
Public POC No
EPSS 0.6%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
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
Total

Priority Score

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

Attack Technique

Code Injection CRITICAL

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.

More in Python

View all
CVE-2025-24016 CRITICAL POC
9.9 Feb 10

Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t

CVE-2025-27520 CRITICAL POC
9.8 Apr 04

BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser

CVE-2025-2945 CRITICAL POC
9.9 Apr 03

pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi

CVE-2013-5093 MEDIUM POC
6.8 Sep 27

The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python

CVE-2025-32375 CRITICAL POC
9.8 Apr 09

BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica

CVE-2014-0224 HIGH POC
7.4 Jun 05

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

CVE-2024-21644 HIGH POC
7.5 Jan 08

pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.

CVE-2026-33017 CRITICAL POC
9.3 Mar 17

Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301

CVE-2017-9462 HIGH POC
8.8 Jun 06

In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse

CVE-2026-49869 CRITICAL POC
10.0 Jun 26

Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to

CVE-2026-39987 CRITICAL POC
9.3 Apr 08

Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/

CVE-2024-21645 MEDIUM POC
5.3 Jan 08

pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne

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