Skip to main content

pypdf CVE-2026-102994

| EUVDEUVD-2026-90366 HIGH
Uncontrolled Resource Consumption (CWE-400)
2026-09-30 GitHub_M GHSA-5jq2-8x83-x246
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 unterminated object-ID/generation token
  2. Delivery
    Submit file to pypdf-backed service
  3. Exploit
    read_until_whitespace scans excessive input
  4. Execution
    Worker CPU/time exhaustion
  5. Impact
    Application unavailability

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 host application to parse an attacker-supplied PDF with pypdf before version 6.18.0; the malicious file must contain an indirect-object identifier or generation-number token that continues for a long stretch without whitespace, triggering unbounded scanning in read_until_whitespace. No authentication or user interaction is needed at the library level (PR:N/UI:N), but practical exploitation is limited to deployments that accept and automatically process untrusted PDFs (e.g., upload/ingestion services). The impact is confined to availability (worker hang / long runtime); there is no path to code execution or data disclosure.

Impact

This is a genuine but bounded risk: a CWE-400 uncontrolled-resource-consumption (algorithmic/parsing) flaw whose only impact is availability. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H, score 8.7) is internally consistent with the description - no privileges, no interaction, and VA:H with VC:N/VI:N correctly captures a DoS-only outcome with no confidentiality or integrity loss. The 8.7 score is high purely because availability loss is weighted heavily under 4.0 for a trivially triggerable network-reachable condition; it does NOT indicate code execution or data exposure. No EPSS score, no CISA KEV listing, and no public exploit were provided, so exploitation status is 'no public exploit identified at time of analysis' - though the fix PR/commit and GHSA advisory publicly describe the exact trigger (long unterminated indirect-object ID or generation-number tokens), lowering the barrier to weaponization. The 'network' attack vector is nominal for a library: exploitation requires the host application to feed pypdf an attacker-controlled PDF, so real risk concentrates in services that accept and parse untrusted PDF uploads. Overall this is a moderate-priority hardening fix, not an emergency - a high CVSS score driven by DoS weighting rather than by active exploitation or severe technical impact.

Exploit ScenarioDerived

An attacker uploads a crafted PDF to a web service or pipeline that uses pypdf (<6.18.0) to parse or extract content. The file contains an indirect-object identifier or generation-number token that runs for a very long stretch without whitespace, causing read_until_whitespace to scan excessive input and consume CPU/time, hanging the worker and denying service. No public exploit is identified, but the GHSA advisory and fix commit publicly describe the exact 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

Denial of service in pypdf versions prior to 6.18.0 allows remote, unauthenticated attackers to stall PDF parsing by supplying a crafted file whose indirect-object identifier or generation-number token continues for an excessive length without a whitespace delimiter. The parser's read_until_whitespace helper in pypdf/_utils.py scans unbounded input, so the consuming process hangs or runs for an extremely long time, making any service that parses untrusted PDFs unavailable (CVSS 4.0 8.7, availability-only; assessed CVSS 3.1 8.0 AV:N/AC:L/PR:N/UI:N/A:H). Impact is confined to availability - there is no path to code execution or data disclosure - and no public exploit code or confirmed active exploitation was identified at time of analysis. A vendor-released fix is available in pypdf 6.18.0.

RemediationAI

