Stored cross-site scripting in unstructured HTML generation
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- Required
- Attack complexity
- Low
- Impact type
- Cross-site scripting
- Confidentiality · integrity · availability
- Low · Low · None
- Fix status
- Fixed
Attack profile from CVSS 3.1 · CNA. Fix status from CNA and GitHub. Impact type from CWE-79.
Summary
The unstructured library before 0.24.1 does not escape HTML generated from untrusted documents or reject unsafe URL schemes. An unauthenticated remote attacker can submit a crafted document that keeps event-handler attributes, attribute breakout markup and javascript: links in the generated HTML. When a user such as a document reviewer opens that HTML, attacker script runs in the viewer's origin (CWE-79).
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
Description from the CNA
The unstructured library provides open-source components for ingesting and pre-processing images and text documents, such as PDFs, HTML, Word docs, and many more. Prior to 0.24.1, partition_html(html_parser_version="v2") and the VLM partitioner can preserve untrusted document tags, attributes, text, and link targets in metadata.text_as_html, while elements_to_html() emits the result as an HTML document. The to_html() path in unstructured/documents/ontology.py does not escape output or reject unsafe URL schemes, allowing event-handler attributes, attribute breakout markup, and javascript: links to survive parsing. When the generated HTML or text_as_html is rendered in a browser, attacker-controlled script can execute in the viewer's origin, including in document-ingestion workflows where a privileged reviewer opens submitted content. This issue is fixed in version 0.24.1.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- Poc
- Automatable
- No
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| Unstructured-IO | unstructured | before 0.24.1 | 0.24.1 | Patch available | CNA |
| — | unstructured (PyPI) | before 0.24.1 | 0.24.1 | Patch available | GHSA-v5mq-3xhg-98m9 |
- unstructured VendorUnstructured-IO Affected before 0.24.1 Fixed in 0.24.1 Patch available CNA
- unstructured (PyPI) Vendor— Affected before 0.24.1 Fixed in 0.24.1 Patch available GHSA-v5mq-3xhg-98m9
Remediation
Upgrade the unstructured package to version 0.24.1, which the sources list as the fixed version in both the Unstructured-IO and PyPI entries.
Written with Claude Haiku 5.5 from the sources below · 2026-11-06
- Fix · CNA unstructured (Unstructured-IO) Fixed in 0.24.1
- Fix · GHSA-v5mq-3xhg-98m9 unstructured (PyPI) Fixed in 0.24.1 Advisory →
Vendor assessments
Timeline
- 2026-10-13 Threatist record created from CVE-2026-104250
- 2026-10-14 CISA SSVC decision points changed
- 2026-10-16 Alias added: GHSA-v5mq-3xhg-98m9
- 2026-10-16 Fix available: PyPI/[email protected] · GHSA-v5mq-3xhg-98m9
- 2026-10-16 CVSS score added · GHSA-v5mq-3xhg-98m9
- 2026-10-16 Weakness changed · GHSA-v5mq-3xhg-98m9
- 2026-10-16 6 new references · GHSA-v5mq-3xhg-98m9
- 2026-11-06 Affected versions changed · Red Hat
- 2026-11-06 CVSS score added · Red Hat
References
Other 5
- https://github.com/Unstructured-IO/unstructured/security/advisories/GHSA-v5mq-3xhg-98m9
- https://github.com/Unstructured-IO/unstructured/pull/4394
- https://github.com/Unstructured-IO/unstructured/commit/cda16b3f2170019be9c6ea5635946fb3eaa2d66f
- https://github.com/Unstructured-IO/unstructured/releases/tag/0.24.1
- https://github.com/Unstructured-IO/unstructured
More Unstructured-IO vulnerabilities
- TI-2026-50050 unstructured: Server-Side Request Forgery in the URL-based partitioning CVSS 3.1CRITICAL 9.3
Sources
- CVE-2026-104250 · CVE Program
- CVE-2026-104250 · NVD
- FIRST EPSS
- GHSA-v5mq-3xhg-98m9 · GitHub Advisory Database · CC BY 4.0
- CVE-2026-104250 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences