Repository navigation
Update docling to v2.131.0 [SECURITY] - #9
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
requested review from
a team,
gabemontero,
maysunfaisal and
thepetk
as code owners
September 8, 2026 14:52
renovate
Bot
force-pushed
the
renovate/pypi-docling-vulnerability
branch
from
September 19, 2026 15:10
4e4006c to
35a4116
Compare
renovate
Bot
force-pushed
the
renovate/pypi-docling-vulnerability
branch
from
September 27, 2026 20:15
35a4116 to
d9afbce
Compare
renovate
Bot
force-pushed
the
renovate/pypi-docling-vulnerability
branch
from
October 15, 2026 00:46
d9afbce to
684d6e5
Compare
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
renovate
Bot
force-pushed
the
renovate/pypi-docling-vulnerability
branch
from
October 17, 2026 03:41
684d6e5 to
7128338
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
2.66.0→2.131.0Docling: Unsafe Zip Extraction in EasyOCR Model Download
CVE-2026-44017 / GHSA-cjqg-rq2h-2fvj
More information
Details
Impact
In versions
< 2.91.0, The EasyOCR model download functionality extracted ZIP archives without validating member paths, enabling Zip Slip attacks. If an attacker could compromise the model download source (via supply chain attack, DNS spoofing, or MITM), they could write arbitrary files to any location writable by the process, potentially achieving:Patches
Fixed in version 2.91.0. The extraction process now validates each archive member path using
os.path.realpath()to ensure it remains within the target directory, raising aSecurityErrorfor any path traversal attempts.Workarounds
Ensure model downloads occur over secure, authenticated channels. Use integrity verification (checksums) for downloaded models. Run the application with minimal file system permissions.
References
Severity
CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling: Unsafe Archive Extraction and XML Parsing in METS-GBS Backend
CVE-2026-44018 / GHSA-r3xg-rg9j-67fv
More information
Details
Impact
The METS-GBS backend's XML parsing and the input document format detection lacked security controls, enabling:
An attacker could craft malicious METS-GBS archives that, when processed, could read sensitive files, exhaust system resources, or cause application crashes.
Patches
Fixed in version 2.91.0. The fix implements:
resolve_entities=False,load_dtd=False, andno_network=True_detect_mets_gbs()method: maximum file size (10 MB per file), maximum member count (1000 members), and exception handling to gracefully fail when limits are exceededWorkarounds
Avoid processing METS-GBS archives from untrusted sources. If necessary, pre-validate archives in an isolated environment with resource limits.
References
Severity
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling: Unsafe XML Entity Expansion in USPTO Patent Backend
CVE-2026-44020 / GHSA-m88r-rg27-5xfg
More information
Details
Impact
The USPTO patent XML parser used the standard
xml.sax.parseString()without protection against XML External Entity (XXE) attacks. An attacker could craft malicious USPTO patent XML files with external entity references that could:The vulnerability affects three USPTO patent format parsers: ICE (v4.x), Grant v2.5, and Application v1.x.
Patches
Fixed in version 2.74.0. The parser now uses
defusedxml.sax.make_parser()with secure configuration that blocks external entity resolution (feature_external_ges=False,feature_external_pes=False) while allowing DTD declarations required by USPTO files. This prevents XXE attacks while maintaining compatibility with the USPTO XML format.Workarounds
Avoid processing USPTO patent XML files from untrusted sources. Implement resource limits (memory, CPU time) when processing patent documents.
References
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling: Unsafe URI and Path Handling in HTML Backend
CVE-2026-47214 / GHSA-q29v-xc37-wh5m
More information
Details
Impact
The HTML backend did not perform sufficient validation during resource handling:
file://URIs enabling local file system access whenenable_local_fetch=True../sequences and absolute pathsenable_remote_fetch=Truedata:URIsPatches
Fixed in versions 2.91.0 (initial fixes) and 2.94.0 (additional improvements). The fixes implement:
enable_local_fetch=True(default: False) and containment within configuredbase_pathfor path traversal protectionfile://scheme stripped & treated as local path (above)Workarounds
Keep both
enable_local_fetch=Falseandenable_remote_fetch=False(defaults) when processing untrusted HTML documents.References
Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:LReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling imports plugin entry points before the allow_external_plugins check
CVE-2026-105745 / GHSA-9jxx-vjrv-h2rq
More information
Details
Summary
allow_external_plugins=False(the default, and the CLI default) is meant to restrict docling to its own model plugins. However, docling's plugin factories call pluggy'sload_setuptools_entrypoints(), which imports every module registered under docling's plugin entry-point group. Only afterwards does docling filter out modules outside thedocling.namespace. Import-time code in any installed third-party plugin therefore runs even though external plugins are disabled.Details
In
docling/models/factories/base_factory.py,load_from_plugins()loads all entry points first and applies theallow_external_pluginscheck only to the already-imported modules. The CLI creates these factories when it starts, so runningdoclingimports every registered plugin module. A log message says the plugin "will not be loaded", although its module has already been imported.Affected configurations
Environments in which a package registering a docling plugin entry point is installed, for example an unvetted or compromised dependency, and which rely on
allow_external_plugins=Falseto keep that code from running.Impact
Execution of a third-party plugin module's import-time code in the docling process, contrary to the documented behaviour of
allow_external_plugins=False.Patches
Fixed in docling 2.131.0 by #4413. Plugin entry points are now filtered by module name before they are loaded, so with
allow_external_plugins=Falsethird-party plugin modules are no longer imported.Workarounds
Upgrade to 2.131.0. For older versions:
Only install trusted packages in environments that run docling. Check which packages register docling plugin entry points with
importlib.metadata.entry_points().Severity
CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling: Crafted DoclingDocument JSON embeds local image files into converted output
CVE-2026-105748 / GHSA-p944-4xh2-x776
More information
Details
Summary
docling accepts serialized
DoclingDocumentJSON as an input format (InputFormat.JSON_DOCLING, enabled by default). A crafted JSON file can set a picture's imageurito a local file path. When the converted document is exported with embedded images (ImageRefMode.EMBEDDED, the CLI default for Markdown and HTML), the referenced file is read and embedded as base64 in the output.Details
docling/backend/json/docling_json_backend.pyvalidates the JSON into aDoclingDocumentwithout checking image references. The file is then read by docling-core:DoclingDocument._with_embedded_picturesopensfile://and plain-path URIs with PIL.ImageRef.pil_imagechecksallow_image_file_uriforfile://URIs but not for plainPathvalues. docling's picture enrichment models load images through this property.Only files that PIL can decode as an image are disclosed. Other files, such as text files or keys, fail to decode and are not embedded. The different error behaviour does reveal whether a path exists.
Impact
Disclosure of image files readable by the converting process (for example other users' uploads or page images in a shared service), and disclosure of whether a local path exists.
Proof of concept
docling poc.json --to mdembeds the referenced PNG as base64 inpoc.md.Patches
Fixed in docling 2.131.0 by #4417. The Docling JSON backend now drops image references that point at local files (paths,
file:URIs and any scheme other thandata:andhttp(s)) and logs a warning. Callers that need to load local images from JSON they trust can opt in withDoclingJSONFormatOption(backend_options=DeclarativeBackendOptions(enable_local_fetch=True)); the CLI has no such option.Code that loads untrusted JSON directly with docling-core (
DoclingDocument.load_from_json) and exports it with embedded images is not covered by this fix; that part is tracked in docling-core.Workarounds
Upgrade to 2.131.0. For older versions:
InputFormat.JSON_DOCLINGfromallowed_formatswhen converting untrusted input.ImageRefMode.PLACEHOLDERorImageRefMode.REFERENCEDinstead ofEMBEDDED.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:N/A:NReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Docling: Unbounded table rowspan/colspan in HTML, JATS, ODS and BoxNote backends causes CPU/memory exhaustion
CVE-2026-105749 / GHSA-cgc7-9qp3-86m3
More information
Details
Summary
The HTML, JATS, ODS (OpenDocument spreadsheet) and BoxNote backends accept table
rowspan/colspanvalues without an upper bound. A few bytes of input, such as<td rowspan="100000000">, make docling run loops proportional to the declared span and allocate a table grid of the declared size. The result is CPU and memory exhaustion.Details
docling/backend/html_backend.py(_get_cell_spans) parses span attributes with no upper limit. The cell-filling loop then iteratesrow_span × col_spantimes.docling/backend/jats_backend.pyanddocling/backend/boxnote_backend.pyfill their tables the same way.export_to_markdown()) materialises the full grid throughTableData.gridin docling-core.document_timeoutdoes not bound this. It is checked between pipeline stages, and these backends convert the whole document in a single call.max_file_sizeandmax_num_pagesdo not help because the payload is tiny.Measured on 2.130.0: a 54-byte HTML file with
rowspan="1e8"takes about 4.4 s of CPU, and the time grows linearly with the value. A 52-byte file withcolspan="3000000"takes about 23 s and reaches 4.5 GB peak memory during Markdown export.Impact
Denial of service of the converting process from a very small input document. Confidentiality and integrity are not affected.
Proof of concept
Patches
Fixed in docling 2.131.0 by #4414. Table spans are clamped to the HTML limits (colspan 1000, rowspan 65534) and to the actual size of the table in the HTML, JATS, BoxNote and OpenDocument spreadsheet backends, so conversion time and memory grow with the real table only.
Workarounds
Upgrade to 2.131.0. For older versions:
Run conversions of untrusted documents in a separate process with memory and CPU-time limits, or restrict
allowed_formatsto formats that are not affected.Severity
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:HReferences
This data is provided by the GitHub Advisory Database (CC-BY 4.0).
Release Notes
docling-project/docling (docling)
v2.131.0Compare Source
Feature
9da6935).key) support (#4330) (87c6ea0)Fix
b93af46)152f9ba)2b2fb85)ebae65c)0f443b3)c5b4429)19e4519)04e9b04)d4bb776)e478006)7d6d0c4)98d78ef)e2f942e)68732ff)d453bb0)ec3dc7c)20f474b)c14c373)6167240)\ ([#​4375](https://redirect.github.com/docling-project/docling/issues/4375)) ([bf734d1`](bf734d1))e100e6d)fc8a093)8060f3f)2682193)62594ff)1d28495)4d37c64)2d5c590)25ad1d5)7928e30)dcea997)7e361ab)54a6ca4)61fe339)804e806)cc32d17)fc4aa7f)Documentation
eb17f57)e207804)3d4c553)v2.130.0Compare Source
Feature
9a2c3e7)Fix
35c6af5)878831c)52e52fd)7748f6e)b078ea3)1b40928)d6d9da0)54c7cf2)244042a)4141a99)df6b341)dd05464)14789f2)1c2dbec)891de07)8e37971)8522eb7)abca4be)557f0fa)Documentation
6e22317)490fa64)v2.129.0Compare Source
Feature
0e6c2ca)e689393)Fix
a83926c)815f34a)6cb036c)ddf05ff)3b5f61c)2b6a7ff)cea4b45)629440e)1ceca30)e80fa80)d4fa979)b5cfca0)Documentation
52137a1)56a041a)v2.128.0Compare Source
Feature
1cdae27)01b5738)ca0ecd4)Fix
7fe1b3c)77ab16d)b322564)e8c6092)1aec03f)Documentation
bbdaeda)v2.127.0Compare Source
Feature
5ea6490)7e05ed6)be443e8)3d33038)9a2d947)Fix
5ef4f92)5eef82b)1c46705)78caf0a)636c9d5)c35bb02)82e6361)3682b16)ff764c2)97f73ef)c34fa4d)025b27c)Documentation
2d5560e)6bfab1c)6ee68fd)v2.126.0Compare Source
Feature
1c96dd3)cf38d90)554b10a)Fix
a4e9462)b2d333e)cb39dc1)1c2b794)63d1808)v2.125.0Compare Source
Feature
9876e73)Fix
d6a6de4)70eb711)a72a3c1)c09ddfa)Configuration
📅 Schedule: (in timezone America/Toronto)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.