Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft PDF with oversized choice field options/values
-
DeliverySubmit to PDF-processing service
-
ExploitApp flattens form fields via pypdf
-
ExecutionInvariant glyph work repeats per loop iteration
-
PersistCPU exhaustion and worker hang
-
ImpactApplication 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 | Requires the consuming application to process an attacker-supplied PDF through pypdf's form-field update path with flattening enabled (update_page_form_field_values with flatten=True), and the malicious PDF must contain a choice/form field with a large number of options and selected values so the invariant selection-glyph computation repeats per line. Limiting factors: the vulnerable code path is not reached by merely opening or reading a PDF - the application must explicitly perform field updates with flattening; impact is availability only (no data exposure or code execution); pypdf < 6.19.0 must be in use. |
| Impact | Signals are consistent in pointing to a moderate, availability-only risk. The vendor CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VA:H, base 8.7 'High') describes an unauthenticated, network-reachable algorithmic-complexity DoS with no confidentiality or integrity impact (VC:N/VI:N). No EPSS score, no CISA KEV listing, and no public exploit were provided, so this is 'no public exploit identified at time of analysis' - although the fixing PR (#4087) ships a reproducer test (test_generate_appearance_stream_data__selection__speed with a 10s timeout), so a working trigger is effectively public in the test suite even if not packaged as a standalone exploit. The vendor 8.7 is aggressive for a pure availability bug: the PR:N/UI:N metrics understate a real precondition - the flaw only fires when the CONSUMING application invokes pypdf's form-field update path with flattening enabled on the attacker's PDF, which is application/config-dependent rather than a default-exposed network service. This is best treated as a library-hardening/DoS priority (patch during normal cycles) rather than an emergency: real exploitation requires a document-processing pipeline that both accepts untrusted PDFs and flattens their form fields. No signals conflict beyond the vendor severity being on the high side for a VA-only issue. |
| Exploit ScenarioDerived | An attacker submits a crafted PDF containing a choice form field with a very large number of options and selected values (the reproducer uses ~1000 each) to a service that uses pypdf to fill and flatten form fields. When the application calls update_page_form_field_values(..., flatten=True), pypdf's appearance-stream generator recomputes the invariant selection-to-glyph mapping on every line of the loop, causing near-quadratic runtime that hangs the worker and denies service. No standalone public exploit is published, but the fixing PR includes a timing reproducer that demonstrates the trigger. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 30, 2026
Denial of service in pypdf versions prior to 6.19.0 allows remote, unauthenticated attackers to exhaust application CPU by supplying a crafted PDF whose AcroForm choice field carries a large number of options and selected values; when a consuming application calls update_page_form_field_values with flatten=True, the appearance-stream generator recomputes the same invariant selection-glyph set once per line, driving runtimes up until the host process or worker becomes unavailable. The flaw is rated CVSS 4.0 8.7 (and 3.1 8.1 by independent assessment) with availability-only impact - no confidentiality or integrity loss, and no code execution. Exploitation requires the application to explicitly perform form-field updates with flattening on attacker-controlled input; merely opening, parsing, or reading the PDF does not reach the vulnerable code path. No public exploit code has been identified at time of analysis, and there is no confirmed active exploitation (CISA KEV); the fix ships in upstream release 6.19.0.
RemediationAI
Upgrade to pypdf 6.19.0 or later - the vendor-released patch that fixes this issue (release: https://github.com/py-pdf/pypdf/releases/tag/6.19.0; advisory: https://github.com/py-pdf/pypdf/security/advisories/GHSA-php9-fj8v-98fj; fix PR: https://github.com/py-pdf/pypdf/pull/4087, commit 959467a9b95be83e2dc5ae873ece5f371263ede7). If an immediate upgrade is not possible, the single highest-value compensating control is to stop calling update_page_form_field_values with flatten=True on untrusted, externally submitted PDFs - flattening is only needed when the output must be non-editable, so defer it to a trusted post-processing step or a separate low-privilege worker, at the cost of a two-stage pipeline and extra storage. Second, wrap any pypdf form-fill operation that must handle untrusted input in a hard wall-clock/CPU budget (e.g., SIGALRM or a process-level timeout) inside an isolated, resource-capped worker so a pathological PDF is killed rather than pinning a service thread; the trade-off is that legitimate very large forms may be aborted and need a manual/queued retry path. Third, pre-validate incoming PDFs before processing - reject or quarantine files whose AcroForm choice fields declare an unusually large number of /Opt entries or whose /V array length is disproportionate - accepting some false positives on genuinely large forms. Finally, cap concurrency and per-request queue depth for the PDF-processing service so that even a successful burst cannot consume all available workers; none of these workarounds remove the underlying defect, so patching to 6.19.0 remains the only complete fix.
Affected VersionsENISA
Affected Packages
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
CVE-2026-102998 is an uncontrolled resource consumption issue (CWE-400) in pypdf's appearance-stream generation, specifically in pypdf/generic/_appearance_stream.py. When a PDF's AcroForm contains a choice field (/FT /Ch) with a large /Opt option array and a large /V value array, and the embedding application updates field values with flattening enabled, pypdf regenerates the widget appearance stream to bake the field content into the page. The vulnerable loop builds the stream line by line, and for each line it recomputed the entire selection-glyph mapping via _unicode_to_glyph_id("".join(selection), reverse_cmap) - an invariant per-iteration computation. With N selected values, this makes the loop roughly quadratic and drives CPU time far beyond a tolerable request budget. The upstream fix (PR py-pdf/pypdf#4087, commit 959467a9b95be83e2dc5ae873ece5f371263ede7, released in 6.19.0) hoists that computation out of the loop - computing selection_glyphs once, memoizing it for subsequent line comparisons - and additionally switches the stream accumulator from repeated immutable bytes concatenation to a bytearray with a final bytes() conversion, which removes a second source of quadratic work. The affected product is identified by CPE cpe:2.3:a:py-pdf:pypdf:*:*:*:*:*:*:*:* (all versions before 6.19.0). Because pypdf is a pure-Python library embedded in web services, document pipelines, and batch converters, the practical impact is bounded by how the host application invokes the flattening API - not by the library in isolation.
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
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
Attacker-supplied PDF reaches the flatten path with no auth or interaction (AV:N/PR:N/UI:N), causing CPU-exhaustion DoS only, so A:H with C:N/I:N.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
pypdf is a free and open-source pure-python PDF library. Prior to 6.19.0, a crafted PDF with form field values can cause pypdf/generic/_appearance_stream.py appearance-stream generation to repeat invariant selection-data work inside a loop when an application updates fields with flattening enabled, resulting in excessive runtimes and application unavailability. This issue is fixed in version 6.19.0.
Blast Radius
ecosystem impact- 58 pypi packages depend on pypdf (15 direct, 43 indirect)
Ecosystem-wide dependent count for version 6.19.0.
Technical POC Analysis
Evidence basis: GitHub Security Advisory GHSA-php9-fj8v-98fj (py-pdf/pypdf, published 2026-09-16) plus the supplied summary.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
pypdf versions prior to 6.19.0 expose document-processing services to a high-severity denial-of-service condition that can exhaust CPU and make the affected worker or host unavailable when applications flatten attacker-controlled PDF form fields. Organizations using pypdf in customer-facing or batch document pipelines should care because this can disrupt service availability without risking data confidentiality or integrity. No public exploit identified at time of analysis and no vendor-released patch identified at time of analysis; code-level mitigations and monitoring are required until a fix is available.
No vendor-released patch identified at time of analysis; interim mitigations include disabling update_page_form_field_values with flatten=True for untrusted PDFs, rejecting or quarantining PDFs with excessive AcroForm choice-field options/selected values, enforcing strict CPU/timeout limits and worker isolation, rate limiting, and monitoring for CPU exhaustion.
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
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
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
pypdf is a pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files. Rat
pypdf is a pure-python PDF library capable of splitting, merging, cropping, and transforming the pages of PDF files. Rat
pypdf is an open source, pure-python PDF library. Rated medium severity (CVSS 5.5), this vulnerability is no authenticat
Resource exhaustion in pypdf prior to 6.16.1 allows an attacker who can supply a crafted PDF to cause denial of service
Memory exhaustion in pypdf versions prior to 6.19.0 allows a remote, unauthenticated attacker to make an application una
Denial of service in pypdf versions prior to 6.19.0 allows an unauthenticated remote attacker to pin a PDF-processing wo
Denial of service in pypdf before 6.18.1 lets a crafted PDF drive the library's FlateDecode recovery path into inefficie
Memory exhaustion in pypdf versions prior to 6.18.1 lets a crafted PDF force the library to allocate and process far mor
Memory exhaustion in pypdf versions prior to 6.18.1 allows unauthenticated remote attackers to crash or degrade any appl
Denial of service in pypdf versions prior to 6.18.0 allows remote, unauthenticated attackers to stall PDF parsing by sup
Memory-exhaustion denial of service in pypdf versions prior to 6.17.0 allows remote attackers to inflate application mem
EUVD-2026-90384
GHSA-php9-fj8v-98fj
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB