Skip to main content

pypdf EUVDEUVD-2026-90365

| CVE-2026-102993 HIGH
Uncontrolled Resource Consumption (CWE-400)
2026-09-30 GitHub_M GHSA-qv6h-rv94-w285
8.7
CVSS 4.0 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Craft PDF with oversized Roman /St page label
  2. Delivery
    Submit PDF to pypdf-based application
  3. Exploit
    Application retrieves document page labels
  4. Execution
    Roman numeral generator builds huge string
  5. Impact
    Memory exhaustion, application unavailable

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Resource consumption limits
MITRE ATT&CK

1 technique across 1 tactic: Impact

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Exploitation requires the target application to call pypdf's page-label retrieval on an attacker-supplied PDF whose /PageLabels /Nums entry declares a Roman-numeral style (/S /R) with an unusually large /St start value (the fix rejects values above 3,999). The flaw is remote/unauthenticated (AV:N/PR:N/UI:N) with no special product configuration needed, but the practical limiting factor is that the consuming application must actually invoke page-label parsing on untrusted PDFs; applications that never read page labels are unaffected. Affects pypdf versions prior to 6.17.0.

Impact

This is a genuine but bounded risk. The CWE-400 uncontrolled-resource-consumption flaw yields denial-of-service ONLY - the vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N) correctly scores VC:N/VI:N/VA:H, meaning no confidentiality or integrity impact, purely availability. The headline 8.7 (CVSS 4.0 'High') is inflated relative to real-world urgency: CVSS 4.0 weights a network, no-auth, no-interaction availability hit heavily, but the equivalent CVSS 3.1 severity for a pure memory-exhaustion DoS is ~7.5. No EPSS score, no CISA KEV listing, and no standalone public exploit were provided, so there is no evidence of active or automated exploitation - treat this as a patch-in-normal-cycle issue rather than an emergency. One caveat: the fixing PR (#4047) ships reproducer test cases (e.g. /St=5000 with Roman style) that demonstrate the trigger, so a working trigger is effectively public even though no weaponized exploit is catalogued. The network attack vector is real but conditional: exploitation only occurs if the consuming application actually calls pypdf's page-label retrieval on the attacker's PDF, which is application-behavior-dependent, not attacker-controlled.

Exploit ScenarioDerived

An attacker uploads or submits a crafted PDF to a service that uses pypdf and reads document page labels (e.g. a document-processing pipeline, viewer, or metadata extractor). The PDF declares a Roman-numeral page-label style (/S /R) with an extremely large /St start value, causing pypdf's number-to-Roman conversion to build an enormous numeral string and consume large amounts of memory, degrading or crashing the service. No authenticated exploit is catalogued, but the fix PR includes reproducer tests that publicly demonstrate the trigger.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.5% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – Sep 30, 2026

Memory-exhaustion denial of service in pypdf versions prior to 6.17.0 allows remote attackers to inflate application memory usage by supplying a crafted PDF whose /PageLabels /Nums dictionary declares a Roman-numeral numbering style (/S /R) with an extremely large start value (/St), causing the library to construct a numeral string proportional to that value. The CVSS:4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N, VA:H) indicates an unauthenticated, network-reachable, low-complexity attack with high availability impact and no confidentiality or integrity effect, but the practical precondition is that the consuming application must actually invoke pypdf's page-label retrieval on attacker-supplied documents - applications that never read page labels are unaffected. No public exploit code has been identified at time of analysis and there is no CISA KEV entry; the vendor released a fix in 6.17.0 that rejects Roman start values above 3,999.

RemediationAI

Vendor-released patch: 6.17.0 - upgrade pypdf to 6.17.0 or later (pip install --upgrade 'pypdf>=6.17.0') and redeploy, since the fix rejects Roman-numeral start values above 3,999 and logs the malformed /Nums entry instead of allocating; see the advisory at https://github.com/py-pdf/pypdf/security/advisories/GHSA-qv6h-rv94-w285 and release notes at https://github.com/py-pdf/pypdf/releases/tag/6.17.0. If an immediate upgrade is not possible, the highest-value compensating control is to stop passing untrusted PDFs into page-label parsing: avoid calling the page-label retrieval APIs on user-supplied documents, or pre-sanitize documents by walking /PageLabels /Nums and rejecting/removing any label dictionary whose /S is /R (or /r) with an /St greater than 3,999 - the trade-off is that legitimate PDFs using very large Roman start values (rare, since standard Roman notation tops out at 3,999) will show fallback Arabic labels, and sanitization code must be maintained alongside the library. As a second layer, run untrusted-PDF parsing in a process with a hard memory ceiling and timeout (e.g. container memory limits, resource.setrlimit, or a subprocess worker) and catch MemoryError so exhaustion degrades a single request rather than the whole service; the trade-off is that the worker may be OOM-killed instead of failing gracefully, and aggressive caps can break processing of large legitimate documents. Restricting who can submit PDFs to the affected endpoint also reduces exposure but does not address the underlying defect and is not a substitute for the 6.17.0 upgrade.

Affected VersionsENISA

pypdf < 6.17.0

Affected Packages

pypi pypdf fix: 6.17.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in pypi

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

