CVE-2025-69534
High · 7.5CVSS
7.5
EPSS
0.6%
Published
Mar 5, 2026
CISA due date
—
Cloudanix analysis
A flaw in a common Markdown-rendering component can let someone crash affected websites or automation jobs by submitting specially crafted text.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Python-Markdown 3.8 can pass malformed HTML-like input to Python's html.parser.HTMLParser in a way that triggers an unhandled AssertionError during Markdown parsing. Because the exception is not caught by Python-Markdown, the calling application may terminate the request handler, worker process, rendering job, or pipeline step. The primary impact is availability loss for any service that renders attacker-controlled Markdown; secondary information disclosure may occur if uncaught exception details, stack traces, request content, or internal paths are returned to users or captured in exposed logs.
Why it matters to the business
Public or semi-public features that accept Markdown, such as comments, issue descriptions, knowledge bases, documentation portals, wikis, support systems, or CI/CD documentation jobs, can be crashed by a remote unauthenticated user if they parse untrusted Markdown with the affected library. This can cause service disruption, failed builds, degraded content-rendering workflows, and potential leakage of diagnostic details if error handling exposes stack traces. Although it is not currently listed in CISA KEV and has low EPSS, the vulnerability is easy to trigger where exposed because it requires only crafted input and no authentication or user interaction.
How an attack unfolds
An attacker identifies an application endpoint or automated workflow that accepts Markdown and renders it using Python-Markdown 3.8. The attacker submits a specially malformed HTML-like sequence inside Markdown content. During parsing, Python-Markdown delegates handling of the HTML-like sequence to html.parser.HTMLParser, which raises an AssertionError. Because the library version does not handle that exception safely, the error propagates into the hosting application. Depending on the application architecture, this may crash a worker, fail a request, terminate a rendering job, or repeatedly disrupt a service if the malicious Markdown is stored and re-rendered. If the application exposes debug output or verbose error responses, the same failure path may reveal stack traces, installed package paths, framework details, or snippets of submitted content.
How to fix it
Upgrade Python-Markdown to version 3.8.1 or later wherever Markdown content may be processed. If package pinning is used, replace pins for Markdown/Python-Markdown 3.8 with a fixed release and rebuild application images, virtual environments, serverless bundles, CI/CD runner images, and documentation tooling containers. If immediate upgrade is not possible, reduce exposure by disabling Markdown rendering for unauthenticated input, rejecting or sanitizing raw HTML-like constructs before parsing, wrapping Markdown rendering calls in exception handling that catches AssertionError and other parser exceptions, and returning generic errors without stack traces. Stored Markdown content should be considered a persistence vector: remove or quarantine known crashing content after patching request paths.
How to confirm the fix worked
Confirm dependency inventories, lockfiles, container images, and runtime environments no longer include Python-Markdown 3.8 and instead use 3.8.1 or later. Validate with package-manager checks such as `python -m pip show Markdown`, `pip freeze`, Poetry/Pipenv lock inspection, SBOM scans, and container image scans. Exercise Markdown-rendering entry points with malformed HTML-like input in a non-production test environment and confirm the service handles failures gracefully without crashing workers or exposing stack traces. Review application configuration to ensure debug mode and verbose exception pages are disabled in production. For stored-content systems, confirm previously submitted Markdown cannot repeatedly trigger rendering failures after the upgrade.
Typical attack path
- Find an exposed feature, API, form, repository workflow, or documentation pipeline that accepts Markdown input.
- Submit or store Markdown containing malformed HTML-like syntax designed to trigger the parser assertion failure.
- Cause the application or job to parse the malicious Markdown using Python-Markdown 3.8.
- Trigger an unhandled AssertionError during parsing.
- Repeat requests or rely on stored malicious content being re-rendered to cause ongoing denial of service.
- Inspect any verbose error responses or exposed logs for stack traces, filesystem paths, package versions, or other diagnostic information.
How to detect it
Look for evidence of exploitation in application, web server, API gateway, WAF, container, process supervisor, and CI/CD job logs around Markdown rendering endpoints or documentation build steps. Key signs include repeated HTTP 500 responses after Markdown submissions, application worker restarts, failed documentation-rendering jobs, and Python stack traces showing AssertionError during Markdown parsing. Search logs for exceptions involving the `markdown` package, `html.parser`, `HTMLParser`, and `AssertionError`, particularly when correlated with POST, PUT, PATCH, comment, issue, wiki, README, documentation, or content-rendering routes. In stored-content platforms, review recently created or edited Markdown records or files that caused rendering failures. For forensic triage, correlate source IPs, user agents, request bodies if retained, WAF events, and crash/restart timestamps. There are no public threat actors or KEV exploitation records provided for this vulnerability, so detection should focus on behavioral crash indicators and parser exception artifacts rather than known campaign infrastructure.
- AssertionError
- html.parser.HTMLParser
- HTMLParser
- markdown
- Markdown 3.8
- Traceback (most recent call last)
- 500 Internal Server Error
- worker exited
- worker timeout
- segmentation not expected; AssertionError
- python -m pip show Markdown
- /site-packages/markdown/
- /site-packages/markdown/__init__.py
- /usr/lib/python
- /usr/local/lib/python
- render Markdown
- markdown parsing
- Markdown rendering failed
What your security team should do
- Inventory all applications, documentation systems, CI/CD jobs, and services that use the Python-Markdown package, especially where Markdown input is accepted from unauthenticated or low-trust users.
- Prioritize upgrading Python-Markdown 3.8 to 3.8.1 or later on internet-facing and multi-tenant Markdown-rendering services.
- Rebuild and redeploy containers, virtual environments, build images, and serverless artifacts that bundle the vulnerable dependency.
- Add defensive exception handling around Markdown rendering so parser failures return safe errors rather than crashing workers or exposing stack traces.
- Disable verbose production error pages and ensure logs containing stack traces are not publicly accessible.
- Search historical logs for parser AssertionError events and spikes in 500 responses on Markdown-rendering endpoints.
- If malicious stored Markdown is found, remove or sanitize it to prevent recurring crashes when content is viewed or indexed.
- Add dependency monitoring or SCA policy checks to block reintroduction of Python-Markdown 3.8.
The record
Python-Markdown version 3.8 contain a vulnerability where malformed HTML-like sequences can cause html.parser.HTMLParser to raise an unhandled AssertionError during Markdown parsing. Because Python-Markdown does not catch this exception, any application that processes attacker-controlled Markdown may crash. This enables remote, unauthenticated Denial of Service in web applications, documentation systems, CI/CD pipelines, and any service that renders untrusted Markdown. The issue was acknowledged by the vendor and fixed in version 3.8.1. This issue causes a remote Denial of Service in any application parsing untrusted Markdown, and can lead to Information Disclosure through uncaught exceptions.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| PyPI | markdown | 0 | 3.8.1 |
| Chainguard | awx | 0 | 24.6.1-r30 |
| Chainguard | superset-5.0 | 0 | 5.0.0-r20 |
| Chainguard | superset-6.0 | 0 | 6.0.0-r4 |
| Wolfi | superset-5.0 | 0 | 5.0.0-r20 |
| Wolfi | superset-6.0 | 0 | 6.0.0-r4 |
| openSUSE:Leap 15.6 | python-Markdown | 0 | 3.5.2-150600.3.3.1 |
Related vulnerabilities
- CVE-2026-34519 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-34518 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-34520 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-34514 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-34517 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-34515 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-22815 AIOHTTP is an asynchronous HTTP client/server framework for asyncio and Python. Also affects awx
- CVE-2026-25645 Requests is a HTTP library. Also affects awx