
صورة Docker أساسية تتضمن إصلاحًا مُرحّلًا للتحقق من ترويسة المضيف (Host header) الخاص بثغرة CVE-2025-12543 في Undertow 1.4.x، مما يتيح نشرًا آمنًا لتطبيقات WildFly 11.
يوفر هذا المستودع صورة قاعدة Docker مبنية على WildFly 11.0.0.Final مع تصحيح مُطبق من إصدار أحدث (backported) لثغرة CVE-2025-12543، وهي ثغرة حرجة في التحقق من ترويسة Host في Undertow.
الهدف من هذه الصورة هو توفيرها للزملاء كقاعدة. يمكنهم نشر تطبيق .war الخاص بهم وملف standalone.xml فوقها.
| الحقل | التفاصيل |
|---|---|
| معرف CVE | 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 في التحقق بشكل صحيح من ترويسة Host في طلبات HTTP الواردة. تتم معالجة الطلبات التي تحتوي على ترويسات Host تالفة أو خبيثة دون رفض، مما يتيح:
لا يزال المستخدمون الآخرون يعملون على WildFly 11، ولا توجد موارد أو خطط حاليًا للترقية. تم تطبيق التصحيح مباشرةً من إصدار أحدث (backported) داخل حزمة Undertow 1.4.18.Final JAR بدلاً من ذلك.
.
├── Dockerfile # Main image definition
├── README.md
├── wildfly-dist-11.0.0.Final.tar.gz # WildFly 11 distribution archive
├── reports/
│ ├── result-20260401-0230.txt # CVE scan report that identified the vulnerability
│ └── wildfly_11.0.0.Final_*.txt # Additional scan reports
└── patch/
├── src/
│ ├── HostHeaderHandler.java # Backported fix — new handler class
│ ├── HttpReadListener_only.java # Decompiled + patched HttpReadListener source (reference)
│ └── PatchHttpReadListener.java # Javassist bytecode patcher tool
├── build.sh # Build script — rebuilds the patched JAR from scratch
├── undertow-core-1.4.18.Final.jar # Original (unpatched) JAR — kept for reference
└── undertow-core-1.4.18.Final-patched.jar # Patched JAR injected into the image
Dockerfileيقوم ببناء الصورة النهائية. وهو:
bitnamilegacy/java:1.8.432-7-debian-12-r2 (OpenJDK 1.8.0_432) كقاعدة/opt/jboss/wildflyundertow-core-1.4.18.Final.jar الأصلي بالإصدار المصححstandalone.sh -b 0.0.0.0 (يُربط بجميع الواجهات)patch/undertow-core-1.4.18.Final-patched.jarحزمة Undertow المصححة. وهي مطابقة للأصل باستثناء تغييرين:
io/undertow/server/handlers/HostHeaderHandler.class (وفئاته الداخلية)io/undertow/server/protocol/http/HttpReadListener.class — يُحقن HostHeaderHandler في خط معالجة الطلباتpatch/src/HostHeaderHandler.javaمعالج التحقق من ترويسة Host المُطبق من إصدار أحدث (backported). تم نقله من طلب السحب Undertow #1857 (UNDERTOW-2656).
جميع الثوابت (IP4_EXACT, IP6_EXACT, جداول الأحرف) مكتفية ذاتيًا — لا تعتمد على واجهات برمجية (APIs) أُضيفت في Undertow 2.x. عند كل طلب HTTP، يتحقق مما يلي:
Host (مطلوبة لـ HTTP/1.1)Host واحدة فقط (بدون تكرار)400 Bad Request عند أي مخالفةpatch/src/PatchHttpReadListener.javaمصحح البايت كود Javassist لمرة واحدة. يقوم بتحميل HttpReadListener من حزمة JAR الأصلية ويستبدل:
// Before
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// After
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
يؤدي ذلك إلى حقن HostHeaderHandler تلقائيًا في كل طلب HTTP، دون الحاجة إلى إعادة ترجمة كاملة لـ HttpReadListener (الذي يعتمد على فئات داخلية معقدة وخصائص xnio الداخلية).
patch/src/HttpReadListener_only.javaالكود المصدري المُفكك (Decompiled) لملف HttpReadListener الأصلي من Undertow 1.4.18.Final، ويُستخدم كمرجع لتحديد نقطة الحقن. ويتم أيضًا الاحتفاظ بالنسخة المصححة من هذا الكود المصدري هنا لأغراض التدقيق.
reports/result-20260401-0230.txtتقرير فحص CVE (تم إنشاؤه في 2026-04-01) الذي حدد وجود CVE-2025-12543 في undertow-core-1.4.18.Final على المسار:
/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 ويوصّله بـ HttpReadListener للتحقق من ترويسة Host في كل طلب.
الانتقال من Undertow 1.4.x إلى 2.2.x هو قفزة إصدار رئيسية تتضمن تغييرات جذرية في الواجهات البرمجية (APIs). يرتبط WildFly 11 ارتباطًا وثيقًا بـ Undertow 1.4.x عبر JBoss Modules. أي استبدال مباشر لملف JAR سيؤدي إلى ClassNotFoundException / NoSuchMethodError عند بدء التشغيل.
HostHeaderHandler.java من إصدار أحدثاكتب نسخة مكتفية ذاتيًا من HostHeaderHandler.java متوافقة مع Undertow 1.4.18.Final:
IP4_EXACT, IP6_EXACT) — غير متوفرة في NetworkUtils الخاص بـ 1.4.xexchange.isHostIncludedInRequestURI() — غير متوفرة في HttpServerExchange الخاص بـ 1.4.xقم بالترجمة (compile) باستخدام classpath الخاص بـ Undertow 1.4.18 + xnio داخل صورة WildFly:
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 عبر Javassistفكّك HttpReadListener باستخدام Procyon لتحديد نقطة الحقن:
Connectors.executeRootHandler(this.connection.getRootHandler(), httpServerExchange);
يقع هذا الاستدعاء في handleEventWithNoRunningRequest().
ونظرًا لأن HttpReadListener يحتوي على فئات داخلية مجهولة ($1, $2, $3) لا يمكن الإشارة إليها من الكود المصدري المفكك، فإن إعادة الترجمة الكاملة غير ممكنة. بدلاً من ذلك، استخدم Javassist (PatchHttpReadListener.java) لتعديل البايت كود مباشرةً — مع استبدال استدعاء executeRootHandler ليلتف حول معالج الجذر (root handler) باستخدام HostHeaderHandler.WRAPPER.
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
أضف تعليمة 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 .
التحقق:
# Valid Host header — should return 200
curl -v -H "Host: localhost:8080" http://localhost:8080/