CVE-2026-22690
NoneCVSS
—
EPSS
0.4%
Published
Jan 10, 2026
CISA due date
—
Cloudanix analysis
A malformed PDF can make affected document-processing software spend too long trying to read it, potentially slowing or disrupting services that handle uploaded files.
- Exploitation
- Requires User Interaction
- Attacker needs
- User Interaction
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
The flaw is an algorithmic denial-of-service condition in pypdf's non-strict PDF parsing path before version 6.6.0. A malformed PDF trailer that omits the required /Root entry but declares an artificially large /Size value can cause the reader to spend excessive time attempting to resolve objects in an invalid file. The issue does not provide code execution, data disclosure, or privilege escalation by itself; its impact is resource exhaustion, long processing times, worker starvation, request timeouts, and degraded availability in services that parse untrusted PDFs using affected pypdf versions in non-strict mode.
Why it matters to the business
Systems that accept or process user-supplied PDFs can be slowed or made unavailable by specially crafted invalid documents. This can disrupt document ingestion, case processing, billing, reporting, e-signature, archive, or content-extraction workflows that depend on PDF parsing. The EPSS score is low and there is no known CISA KEV listing or ransomware association, so broad opportunistic exploitation is not currently indicated; however, the vulnerability is easy to trigger anywhere untrusted PDFs are processed and can still be operationally disruptive, especially in queues or synchronous upload paths.
How an attack unfolds
An attacker identifies an application, API, batch job, or background worker that accepts PDF uploads or fetches PDFs from external sources and processes them with a vulnerable pypdf release in non-strict mode. The attacker creates an invalid PDF whose trailer has no /Root object but includes a very large /Size value. When the application attempts to read the file, pypdf follows the affected parsing path and spends an excessive amount of time trying to handle object references for a file that should be rejected quickly. Repeated submissions can tie up web workers, task queue consumers, or CPU resources, leading to delayed processing, timeouts, autoscaling cost increases, or service degradation. Exploitation does not require authentication if PDF ingestion is exposed anonymously; otherwise it requires whatever access is needed to submit PDFs to the affected workflow.
How to fix it
Upgrade pypdf to version 6.6.0 or later. If tracking the upstream Git repository directly, use a version that includes commit 10df9c72fa7fb9ab14101b9cb911d66e680282a8 or later. For Debian-packaged inetutils entries provided in the advisory data, use the fixed package versions where applicable: Debian 11 fixed in 2:2.0-1+deb11u2, Debian 12 fixed in 2:2.4-2+deb12u1, and Debian 13 fixed in 2:2.4-3. In addition to upgrading, apply defensive controls around PDF processing: enforce file size limits, use parser execution timeouts, process documents in isolated workers, limit queue concurrency per sender or tenant, reject structurally invalid PDFs early when possible, prefer strict parsing where compatible, and rate-limit unauthenticated or high-volume PDF submissions.
How to confirm the fix worked
Confirm the installed pypdf version is 6.6.0 or later using package inventory, dependency lock files, container image scans, or runtime checks such as Python package metadata. Review application code for use of pypdf PdfReader or equivalent parsing paths with strict=False, since the vulnerable behavior is associated with non-strict reading mode. Test a staging environment with malformed PDFs that lack a trailer /Root and contain large /Size values and verify they are rejected quickly, time out safely, or fail without tying up workers. Validate that document-processing services enforce maximum file size, maximum processing duration, worker isolation, and retry limits. For Debian systems listed in the advisory data, verify the installed package versions meet or exceed the fixed versions stated in the remediation guidance.
Typical attack path
- Find a service or workflow that parses user-controlled PDF files using pypdf before 6.6.0.
- Confirm that malformed PDFs are accepted far enough to reach the pypdf parsing layer.
- Craft an invalid PDF trailer that omits /Root while declaring an unusually large /Size value.
- Submit the malformed PDF through an upload form, API endpoint, email ingestion route, document-processing queue, or other PDF intake channel.
- Trigger pypdf's non-strict reader path and cause long runtimes while the parser attempts to process the invalid structure.
- Repeat or parallelize submissions to exhaust parser workers, increase queue depth, or cause user-facing timeouts.
How to detect it
Look for evidence of unusually slow or failed PDF parsing jobs after receipt of malformed PDFs. Relevant sources include application upload logs, API gateway and web server access logs, background job or task queue logs, worker stdout/stderr, Python exception traces, container metrics, EDR process telemetry, object storage access logs for uploaded PDFs, and APM traces for document-processing endpoints. Indicators include repeated PDF submissions from the same source, small or oddly structured PDFs that cause disproportionate CPU time, parser jobs that run until timeout, increased queue depth, worker restarts, and Python stack traces or errors from pypdf while resolving document trailers or root objects. For forensic file review, inspect suspicious PDFs for a trailer dictionary containing an extremely large /Size value and no /Root entry. Because exploitation artifacts are malformed PDF content rather than a stable network payload, detection should combine content inspection, timeout/error telemetry, and source-rate correlation.
- pypdf.errors.PdfReadError
- PdfReadError
- Cannot find Root object
- Root object not found
- /Root object
- pypdf._reader
- strict=False
- trailer
- /Size
- Worker timeout
- TimeoutError
- PDF parsing timed out
- document processing timed out
- queue timeout
- %PDF-
What your security team should do
- Prioritize patching internet-facing or externally fed PDF ingestion services, document-processing APIs, email-to-PDF workflows, and background queues that parse untrusted PDFs with pypdf.
- Upgrade pypdf to 6.6.0 or later and rebuild/redeploy containers, serverless packages, and worker images that vendor or pin the dependency.
- Search dependency manifests and software composition analysis results for pypdf versions earlier than 6.6.0, including transitive dependencies bundled in applications.
- Identify code paths using non-strict parsing mode and change to strict parsing where business functionality allows.
- Add processing timeouts, queue retry caps, per-sender rate limits, and resource isolation for PDF parsing jobs to reduce DoS impact from malformed files.
- Monitor document-processing latency, queue depth, worker CPU saturation, and parser timeout/error rates for spikes associated with malformed PDF submissions.
- Preserve suspicious submitted PDF samples and related request metadata when parser timeouts or excessive runtimes occur to support forensic review.
The record
pypdf is a free and open-source pure-python PDF library. Prior to version 6.6.0, pypdf has possible long runtimes for missing /Root object with large /Size values. An attacker who uses this vulnerability can craft a PDF which leads to possibly long runtimes for actually invalid files. This can be achieved by omitting the /Root entry in the trailer, while using a rather large /Size value. Only the non-strict reading mode is affected. This issue has been patched in version 6.6.0.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | pypdf | 0 | 6.6.0 |
| Chainguard | open-webui | 0 | 0.7.2-r0 |
| Wolfi | open-webui | 0 | 0.7.2-r0 |
| openSUSE:Tumbleweed | python-pypdf | 0 | 6.6.0-1.1 |
Related vulnerabilities
- CVE-2026-28804 pypdf is a free and open-source pure-python PDF library. Also affects pypdf
- GHSA-9m86-7pmv-2852 pypdf vulnerable to inefficient decoding of ASCIIHexDecode streams Also affects pypdf
- CVE-2026-28351 pypdf is a free and open-source pure-python PDF library. Also affects pypdf
- GHSA-x7hp-r3qg-r3cj pypdf: Manipulated FlateDecode XFA streams can exhaust RAM Also affects pypdf
- CVE-2026-27888 pypdf is a free and open-source pure-python PDF library. Also affects pypdf
- GHSA-2rw7-x74f-jg35 pypdf has a possible infinite loop when loading circular /Prev entries in cross-reference… Also affects pypdf
- CVE-2026-27628 pypdf is a free and open-source pure-python PDF library. Also affects pypdf
- CVE-2026-27026 pypdf is a free and open-source pure-python PDF library. Also affects pypdf