{"id":"GHSA-rw7v-4hrq-x6r9","summary":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","details":"## Summary\n\n`fpdf2` implicitly dereferences image resource references supplied to rendering APIs. If an application passes untrusted HTML, SVG, template data, or image paths into those APIs, `fpdf2` may issue outbound HTTP(S) requests or attempt to open local filesystem paths.\n\nThis behavior is relevant in applications that render untrusted or user-provided input without sanitizing or restricting embedded resource references.\n\n## Description\n\nIn affected versions, `fpdf2` uses a shared internal image-loading mechanism for multiple features. This loader:\n\n* fetches `http://` and `https://` URLs over the network\n* opens other string values as local filesystem paths\n\nDuring document processing, resource references embedded in input content are automatically dereferenced using this mechanism.\n\nThis behavior is reachable through:\n\n* `FPDF.image()`\n* `FPDF.write_html()` via HTML `\u003cimg src=\"...\"\u003e`\n* `FPDF.image()` when rendering SVG files containing `\u003cimage href=\"...\"\u003e` or `xlink:href=\"...\"\u003e`\n* template image elements that forward values into `FPDF.image()`\n\nIf an application renders attacker-controlled input through these APIs, that input can cause:\n\n* outbound HTTP(S) requests to attacker-chosen destinations\n* local file open attempts for attacker-chosen paths\n\nThis may enable Server-Side Request Forgery (SSRF) in applications that render untrusted content.\n\nLocal file access impact is limited: the library attempts to open the referenced path, but successful embedding depends on the target being a valid and supported image or SVG resource.\n\n`file://` URLs are not specially handled; raw filesystem paths such as `/path/to/file` or `../../file.png` are the relevant local-path cases.\n\n## Impact\n\nThis issue affects applications that render untrusted or partially trusted content using `fpdf2`.\n\nApplications may be impacted if they:\n\n* pass untrusted HTML into `write_html()`\n* render untrusted SVG with embedded `\u003cimage\u003e` references\n* pass user-controlled strings into `image()`\n* allow untrusted template definitions or template field values to control image paths\n\nPotential impacts include:\n\n* outbound requests to internal or external network services\n* limited local file access attempts depending on file type and parsing success (limited to content that fpdf2 recognizes as a supported image or SVG resource)\n\nThe severity depends on how `fpdf2` is integrated and whether untrusted input is allowed to control resource references.\n\n**Example scenarios**\n\nHTML:\n```python\npdf.write_html('\u003cimg src=\"http://127.0.0.1:8000/internal.png\"\u003e')\n```\n\nSVG:\n```xml\n\u003cimage href=\"http://169.254.169.254/latest/meta-data/\" /\u003e\n```\n\nDirect image path:\n```python\npdf.image(\"../../.env\")\n```\n\n**Workarounds**\n\nApplications can mitigate this by:\n\n- not rendering untrusted HTML, SVG, or template content\n- rejecting user-controlled `src` / `href` / image-path values\n- mapping resources through an application-defined allowlist\n- converting user-supplied images to trusted in-memory objects before passing them to `fpdf2`\n\n**Credits**\n\n- @kule500 for identifying SSRF via HTML \u003cimg\u003e handling\n- @BudongJW for identifying SVG \u003cimage\u003e resource loading as an additional vector\n- @redyank for analysis of the shared image loading mechanism\n- @manop55555 for identifying a DNS rebinding bypass in the initial REMOTE_PUBLIC implementation","aliases":["CVE-2026-114609"],"modified":"2026-10-27T15:00:04.995148902Z","published":"2026-10-27T14:43:16Z","database_specific":{"severity":"MODERATE","github_reviewed":true,"github_reviewed_at":"2026-10-27T14:43:16Z","nvd_published_at":"2026-10-22T18:17:28Z","cwe_ids":["CWE-918"]},"references":[{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/security/advisories/GHSA-rw7v-4hrq-x6r9"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-114609"},{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/pull/1824"},{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/pull/1857"},{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/commit/0d27190a8c907e02ebe9cd881471a14d0622b432"},{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/commit/6e23f610b7946e96e9a5dd0535dcbfbe7ac1397d"},{"type":"PACKAGE","url":"https://github.com/py-pdf/fpdf2"},{"type":"WEB","url":"https://github.com/py-pdf/fpdf2/releases/tag/2.8.8"}],"affected":[{"package":{"name":"fpdf2","ecosystem":"PyPI","purl":"pkg:pypi/fpdf2"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.8.8"}]}],"versions":["2.0.0","2.0.1","2.0.3","2.0.4","2.0.5","2.0.6","2.1.0","2.1.0rc1","2.2.0","2.2.0rc1","2.2.0rc2","2.2.0rc3","2.3.0","2.3.1","2.3.2","2.3.3","2.3.4","2.3.5","2.4.0","2.4.1","2.4.2","2.4.3","2.4.4","2.4.5","2.4.6","2.5.0","2.5.1","2.5.2","2.5.3","2.5.4","2.5.5","2.5.6","2.5.7","2.6.0","2.6.1","2.7.0","2.7.1","2.7.2","2.7.3","2.7.4","2.7.5","2.7.6","2.7.7","2.7.8","2.7.9","2.8.1","2.8.2","2.8.3","2.8.4","2.8.5","2.8.6","2.8.7"],"database_specific":{"last_known_affected_version_range":"\u003c= 2.8.7","source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/10/GHSA-rw7v-4hrq-x6r9/GHSA-rw7v-4hrq-x6r9.json"}}],"schema_version":"1.9.2","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N"}]}