
डॉकर बेस इमेज जिसमें Undertow 1.4.x में CVE-2025-12543 के लिए होस्ट हेडर सत्यापन सुधार का बैकपोर्ट किया गया है, जो WildFly 11 अनुप्रयोगों की सुरक्षित तैनाती को सक्षम बनाता है।
यह रिपॉजिटरी एक Docker बेस इमेज प्रदान करती है जो WildFly 11.0.0.Final पर बनाई गई है, जिसमें CVE-2025-12543 के लिए एक बैकपोर्टेड फिक्स है, जो Undertow में एक महत्वपूर्ण Host हेडर वैलिडेशन भेद्यता है।
यह इमेज सहकर्मियों को बेस के रूप में प्रदान करने के लिए है। वे इसके ऊपर अपना .war एप्लिकेशन और standalone.xml तैनात कर सकते हैं।
| फ़ील्ड | विवरण |
|---|
| CVE ID | CVE-2025-12543 |
| घटक | io.undertow:undertow-core |
| गंभीरता | क्रिटिकल (CVSS 9.6) |
| प्रभावित संस्करण | सभी संस्करण < 2.2.39 (1.4.x सहित) |
| फिक्स किया गया | Undertow 2.2.39 / 2.3.22 |
| WildFly 11 संस्करण | undertow-core-1.4.18.Final — प्रभावित |
Undertow आने वाले HTTP अनुरोधों में Host हेडर को ठीक से मान्य नहीं करता है। विकृत या दुर्भावनापूर्ण Host हेडर वाले अनुरोधों को अस्वीकार किए बिना संसाधित किया जाता है, जिससे निम्न सक्षम होता है:
अन्य उपयोगकर्ता अभी भी WildFly 11 पर हैं, और अपग्रेड करने के लिए वर्तमान में कोई संसाधन या योजना नहीं है। फिक्स को सीधे Undertow 1.4.18.Final JAR में बैकपोर्ट किया गया था।
.
├── Dockerfile # मुख्य इमेज परिभाषा
├── README.md
├── wildfly-dist-11.0.0.Final.tar.gz # WildFly 11 वितरण संग्रह
├── reports/
│ ├── result-20260401-0230.txt # CVE स्कैन रिपोर्ट जिसने भेद्यता की पहचान की
│ └── wildfly_11.0.0.Final_*.txt # अतिरिक्त स्कैन रिपोर्ट
└── patch/
├── src/
│ ├── HostHeaderHandler.java # बैकपोर्टेड फिक्स — नया हैंडलर वर्ग
│ ├── HttpReadListener_only.java # डिकंपाइल्ड + पैच किया गया HttpReadListener स्रोत (संदर्भ)
│ └── PatchHttpReadListener.java # Javassist बाइटकोड पैचर टूल
├── build.sh # बिल्ड स्क्रिप्ट — स्क्रैच से पैच किया गया JAR पुनर्निर्माण करता है
├── undertow-core-1.4.18.Final.jar # मूल (अपैच) JAR — संदर्भ के लिए रखा गया
└── undertow-core-1.4.18.Final-patched.jar # पैच किया गया JAR इमेज में इंजेक्ट किया गया
Dockerfileअंतिम इमेज बनाता है। यह:
bitnamilegacy/java:1.8.432-7-debian-12-r2 (OpenJDK 1.8.0_432) का उपयोग करता है/opt/jboss/wildfly में निकालता हैundertow-core-1.4.18.Final.jar को पैच किए गए संस्करण से बदलता हैstandalone.sh -b 0.0.0.0 (सभी इंटरफेस से बाइंड) के माध्यम से WildFly शुरू करता हैpatch/undertow-core-1.4.18.Final-patched.jarपैच किया गया Undertow JAR। यह दो परिवर्तनों को छोड़कर मूल के समान है:
io/undertow/server/handlers/HostHeaderHandler.class (और इसके आंतरिक वर्ग)io/undertow/server/protocol/http/HttpReadListener.class — अनुरोध पाइपलाइन में HostHeaderHandler इंजेक्ट करता हैpatch/src/HostHeaderHandler.javaबैकपोर्टेड Host हेडर वैलिडेशन हैंडलर। Undertow PR #1857 (UNDERTOW-2656) से पोर्ट किया गया।
सभी स्थिरांक (IP4_EXACT, IP6_EXACT, वर्ण तालिकाएँ) स्व-निहित हैं — Undertow 2.x में जोड़े गए API पर कोई निर्भरता नहीं। प्रत्येक HTTP अनुरोध पर, यह मान्य करता है:
400 Bad Request के साथ अस्वीकार करता हैpatch/src/PatchHttpReadListener.javaएक-शॉट Javassist बाइटकोड पैचर। यह मूल JAR से HttpReadListener लोड करता है और बदलता है:
// पहले
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// बाद में
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
यह HostHeaderHandler को स्वचालित रूप से प्रत्येक HTTP अनुरोध में इंजेक्ट करता है, बिना HttpReadListener के पूर्ण पुनर्संकलन की आवश्यकता के (जो जटिल आंतरिक वर्गों और xnio आंतरिक पर निर्भर करता है)।
patch/src/HttpReadListener_only.javaUndertow 1.4.18.Final से मूल HttpReadListener का डिकंपाइल्ड स्रोत, जो इंजेक्शन बिंदु का पता लगाने के लिए संदर्भ के रूप में उपयोग किया जाता है। इस स्रोत का पैच किया गया संस्करण भी ऑडिट उद्देश्यों के लिए रखा गया है।
reports/result-20260401-0230.txtCVE स्कैन रिपोर्ट (2026-04-01 को उत्पन्न) जिसने undertow-core-1.4.18.Final में CVE-2025-12543 की पहचान की:
/opt/jboss/wildfly/modules/system/layers/base/io/undertow/core/main/undertow-core-1.4.18.Final.jar
स्कैन रिपोर्ट (result-20260401-0230.txt) ने पुष्टि की कि undertow-core-1.4.18.Final CVE-2025-12543 (CVSS 9.6) से प्रभावित है।
फिक्स Undertow PR #1857 में है, जिसे main (2026-01-09) में मर्ज किया गया और 2.2.x और 2.3.x में बैकपोर्ट किया गया। फिक्स HostHeaderHandler.java जोड़ता है और प्रत्येक अनुरोध पर Host हेडर को मान्य करने के लिए इसे HttpReadListener में वायर करता है।
Undertow 1.4.x → 2.2.x एक प्रमुख संस्करण छलांग है जिसमें ब्रेकिंग API परिवर्तन हैं। WildFly 11 JBoss Modules के माध्यम से Undertow 1.4.x से कसकर जुड़ा हुआ है। सीधे JAR स्वैप से स्टार्टअप पर ClassNotFoundException / NoSuchMethodError होगा।
HostHeaderHandler.java बैकपोर्ट करेंUndertow 1.4.18.Final के साथ संगत HostHeaderHandler.java का एक स्व-निहित संस्करण लिखें:
IP4_EXACT, IP6_EXACT) — 1.4.x NetworkUtils में उपलब्ध नहींexchange.isHostIncludedInRequestURI() को हटाएं — 1.4.x HttpServerExchange में उपलब्ध नहींWildFly इमेज के अंदर Undertow 1.4.18 + xnio क्लासपाथ के विरुद्ध संकलित करें:
javac -cp undertow-core-1.4.18.Final.jar:xnio-api-3.5.4.Final.jar:jboss-logging-3.3.1.Final.jar \
-d out HostHeaderHandler.java
HttpReadListener को पैच करेंइंजेक्शन बिंदु का पता लगाने के लिए Procyon के साथ HttpReadListener को डिकंपाइल करें:
Connectors.executeRootHandler(this.connection.getRootHandler(), httpServerExchange);
handleEventWithNoRunningRequest() में स्थित है।
क्योंकि HttpReadListener में अनाम आंतरिक वर्ग ($1, $2, $3) हैं जिन्हें डिकंपाइल्ड स्रोत से संदर्भित नहीं किया जा सकता है, पूर्ण पुनर्संकलन संभव नहीं है। इसके बजाय, बाइटकोड को सीधे इंस्ट्रूमेंट करने के लिए Javassist (PatchHttpReadListener.java) का उपयोग करें — रूट हैंडलर को HostHeaderHandler.WRAPPER के साथ लपेटने के लिए executeRootHandler कॉल को बदलें।
java -cp javassist.jar:undertow-core-1.4.18.Final.jar:out \
PatchHttpReadListener undertow-core-1.4.18.Final.jar out/
मूल JAR को कॉपी करें और पैच किए गए/नए क्लास फ़ाइलों को इंजेक्ट करें:
cp undertow-core-1.4.18.Final.jar undertow-core-1.4.18.Final-patched.jar
jar uf undertow-core-1.4.18.Final-patched.jar \
-C out io/undertow/server/handlers/HostHeaderHandler.class \
-C out "io/undertow/server/handlers/HostHeaderHandler\$Wrapper.class" \
-C out "io/undertow/server/handlers/HostHeaderHandler\$1.class" \
-C out io/undertow/server/protocol/http/HttpReadListener.class
पैच किए गए JAR के लिए एक COPY जोड़ें और इमेज के अंदर मूल को बदलें:
COPY patch/undertow-core-1.4.18.Final-patched.jar /tmp/
RUN cp /tmp/undertow-core-1.4.18.Final-patched.jar \
/opt/jboss/wildfly/modules/system/layers/base/io/undertow/core/main/undertow-core-1.4.18.Final.jar
docker build -t wildfly:11.0.0.Final-patched .
सत्यापन:
# मान्य Host हेडर — 200 लौटना चाहिए
curl -v -H "Host: localhost:8080" http://localhost:8080/
# Host में खराब वर्ण — 400 Host Header Bad Characters लौटना चाहिए
curl -v -H "Host: evil<script>" http://localhost:8080/
# डुप्लिकेट Host हेडर — 400 Bad Request लौटना चाहिए
# नोट: curl आंतरिक रूप से Host हेडर को डिडुप्लिकेट करता है, इसलिए इस परीक्षण के लिए एक कच्चे TCP अनुरोध की आवश्यकता है
exec 3<>/dev/tcp/localhost/8080; \
printf "GET / HTTP/1.1\r\nHost: localhost\r\nHost: evil.com\r\nConnection: close\r\n\r\n" >&3; \
sleep 1; head -1 <&3; exec 3>&-
# पोर्ट सीमा से बाहर — 400 Host Header Malformed Port लौटना चाहिए
curl -v -H "Host: localhost:99999" http://localhost:8080/
| अनुरोध | अपेक्षित | परिणाम |
|---|---|---|
Host: localhost:8080 (मान्य) | 200 OK | ✓ |
Host: evil<script> (खराब वर्ण) | 400 Host Header Bad Characters | ✓ |
दो Host: हेडर (डुप्लिकेट, कच्चा TCP) | 400 Bad Request | ✓ |
Host: localhost:99999 (खराब पोर्ट) | 400 Host Header Malformed Port | ✓ |
Host हेडर शामिल होना चाहिएइस पैच से पहले, WildFly का REQUIRE_HOST_HTTP11 विकल्प डिफ़ॉल्ट रूप से false था, जिसका अर्थ है कि बिना Host हेडर के HTTP/1.1 अनुरोधों को चुपचाप स्वीकार कर लिया जाता था।
इस पैच के बाद, HostHeaderHandler RFC 7230 को सख्ती से लागू करता है — REQUIRE_HOST_HTTP11 सेटिंग की परवाह किए बिना, बिना Host हेडर वाले सभी HTTP/1.1 अनुरोधों को 400 No Host Header के साथ अस्वीकार कर दिया जाता है।
कौन प्रभावित हो सकता है:
GET / HTTP/1.1 भेजते हैंक्या करें:
सुनिश्चित करें कि सभी HTTP/1.1 क्लाइंट में एक Host हेडर शामिल है। यह पहले से ही RFC 7230 द्वारा आवश्यक है और कोई भी मानक HTTP लाइब्रेरी (curl, Java का HttpClient, आदि) स्वचालित रूप से ऐसा करती है। केवल गैर-अनुपालक या बहुत पुराने कस्टम क्लाइंट प्रभावित होते हैं।
# यह अब 400 के साथ अस्वीकार कर दिया जाएगा:
GET /health HTTP/1.1
Connection: close
# यह सही है और ठीक काम करेगा:
GET /health HTTP/1.1
Host: your-server:8080
Connection: close
यदि आपको एक नए वातावरण में patch/undertow-core-1.4.18.Final-patched.jar को पुनर्जीवित करने की आवश्यकता है (उदा., प्री-बिल्ट JAR उपलब्ध नहीं है), तो प्रदान की गई बिल्ड स्क्रिप्ट का उपयोग करें।
आवश्यकताएँ: Java 8 JDK, curl, Maven Central तक इंटरनेट पहुंच।
cd patch
bash build.sh
स्क्रिप्ट यह करेगी:
HostHeaderHandler.java संकलित करेंHttpReadListener बाइटकोड को पैच करने के लिए PatchHttpReadListener.java संकलित और चलाएंundertow-core-1.4.18.Final-patched.jar में पुनः पैकेज करेंइसके पूरा होने के बाद, सामान्य रूप से docker build के साथ आगे बढ़ें।
नोट:
wildfly-dist-11.0.0.Final.tar.gzइस रिपॉजिटरी में शामिल नहीं है (GitHub की 100 MB सीमा से अधिक है)। बिल्ड करने से पहले इसे Maven Central से डाउनलोड करें:https://repo1.maven.org/maven2/org/wildfly/wildfly-dist/11.0.0.Final/wildfly-dist-11.0.0.Final.tar.gz
docker build -t wildfly:11.0.0.Final-patched .
docker run -d -p 8080:8080 wildfly:11.0.0.Final-patched
सहकर्मी इमेज को अपनी तैनाती के साथ माउंट या विस्तारित कर सकते हैं:
FROM wildfly:11.0.0.Final-patched
COPY standalone.xml /opt/jboss/wildfly/standalone/configuration/standalone.xml
COPY myapp.war /opt/jboss/wildfly/standalone/deployments/