pypdf is a pure-Python PDF reading/writing library, and the affected component is pypdf/_page_labels.py, which parses the PDF /PageLabels number tree. A /PageLabels entry may contain /Nums, an array of (start-index, label-dictionary) pairs; a label dictionary with /S /R requests Roman numerals and an optional /St integer sets the starting value from which labels are counted. Under CWE-400 (Uncontrolled Resource Consumption), the pre-6.17.0 implementation converted the supplied integer directly into a Roman-numeral string, so a large /St value (e.g. 5000 or higher) produced a disproportionately long string, allocating memory each time a label is generated. The upstream fix introduces MAXIMUM_ROMAN_NUMERAL = 3_999 - the largest value representable with standard symbols and subtractive notation, aligned with the AA-Turner/roman-numerals reference implementation - and raises ValueError('Number is out of range.') for anything larger; get_label_from_nums() catches TypeError/ValueError and logs 'Ignoring malformed page label entry in /Nums' rather than propagating the failure. The commit (89db7c4fe9315ecc964bfdf05a4e8c4b94175163, PR 4047) also refactors the numeral generator into a straightforward accumulation loop and switches to string.ascii_uppercase, and adds regression tests asserting the range limit for both uppercase Roman conversion and malformed /Nums handling. Affected installs are identified by CPE cpe:2.3:a:py-pdf:pypdf:*:*:*:*:*:*:*:*, i.e. all pypdf releases before 6.17.0 regardless of platform or Python version.

Know when Pypdf 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_M) PRIMARY 8.7 HIGH
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
vuln.today AI 7.5 HIGH

Remote unauthenticated crafted PDF processed without interaction (AV:N/AC:L/PR:N/UI:N); pure memory-exhaustion DoS so C:N/I:N/A:H with no scope change.

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
None
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
None
Vulnerable system: Availability
High
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

Lifecycle Timeline

2
Patch available
Sep 30, 2026 - 21:04 EUVD
CVE Published
Sep 30, 2026 - 19:55 cve.org
HIGH 8.7

DescriptionCVE.org

pypdf is a free and open-source pure-python PDF library. Prior to 6.17.0, a crafted PDF can provide unusually large Roman page-label values that cause pypdf/_page_labels.py to generate excessively large numeral strings when an application retrieves document page labels, consuming large amounts of memory and potentially making the application unavailable. This issue is fixed in version 6.17.0.

Blast Radius

ecosystem impact
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 2 pypi packages depend on pypdf (2 direct, 0 indirect)

Ecosystem-wide dependent count for version 6.17.0.

Technical POC Analysis

Bug class: uncontrolled resource consumption (CWE-400), with the advisory also tagging CWE-770 (allocation without limits or throttling).

Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.

Executive ViewAI

Why It Matters

pypdf, an open-source PDF parsing library embedded in many document-ingestion, preview, and conversion pipelines, can be forced into memory exhaustion by a single crafted PDF that declares an absurd Roman-numeral page-label start value, letting an unauthenticated remote attacker slow or crash any service that reads page labels from untrusted uploads. This is a pure availability risk to customer-facing upload and batch-processing features, not a data-disclosure or integrity risk, so leadership should care primarily about service downtime, resource-cost spikes, and downstream SLA impact. Only applications that actually invoke pypdf's page-label retrieval on attacker-supplied documents are exposed; PDF workflows that never touch page labels are unaffected.

Business Impact: High
Compensating Controls

Apply vendor patch (upgrade to pypdf 6.17.0 or later); in the interim, disable page-label retrieval on untrusted documents, cap worker memory and request timeouts, and pre-screen or reject oversized and malformed PDFs before parsing.

Threat Intelligence Overview

EPSS Score
0.5%
Top 58% exploitable
Prevalence
High
pypdf is among the most widely used pure-Python PDF libraries
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium
EUVD 🇯🇵JVN NVD CVE.org EPSS Vulnrichment GHSA Vendor GitHub

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 HIGH
CISA KEV No
Public POC No
EPSS 0.5%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.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
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Partial

Priority Score

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

Attack Technique

Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.

More in Pypdf

View all
CVE-2026-84309 MEDIUM POC
6.9 Sep 01

Infinite loop denial of service in pypdf prior to 6.16.0 allows any attacker who can supply a crafted PDF to a pypdf-bas

CVE-2023-36810 MEDIUM POC
6.5 Jun 30

pypdf is a pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files. Rat

CVE-2023-36807 MEDIUM POC
6.5 Jun 30

pypdf is a pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files. Rat

CVE-2023-36464 MEDIUM POC
5.5 Jun 27

pypdf is an open source, pure-python PDF library. Rated medium severity (CVSS 5.5), this vulnerability is no authenticat

CVE-2026-84310 MEDIUM POC
4.8 Sep 01

Resource exhaustion in pypdf prior to 6.16.1 allows an attacker who can supply a crafted PDF to cause denial of service

CVE-2026-103000 HIGH
8.7 Sep 30

Memory exhaustion in pypdf versions prior to 6.19.0 allows a remote, unauthenticated attacker to make an application una

CVE-2026-102999 HIGH
8.7 Sep 30

Denial of service in pypdf versions prior to 6.19.0 allows an unauthenticated remote attacker to pin a PDF-processing wo

CVE-2026-102998 HIGH
8.7 Sep 30

Denial of service in pypdf versions prior to 6.19.0 allows remote, unauthenticated attackers to exhaust application CPU

CVE-2026-102997 HIGH
8.7 Sep 30

Denial of service in pypdf before 6.18.1 lets a crafted PDF drive the library's FlateDecode recovery path into inefficie

CVE-2026-102996 HIGH
8.7 Sep 30

Memory exhaustion in pypdf versions prior to 6.18.1 lets a crafted PDF force the library to allocate and process far mor

CVE-2026-102995 HIGH
8.7 Sep 30

Memory exhaustion in pypdf versions prior to 6.18.1 allows unauthenticated remote attackers to crash or degrade any appl

CVE-2026-102994 HIGH
8.7 Sep 30

Denial of service in pypdf versions prior to 6.18.0 allows remote, unauthenticated attackers to stall PDF parsing by sup

Vendor StatusVendor

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