Upgrade to the vendor-released patched version, pypdf 6.18.0 (https://github.com/py-pdf/pypdf/releases/tag/6.18.0), which caps indirect-object and generation-number tokens at 64 bytes via IndirectObject._MAXIMUM_PART_LENGTH, threads max_bytes through read_until_whitespace, and raises LimitReachedError in strict mode; verify the pin across all transitive dependencies and rebuild any bundled/offline copies, since the fix is only in the 6.18.0 line and older pins will silently remain vulnerable. If immediate upgrade is impossible, the effective compensating control is isolation rather than input filtering: run PDF parsing in a separate short-lived process with a hard wall-clock timeout and CPU/memory rlimits (for example multiprocessing with a join timeout, or a container with cgroup CPU quota), so a pathological token kills only that worker and never the parent service - the trade-off is that legitimate large/complex PDFs may be prematurely terminated, so timeouts must be tuned to your document corpus. Do not rely on upload size limits alone: the malicious token can be small enough to pass typical size caps, and truncating or pre-scanning PDFs with a fixed byte-length tokenizer is a fragile workaround that may corrupt valid documents. If strict parsing is not desired, note that the upstream non-strict path only logs a warning and truncates the token, which prevents the hang but can cause malformed objects to be misparsed; enabling strict parsing (self.strict) gives deterministic rejection at the cost of failing on sloppy but benign files. There is no authentication or privilege prerequisite to mitigate, because the trigger occurs while parsing, so exposure reduction (refusing untrusted PDFs, quarantining uploads, rate-limiting ingestion endpoints) is only a secondary control and should be paired with worker isolation and the 6.18.0 upgrade.

Affected VersionsENISA

pypdf < 6.18.0

Affected Packages

pypi pypdf fix: 6.18.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

The flaw is a CWE-400 uncontrolled resource consumption (algorithmic parsing) issue in the pure-Python PDF library pypdf (CPE cpe:2.3:a:py-pdf:pypdf:*:*:*:*:*:*:*:*). PDF indirect objects are written as a sequence of an object number, a generation number, and the keyword 'R' - for example '12 0 R' - and pypdf reads those numeric tokens with the read_until_whitespace helper, which historically looped byte-by-byte with an unlimited max_bytes. A document that presents a token of arbitrary length without any intervening whitespace therefore forces the library to consume CPU and memory proportional to the crafted input, both in IndirectObject.read_from_stream in pypdf/generic/_base.py and in the object-header and xref-rebuild paths (read_object_header and _rebuild_xref_table) of pypdf/_reader.py. The upstream fix (PR #4055, commit 82501d2) introduces a per-token cap of 64 bytes (IndirectObject._MAXIMUM_PART_LENGTH), threads a max_bytes parameter through read_until_whitespace, and adds a strict mode that raises LimitReachedError instead of silently truncating; it also converts the subsequent int() conversion errors (ValueError/OverflowError) into a clean ValueError and, importantly, re-raises LimitReachedError from the xref-recovery handler so the broad exception recovery in _rebuild_xref_table cannot swallow the token-length limit. This is a library-level flaw: the library itself does not accept input, so real-world exposure depends entirely on whether the host application parses attacker-controlled PDFs.

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

Library parses a network-delivered crafted PDF with no auth or interaction for a service that auto-processes uploads (AV:N/PR:N/UI:N); impact is purely resource-exhaustion DoS, so C:N/I:N/A:H.

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 7.5 HIGH

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:57 cve.org
HIGH 8.7

DescriptionCVE.org

pypdf is a free and open-source pure-python PDF library. Prior to 6.18.0, a crafted PDF containing indirect-object identifiers or generation-number tokens that continue for a long time without whitespace can cause pypdf/_reader.py and pypdf/generic/_base.py to scan excessive input through read_until_whitespace, resulting in long runtimes and application unavailability. This issue is fixed in version 6.18.0.

Blast Radius

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

Ecosystem-wide dependent count for version 6.18.0.

Technical POC Analysis

Evidence note: the advisory text and CVE description are supplied; no runnable PoC and no patch diff are present in the evidence.

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, the Python PDF-parsing library embedded in many document intake and processing pipelines, is affected by an unauthenticated denial-of-service flaw in which a single malformed PDF can indefinitely stall the parsing process. Impact is confined to availability - there is no path to code execution or data disclosure - so this is a service-continuity risk rather than a breach risk. Leadership should care because any customer-facing or internal workflow that parses untrusted PDFs (claims, invoicing, onboarding, document conversion) could be hung or knocked offline by a trivially crafted file, and recovery typically requires restarting stuck workers.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.5%
Top 58% exploitable
Prevalence
High
one of the most widely used pure-Python PDF libraries in Python ecosystems
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
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
Yes
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-102993 HIGH
8.7 Sep 30

Memory-exhaustion denial of service in pypdf versions prior to 6.17.0 allows remote attackers to inflate application mem

Vendor StatusVendor

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