{"id":"GHSA-xg43-5579-qw6v","summary":"adawolfa/isdoc: Uncontrolled resource consumption (decompression bomb) when reading untrusted ISDOCX or PDF files","details":"### Impact\n\n`adawolfa/isdoc` reads ISDOC invoices from ISDOCX (ZIP) archives and from PDF files with embedded ISDOC documents and supplements. Affected versions inflate ZIP entries and read embedded files **without validating their uncompressed size**, so a small crafted file can amplify into gigabytes:\n\n- **ISDOCX decompression bomb** — `getFromName()` inflates the ISDOC document and binary supplements with no size cap.\n- **`saveTo()` disk-fill** — the supplement copy loop writes inflated bytes to disk with no running byte budget, so a bomb can exhaust disk even if the central-directory size is under-reported.\n- **PDF embedded files** — an embedded file whose declared `Length` is enormous is read and digested with no upper bound.\n\nExploitation requires the application to parse an attacker-supplied `.isdocx` or `.pdf` (the typical use is generating files or parsing files from trusted vendors, so a user must be induced to process a malicious file). When that happens the process can be driven to exhaust memory or disk, causing denial of service. There is **no confidentiality or integrity impact** — availability only.\n\n### Patches\n\nFixed in **1.4.3**, **1.5.1**, **1.6.1** and **2.0.0**. The readers now:\n\n- read the uncompressed size from the ZIP central directory (`statName()`) and reject entries over a cap **before inflating** — 256 KB (`DocumentSizeLimit`) for the ISDOC document, 32 MB (`SizeLimit`) for supplements;\n- enforce a running byte budget in `saveTo()` and unlink the partial file on overflow;\n- reject PDF-embedded files whose declared `Length` exceeds 256 MB before reading or digesting them.\n\nNew exceptions `ReaderException::zipEntryTooLarge()`, `SupplementException::supplementTooLarge()` and `ReaderException::pdfSupplementTooLarge()` surface the rejection.\n\n### Unsupported versions\n\nVersions **before 1.4.0** (the 1.0–1.3 lines) are also affected and will **not** receive a fix, because they target end-of-life PHP. Users on those lines should upgrade to a maintained release — 1.4.3, 1.5.1, 1.6.1, or 2.0.0.\n\n### Workarounds\n\nNo code-level workaround exists in affected versions; upgrading is the fix. As mitigation, restrict parsing to trusted input, or enforce an external size / decompression limit (validate ZIP entry sizes, cap process memory) before handing files to the library.\n\n### Resources\n\n- Decompression-bomb fix: commit [`935fb2a`](https://github.com/adawolfa/isdoc/commit/935fb2aa41ceddfcf43174a61a36ec620611a105) (backported, released as 1.4.3 / 1.5.1 / 1.6.1) and [`02a1012`](https://github.com/adawolfa/isdoc/commit/02a10123a3d5fd92950b8e4952959317c0a18952) (master, released as 2.0.0).\n- CWE-409 (Improper Handling of Highly Compressed Data), CWE-400 (Uncontrolled Resource Consumption).","modified":"2026-09-10T03:51:12.659972463Z","published":"2026-07-15T23:30:55Z","database_specific":{"cwe_ids":["CWE-400","CWE-409"],"severity":"MODERATE","github_reviewed":true,"github_reviewed_at":"2026-07-15T23:30:55Z","nvd_published_at":null},"references":[{"type":"WEB","url":"https://github.com/adawolfa/isdoc/security/advisories/GHSA-xg43-5579-qw6v"},{"type":"WEB","url":"https://github.com/adawolfa/isdoc/commit/02a10123a3d5fd92950b8e4952959317c0a18952"},{"type":"WEB","url":"https://github.com/adawolfa/isdoc/commit/935fb2aa41ceddfcf43174a61a36ec620611a105"},{"type":"PACKAGE","url":"https://github.com/adawolfa/isdoc"}],"affected":[{"package":{"name":"adawolfa/isdoc","ecosystem":"Packagist","purl":"pkg:composer/adawolfa/isdoc"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.6.0"},{"fixed":"1.6.1"}]}],"versions":["1.6.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/07/GHSA-xg43-5579-qw6v/GHSA-xg43-5579-qw6v.json"}},{"package":{"name":"adawolfa/isdoc","ecosystem":"Packagist","purl":"pkg:composer/adawolfa/isdoc"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.5.0"},{"fixed":"1.5.1"}]}],"versions":["1.5.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/07/GHSA-xg43-5579-qw6v/GHSA-xg43-5579-qw6v.json"}},{"package":{"name":"adawolfa/isdoc","ecosystem":"Packagist","purl":"pkg:composer/adawolfa/isdoc"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"1.4.0"},{"fixed":"1.4.3"}]}],"versions":["1.4.0","1.4.1","1.4.2"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/07/GHSA-xg43-5579-qw6v/GHSA-xg43-5579-qw6v.json"}},{"package":{"name":"adawolfa/isdoc","ecosystem":"Packagist","purl":"pkg:composer/adawolfa/isdoc"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["1.0.0","1.0.1","1.0.10","1.0.2","1.0.3","1.0.4","1.0.5","1.0.6","1.0.7","1.0.8","1.0.9","1.1.0","1.1.1","1.1.2","1.1.3","1.2.0","1.2.1","1.2.2","1.2.3","1.2.4","1.2.5","1.2.6","1.2.7","1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3.5","1.3.6","1.3.7","1.4.0","1.4.1","1.4.2","1.4.3","1.4.4","1.5.0","1.5.1","1.5.2","1.6.0","1.6.1","1.6.2","2.0.0","2.0.1"],"database_specific":{"last_known_affected_version_range":"\u003c 1.4.0","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/07/GHSA-xg43-5579-qw6v/GHSA-xg43-5579-qw6v.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H"}]}