{"id":"CVE-2026-47214","kind":"vulnerability","aliases":["CVE-2026-47214","GHSA-q29v-xc37-wh5m"],"related":[],"title":"Docling: Unsafe URI and Path Handling in HTML Backend","description":"### Impact\nThe HTML backend did not perform sufficient validation during resource handling:\n- Accepted `file://` URIs enabling local file system access when `enable_local_fetch=True`\n- Path resolution allowed traversal outside intended directories via `../` sequences and absolute paths\n- Did not block internal network resources under `enable_remote_fetch=True`\n- HTTP redirects were not validated, potentially redirecting to unintended schemes\n- No resource limits for remote image downloads and `data:` URIs\n\n### Patches\nFixed in versions 2.91.0 (initial fixes) and 2.94.0 (additional improvements). The fixes implement:\n- Updated local path treatment: absolute files always blocked, relative paths require `enable_local_fetch=True` (default: False) and containment within configured `base_path` for path traversal protection\n- `file://` scheme stripped & treated as local path (above)\n- IP address validation to prevent SSRF\n- HTTP redirect validation, connection and read timeouts\n- Size limit for both remote images (with streaming download) and base64-decoded data URIs\n\n### Workarounds\nKeep both `enable_local_fetch=False` and `enable_remote_fetch=False` (defaults) when processing untrusted HTML documents.\n\n### References\n- Initial fixes: [v2.91.0](https://github.com/docling-project/docling/releases/tag/v2.91.0)\n- Additional improvements: [v2.94.0](https://github.com/docling-project/docling/releases/tag/v2.94.0)","summary":"Docling's HTML backend mishandled file:// URIs, relative and absolute paths, internal network addresses and redirects when local or remote fetching was enabled. An attacker who can supply an HTML document can read local files or reach internal network resources through the parser.","severity":"high","cvss":7.1,"epss":0.0037299999967217445,"exploited":false,"exploited_at":null,"products":[{"name":"docling","fixed":["2.94.0"],"affected":"< 2.94.0","ecosystem":"pypi"},{"name":"docling","fixed":["2.94.0"],"affected":"< 2.94.0","ecosystem":"vendor"}],"ecosystems":["pypi","vendor"],"tags":["cwe-400","cwe-73","docling","package","python","self-hosted"],"not_affected_if":["default-config","static-export"],"how_to_check":"Run pip show docling and confirm the version is 2.94.0 or later.\nCheck whether enable_local_fetch=True or enable_remote_fetch=True is set in code that parses untrusted HTML.","fix":"Upgrade docling to 2.94.0 or later.\nKeep enable_local_fetch=False and enable_remote_fetch=False when processing untrusted HTML.","status":"open","published_at":"2026-06-03T21:15:02+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","triaged_at":"2026-10-23T21:45:55+00:00","updated_at":"2026-10-23T23:44:52+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-10-23T21:45:55Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade docling to 2.94.0 or later.\nKeep enable_local_fetch=False and enable_remote_fetch=False when processing untrusted HTML.","reach":"network","impact":"medium","summary":"Docling's HTML backend mishandled file:// URIs, relative and absolute paths, internal network addresses and redirects when local or remote fetching was enabled. An attacker who can supply an HTML document can read local files or reach internal network resources through the parser.","category":"package","who_cares":["python","docling","self-hosted"],"confidence":0.8,"needs_auth":"no","worst_case":"Attacker reads local files or probes internal network services through HTML parsing.","analyst_note":"","how_to_check":"Run pip show docling and confirm the version is 2.94.0 or later.\nCheck whether enable_local_fetch=True or enable_remote_fetch=True is set in code that parses untrusted HTML.\nunknown","needs_analyst":false,"not_affected_if":["default-config","static-export"],"user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000518,"input_tokens":3249,"output_tokens":387,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':11A,19A '-400':24B '-47214':12A,20A '-73':26B '/docling-project/docling/releases/tag/v2.91.0)':242C '/docling-project/docling/releases/tag/v2.94.0)':248C '2.91.0':146C '2.94.0':150C 'absolut':41B,109C,160C 'accept':87C 'access':93C 'addit':151C,243C 'address':45B,191C 'allow':101C 'alway':162C 'attack':56B 'backend':9A,36B,78C 'base':177C 'base64':214C 'base64-decoded':213C 'block':113C,163C 'configur':176C 'connect':199C 'contain':174C 'cve':10A,18A 'cwe':23B,25B 'data':140C,216C 'decod':215C 'default':171C,230C 'directori':105C 'docl':1A,27B,33B 'docling':21A,22A 'document':62B,235C 'download':138C,211C 'enabl':54B,89C,95C,118C,167C,221C,226C 'fals':172C,224C,229C 'fetch':52B,97C,120C,169C,223C,228C 'file':66B,91C,161C 'fix':143C,148C,154C,238C 'ghsa':14A 'ghsa-q29v-xc37-wh5m':13A 'github.com':241C,247C 'github.com/docling-project/docling/releases/tag/v2.91.0)':240C 'github.com/docling-project/docling/releases/tag/v2.94.0)':246C 'handl':6A,86C 'host':32B 'html':8A,35B,61B,77C,234C 'http':122C,196C 'imag':137C,208C 'impact':75C 'implement':155C 'improv':152C,244C 'initi':147C,237C 'intend':104C 'intern':43B,69B,114C 'ip':190C 'keep':219C 'limit':134C,204C 'local':49B,65B,90C,96C,157C,168C,187C,222C 'mishandl':37B 'network':44B,70B,115C 'outsid':103C 'packag':28B 'parser':74B 'patch':142C 'path':5A,42B,99C,110C,158C,165C,178C,180C,188C 'perform':81C 'potenti':127C 'prevent':194C 'process':232C 'protect':182C 'python':29B 'q29v':15A 'reach':68B 'read':64B,201C 'redirect':47B,123C,128C,197C 'refer':236C 'relat':39B,164C 'remot':51B,119C,136C,207C,227C 'requir':166C 'resolut':100C 'resourc':71B,85C,116C,133C 'scheme':131C,183C 'self':31B 'self-host':30B 'sequenc':107C 'size':203C 'ssrf':195C 'stream':210C 'strip':184C 'suffici':82C 'suppli':59B 'system':92C 'timeout':202C 'travers':102C,181C 'treat':185C 'treatment':159C 'true':98C,121C,170C 'unintend':130C 'unsaf':2A 'untrust':233C 'updat':156C 'uri':3A,38B,88C,141C,217C 'v2.91.0':239C 'v2.94.0':245C 'valid':83C,126C,192C,198C 'version':145C 'via':106C 'wh5m':17A 'within':175C 'workaround':218C 'xc37':16A","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-06-03T21:15:02+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:L","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-q29v-xc37-wh5m","url":"https://github.com/advisories/GHSA-q29v-xc37-wh5m","severity":"high","published_at":"2026-06-03T21:15:02+00:00","modified_at":"2026-10-19T19:56:43+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","fetched_at":"2026-10-23T19:11:32+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-47214","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-47214","severity":null,"published_at":"2026-06-26T16:16:31+00:00","modified_at":"2026-07-02T14:00:05+00:00","first_seen_at":"2026-10-23T23:44:52+00:00","fetched_at":"2026-10-23T23:44:52+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}