{"id":"CVE-2026-114609","aliases":["DEBIAN-CVE-2026-114609","EUVD-2026-108261","GHSA-rw7v-4hrq-x6r9","openSUSE-SU-2026:12278-1"],"status":"published","title":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","severity":{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-11","score":0.00252,"percentile":0.16825,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-918"],"published":"2026-10-22T17:18:22Z","modified":"2026-10-30T02:30:59Z","fixes":[{"ecosystem":"PyPI","package":"fpdf2","fixed_in":["2.8.8"],"sources":["ghsa","osv"]},{"ecosystem":"Debian:14","package":"fpdf2","fixed_in":["2.8.8-1"],"sources":["osv"]},{"ecosystem":"openSUSE:Tumbleweed","package":"python-fpdf2","fixed_in":["2.8.9-2.1"],"sources":["osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"fpdf2","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"last_affected":"2.8.7"},{"fixed":"2.8.8"}]}]},{"source":"osv","ecosystem":"Debian:13","package":"fpdf2","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"}]}],"versions":["2.8.3-1","2.8.3-1+deb13u1","2.8.4-1","2.8.4-2","2.8.7-1","2.8.7-2","2.8.8-1","2.8.9-1"]},{"source":"osv","ecosystem":"Debian:14","package":"fpdf2","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.8.8-1"}]}],"versions":["2.8.3-1","2.8.4-1","2.8.4-2","2.8.7-1","2.8.7-2"]},{"source":"osv","ecosystem":"PyPI","package":"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"]},{"source":"osv","ecosystem":"openSUSE:Tumbleweed","package":"python-fpdf2","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.8.9-2.1"}]}]}],"products":[{"vendor":"py-pdf","product":"fpdf2"}],"references":[{"url":"https://github.com/py-pdf/fpdf2/security/advisories/GHSA-rw7v-4hrq-x6r9","tags":["x_refsource_CONFIRM","advisory","web"]},{"url":"https://github.com/py-pdf/fpdf2/pull/1824","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/py-pdf/fpdf2/pull/1857","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/py-pdf/fpdf2/commit/0d27190a8c907e02ebe9cd881471a14d0622b432","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/py-pdf/fpdf2/commit/6e23f610b7946e96e9a5dd0535dcbfbe7ac1397d","tags":["x_refsource_MISC","fix","web"]},{"url":"https://github.com/py-pdf/fpdf2/releases/tag/2.8.8","tags":["x_refsource_MISC","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-114609","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-rw7v-4hrq-x6r9"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/114xxx/CVE-2026-114609.json","tags":["advisory"]},{"url":"https://security-tracker.debian.org/tracker/CVE-2026-114609","tags":["advisory"]},{"url":"https://github.com/py-pdf/fpdf2","tags":["package"]},{"url":"","tags":["advisory"]},{"url":"https://www.suse.com/security/cve/CVE-2026-114609","tags":["web"]}],"sources":{"cve":[{"id":"CVE-2026-114609","title":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","status":"published","published":"2026-10-22T17:18:22.802Z","modified":"2026-10-29T02:19:57.646Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T13:39:50.160666Z"}],"euvd":[{"id":"EUVD-2026-108261","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","status":"published","published":"2026-10-22T17:18:22Z","modified":"2026-10-29T02:19:57Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"updated_at":"2026-11-02T16:59:18.059516Z"}],"ghsa":[{"id":"GHSA-rw7v-4hrq-x6r9","title":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","description":"## 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","status":"published","published":"2026-10-27T14:43:16Z","modified":"2026-10-27T14:43:17Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T14:41:36.858527Z"}],"nvd":[{"id":"CVE-2026-114609","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","status":"published","published":"2026-10-22T18:17:28.06Z","modified":"2026-10-29T04:18:24.41Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T14:13:02.724605Z"}],"osv":[{"id":"CVE-2026-114609","title":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","status":"published","published":"2026-10-22T17:18:22.802Z","modified":"2026-10-30T02:30:59.995660504Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T15:44:56.310988Z"},{"id":"DEBIAN-CVE-2026-114609","description":"fpdf2 is a PDF creation library for Python. Prior to 2.8.8, fpdf2's shared image loader automatically dereferences attacker-controlled HTTP(S) URLs and raw local paths supplied through FPDF.image(), FPDF.write_html() HTML \u003cimg src\u003e values, SVG \u003cimage href\u003e or xlink:href values, and template image fields. This can cause outbound requests to attacker-selected internal or external services and local file open attempts, although local content is exposed only when it is a valid supported image or SVG resource. file:// URLs are not specially handled, so the local-path case requires a raw filesystem path. This issue is fixed in version 2.8.8.","status":"published","published":"2026-10-22T18:17:28.06Z","modified":"2026-10-29T09:47:36.889148235Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"updated_at":"2026-11-02T15:45:50.923612Z"},{"id":"GHSA-rw7v-4hrq-x6r9","title":"fpdf2 implicitly loads external URLs and local image paths when rendering attacker-controlled content","description":"## 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","status":"published","published":"2026-10-27T14:43:16Z","modified":"2026-10-27T15:00:04.995148902Z","cvss":[{"version":"3.1","score":5.8,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:N/A:N","level":"medium"}],"cwes":["CWE-918"],"updated_at":"2026-11-02T15:46:56.281047Z"},{"id":"openSUSE-SU-2026:12278-1","title":"python313-fpdf2-2.8.9-2.1 on GA media","description":"These are all security issues fixed in the python313-fpdf2-2.8.9-2.1 package on the GA media of openSUSE Tumbleweed.","status":"published","published":"2026-10-26T00:00:00Z","modified":"2026-10-27T17:23:18.51150416Z","updated_at":"2026-11-02T16:58:40.245664Z"}]}}
