
CVE-2026-43512 (Apache Tomcat Digest Authentication Bypass) के लिए शोषण क्षमता PoC
शोषणक्षमता विश्लेषण परिणाम: मूल कारण की पुष्टि हो गई है। अंत-से-अंत शोषण एक मानक
UserDatabaseRealmतैनाती के विरुद्ध प्रतिलिपि योग्य नहीं है। विवरण के लिए विश्लेषण देखें।
CVE-2026-43512, Apache Tomcat के HTTP DIGEST प्रमाणीकरण तंत्र में एक भेद्यता है। विधि RealmBase.getDigest() A1 हैश इनपुट बनाने से पहले getPassword(username) के वापसी मान को मान्य नहीं करती है। जब कॉन्फ़िगर किए गए Realm में कोई उपयोगकर्ता नाम मौजूद नहीं होता है, तो getPassword() लौटाता है, जिसे Java का स्ट्रिंग संयोजन ऑपरेटर चार-अक्षर वाले शाब्दिक में मूक रूप से परिवर्तित कर देता है।
null"null"इसलिए सर्वर गणना करता है:
A1 = MD5("<username>:<realm>:null")
एक क्लाइंट जो शाब्दिक स्ट्रिंग "null" को पासवर्ड के रूप में उपयोग करके गणना की गई DIGEST प्रतिक्रिया प्रस्तुत करता है, एक समान हैश उत्पन्न करता है। सलाहकार के अनुसार, यह एक प्रमाणीकरण बायपास का गठन करता है।
इस भंडार में एक न्यूनतम प्रतिलिपि योग्य वातावरण और एक Go-आधारित प्रूफ ऑफ कॉन्सेप्ट शामिल है ताकि एक वास्तविक Tomcat इंस्टेंस के विरुद्ध उस दावे को सत्यापित किया जा सके।
| प्रभावित श्रेणी | में स्थिर |
|---|---|
| 7.0.0 – 7.0.109 | 7.0.110 |
| 8.5.0 – 8.5.100 | 8.5.101 |
| 9.0.0.M1 – 9.0.117 | 9.0.118 |
| 10.1.0.M1 – 10.1.54 | 10.1.55 |
| 11.0.0.M1 – 11.0.21 | 11.0.22 |
RealmBase.java (सभी प्रभावित शाखाओं) में भेद्य कोड पथ:
// RealmBase.java — भेद्य
protected String getDigest(String username, String realmName, String algorithm) {
if (hasMessageDigest(algorithm)) {
return getPassword(username); // अज्ञात उपयोगकर्ताओं के लिए null लौटाता है
}
// null को Java द्वारा शाब्दिक "null" के रूप में जोड़ा जाता है
String a1 = username + ":" + realmName + ":" + getPassword(username);
return HexUtils.toHexString(
ConcurrentMessageDigest.digest(algorithm, a1.getBytes(...))
);
}
सुधार (commit 6565a6c) एक स्पष्ट null गार्ड जोड़ता है:
// RealmBase.java — पैच किया गया
protected String getDigest(String username, String realmName, String algorithm) {
String password = getPassword(username);
if (password == null) {
return null;
}
...
}
Tomcat 11.0.0-M1 पर FINE-स्तरीय लॉगिंग सक्षम के साथ PoC चलाने से निम्नलिखित पता चलता है:
Digest: 2388e2c78407def640f37f092a8d3a84 ← क्लाइंट
Server digest: 2388e2c78407def640f37f092a8d3a84 ← सर्वर
Failed to authenticate user [ghost]
डाइजेस्ट हैश मेल खाते हैं। getDigest() में बग वास्तविक है और पुष्टि की गई है। हालाँकि, प्रमाणीकरण अभी भी विफल होता है क्योंकि RealmBase.authenticate() में एक दूसरी, स्वतंत्र जाँच है:
// RealmBase.authenticate()
if (serverDigest.equals(clientDigest)) {
return getPrincipal(username); // गैर-मौजूद उपयोगकर्ताओं के लिए null लौटाता है
}
return null;
tomcat-users.xml द्वारा समर्थित एक मानक UserDatabaseRealm में, getPrincipal() इन-मेमोरी उपयोगकर्ता डेटाबेस के विरुद्ध एक लुकअप करता है। उस डेटाबेस में मौजूद नहीं होने वाले उपयोगकर्ता नाम के लिए, यह null लौटाता है। कॉलर एक null Principal को प्रमाणीकरण विफलता मानता है और 401 जारी करता है।
cve-2026-43512-poc/
├── Dockerfile # Tomcat 11.0.0-M1 (प्रभावित संस्करण)
├── tomcat-users.xml # न्यूनतम Realm कॉन्फ़िग — कोई उपयोगकर्ता "ghost" नहीं
├── web.xml
├── exploit/
│ ├── exploit.go # PoC — Go, केवल stdlib
│ └── go.mod
└── README.md
| उपकरण | संस्करण | टिप्पणियाँ |
|---|---|---|
| Podman | ≥ 4.0 | Docker भी काम करता है |
| Go | ≥ 1.22 | केवल स्थानीय रूप से शोषण चलाने के लिए |
podman build -t tomcat-cve-2026-43512 .
podman run -d --name tomcat-vuln -p 8080:8080 tomcat-cve-2026-43512
Tomcat के प्रारंभ होने तक कुछ सेकंड प्रतीक्षा करें, फिर सत्यापित करें कि यह चालू है:
curl -si http://localhost:8080/protected/secret.html | head -1
# अपेक्षित: HTTP/1.1 401
cd exploit
go run exploit.go \
-target http://localhost:8080 \
-path /protected/secret.html \
-username ghost
उपलब्ध फ़्लैग:
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
-target | http://localhost:8080 | Tomcat आधार URL |
-path | /protected/ | संरक्षित संसाधन का पथ |
-username | ghost | उपयोग करने के लिए उपयोगकर्ता नाम — tomcat-users.xml में मौजूद नहीं होना चाहिए |
आंतरिक प्रमाणीकरण स्थिति देखने के लिए, एक logging.properties फ़ाइल जोड़ें और इसे माउंट करें:
org.apache.catalina.authenticator.level = FINE
org.apache.catalina.realm.level = FINE
podman run -d --name tomcat-vuln -p 8080:8080 \
-v ./logging.properties:/usr/local/tomcat/conf/logging.properties:ro \
tomcat-cve-2026-43512
लॉग सीधे डाइजेस्ट तुलना परिणाम दिखाएगा, पुष्टि करेगा कि हैश मेल खाते हैं या नहीं।
podman stop tomcat-vuln && podman rm tomcat-vuln
============================================================
CVE-2026-43512 — Tomcat DIGEST Auth Bypass PoC
============================================================
Target : http://localhost:8080/protected/secret.html
Username : "ghost" (must NOT exist in tomcat-users.xml)
Password : "null" (literal string)
------------------------------------------------------------
[1] Sending unauthenticated request to obtain DIGEST challenge...
[+] HTTP 401 received — DIGEST challenge:
Digest realm="UserDatabase", qop="auth", nonce="...", opaque="..."
[*] realm="UserDatabase" nonce="..." qop="auth" algorithm="MD5"
[2] Computing DIGEST response with password="null"...
Digest username="ghost", realm="UserDatabase", ...
[3] Sending request with crafted DIGEST credentials...
------------------------------------------------------------
[✗] HTTP 401 — exploit failed.
The UserDatabaseRealm provides a second line of defence:
getPrincipal("ghost") returned null after the digest matched.
============================================================
| संसाधन | लिंक |
|---|---|
| Apache Tomcat सुरक्षा सलाहकार | https://tomcat.apache.org/security-9.html |
| फिक्स कमिट | https://github.com/apache/tomcat/commit/6565a6cb6499e56fe2f34457cec99f9d1c4f39e9 |
RealmBase.java (मुख्य) | https://github.com/apache/tomcat/blob/main/java/org/apache/catalina/realm/RealmBase.java |
| RFC 2617 — HTTP डाइजेस्ट प्रमाणीकरण | https://datatracker.ietf.org/doc/html/rfc2617 |
| पूर्ण विश्लेषण — ब्लॉग पोस्ट | https://return-zero.dev/posts/cve-2026-43512 |
यह भंडार केवल शैक्षिक उद्देश्यों और स्थानीय शोषणक्षमता विश्लेषण के लिए है। सभी परीक्षण एक स्व-होस्टेड कंटेनर वातावरण के विरुद्ध किए गए थे। इस PoC को उन प्रणालियों के विरुद्ध न चलाएँ जिनके आप स्वामी नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित प्राधिकरण नहीं है।