{"id":"CVE-2026-118694","kind":"vulnerability","aliases":["CVE-2026-118694"],"related":[],"title":"python-markdown2: unclosed link syntax lets remote users exhaust CPU","description":"python-markdown2 through 2.5.5 contains a denial of service vulnerability that allows remote users to exhaust CPU by submitting Markdown with unclosed inline link destinations. Attackers can submit repeated '[a](' or '![a](' sequences, causing _find_balanced to rescan the remaining document for each link and consume quadratic CPU time.","summary":"python-markdown2 through 2.5.5 rescans the rest of the document for each unclosed inline link, so crafted Markdown with repeated '[a](' or '![a](' takes quadratic CPU time. A remote user who can submit Markdown can make the process spend the CPU and stall other requests.","severity":"high","cvss":8.7,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["markdown","package","python","self-hosted"],"not_affected_if":["no-untrusted-markdown","not-using-markdown2"],"how_to_check":"- Run `pip show markdown2` or `python -c \"import markdown2; print(markdown2.__version__)\"` and compare against `2.5.5`\n- Check whether user-submitted Markdown is rendered with markdown2 on any public endpoint","fix":"- Upgrade python-markdown2 to a release later than `2.5.5` (exact fixed version unknown from the sources)\n- Until upgraded, limit the size of submitted Markdown and apply request timeouts on rendering endpoints","status":"open","published_at":"2026-10-28T22:17:13+00:00","first_seen_at":"2026-10-28T22:35:34+00:00","triaged_at":"2026-10-28T22:36:36+00:00","updated_at":"2026-10-28T22:36:36+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-10-28T22:36:36Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade python-markdown2 to a release later than `2.5.5` (exact fixed version unknown from the sources)\n- Until upgraded, limit the size of submitted Markdown and apply request timeouts on rendering endpoints","reach":"internet","title":"python-markdown2: unclosed link syntax lets remote users exhaust CPU","impact":"low","summary":"python-markdown2 through 2.5.5 rescans the rest of the document for each unclosed inline link, so crafted Markdown with repeated '[a](' or '![a](' takes quadratic CPU time. A remote user who can submit Markdown can make the process spend the CPU and stall other requests.","category":"package","nicknames":[],"who_cares":["python","markdown","self-hosted"],"confidence":0.6,"needs_auth":"unknown","worst_case":"Remote CPU exhaustion stalls the service and starves other requests","analyst_note":"Confirm the first fixed version of python-markdown2 and whether any endpoint or default setting exposes the parser to untrusted input, using the NVD entry.","how_to_check":"- Run `pip show markdown2` or `python -c \"import markdown2; print(markdown2.__version__)\"` and compare against `2.5.5`\n- Check whether user-submitted Markdown is rendered with markdown2 on any public endpoint","needs_analyst":true,"not_affected_if":["no-untrusted-markdown","not-using-markdown2"],"who_is_affected":"Applications that pass untrusted user Markdown to python-markdown2 with the default parser are exposed, because any remote submitter can trigger the slow path. Services that render only trusted or internal Markdown, or that do not use markdown2, can skip it.","user_interaction":"no","needs_special_setup":"unknown","severity_if_unknown":"high"},"cost_usd":0.000648,"input_tokens":3340,"output_tokens":628,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-118694':14A,17A '-2026':13A,16A '2.5.5':28B,74C 'allow':82C 'attack':96C 'balanc':106C 'caus':104C 'consum':116C 'contain':75C 'cpu':11A,50B,65B,87C,118C 'craft':41B 'cve':12A,15A 'denial':77C 'destin':95C 'document':34B,111C 'exhaust':10A,86C 'find':105C 'host':23B 'inlin':38B,93C 'let':7A 'link':5A,39B,94C,114C 'make':60B 'markdown':18B,42B,58B,90C 'markdown2':3A,26B,72C 'packag':19B 'process':62B 'python':2A,20B,25B,71C 'python-markdown2':1A,24B,70C 'quadrat':49B,117C 'remain':110C 'remot':8A,53B,83C 'repeat':44B,99C 'request':69B 'rescan':29B,108C 'rest':31B 'self':22B 'self-host':21B 'sequenc':103C 'servic':79C 'spend':63B 'stall':67B 'submit':57B,89C,98C 'syntax':6A 'take':48B 'time':51B,119C 'unclos':4A,37B,92C 'user':9A,54B,84C 'vulner':80C","nicknames":[],"mitigations":[],"who_affected":"Applications that pass untrusted user Markdown to python-markdown2 with the default parser are exposed, because any remote submitter can trigger the slow path. Services that render only trusted or internal Markdown, or that do not use markdown2, can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-28T22:17:13+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"disclosure@vulncheck.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-118694","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-118694","severity":null,"published_at":"2026-10-28T22:17:13+00:00","modified_at":"2026-10-28T22:17:13+00:00","first_seen_at":"2026-10-28T22:35:34+00:00","fetched_at":"2026-10-28T22:35:34+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"}