
Docker-Basis-Image mit backportiertem Host-Header-Validierungs-Fix für CVE-2025-12543 in Undertow 1.4.x, das die sichere Bereitstellung von WildFly 11-Anwendungen ermöglicht.
Dieses Repository stellt ein Docker-Basis-Image bereit, das auf WildFly 11.0.0.Final basiert und einen Backport-Fix für CVE-2025-12543 enthält, eine kritische Schwachstelle in der Host-Header-Validierung in Undertow.
Das Image ist als Grundlage für Kollegen gedacht. Sie können ihre eigene .war-Anwendung und standalone.xml darauf bereitstellen.
| Feld | Detail |
|---|
| CVE-ID | CVE-2025-12543 |
| Komponente | io.undertow:undertow-core |
| Schweregrad | Kritisch (CVSS 9.6) |
| Betroffene Versionen | Alle Versionen < 2.2.39 (einschließlich 1.4.x) |
| Behoben in | Undertow 2.2.39 / 2.3.22 |
| WildFly 11 Version | undertow-core-1.4.18.Final — betroffen |
Undertow validiert den Host-Header eingehender HTTP-Anfragen nicht ordnungsgemäß. Anfragen mit fehlerhaften oder bösartigen Host-Headern werden ohne Zurückweisung verarbeitet, was Folgendes ermöglicht:
Andere Benutzer verwenden weiterhin WildFly 11, und es gibt derzeit keine Ressourcen oder Pläne für ein Upgrade. Der Fix wurde stattdessen zurückportiert direkt in das 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
DockerfileErstellt das endgültige Image. Es:
bitnamilegacy/java:1.8.432-7-debian-12-r2 (OpenJDK 1.8.0_432) als Basis/opt/jboss/wildflyundertow-core-1.4.18.Final.jar durch die gepatchte Versionstandalone.sh -b 0.0.0.0 (bindet an alle Schnittstellen)patch/undertow-core-1.4.18.Final-patched.jarDas gepatchte Undertow-JAR. Es ist bis auf zwei Änderungen identisch mit dem Original:
io/undertow/server/handlers/HostHeaderHandler.class (und seine inneren Klassen)io/undertow/server/protocol/http/HttpReadListener.class — injiziert HostHeaderHandler in die Anfrage-Pipelinepatch/src/HostHeaderHandler.javaDer zurückportierte Host-Header-Validierungs-Handler. Portiert von Undertow PR #1857 (UNDERTOW-2656).
Alle Konstanten (IP4_EXACT, IP6_EXACT, Zeichentabellen) sind in sich geschlossen — keine Abhängigkeit von APIs, die in Undertow 2.x hinzugefügt wurden. Bei jeder HTTP-Anfrage validiert es:
400 Bad Request bei jedem Verstoßpatch/src/PatchHttpReadListener.javaEin einmaliger Javassist-Bytecode-Patcher. Er lädt HttpReadListener aus dem ursprünglichen JAR und ersetzt:
// Before
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// After
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
Dies injiziert HostHeaderHandler automatisch in jede HTTP-Anfrage, ohne dass eine vollständige Neukompilierung von HttpReadListener erforderlich ist (was von komplexen inneren Klassen und xnio-Interna abhängt).
patch/src/HttpReadListener_only.javaDekompilierter Quellcode des originalen HttpReadListener aus Undertow 1.4.18.Final, verwendet als Referenz zur Lokalisierung des Injektionspunkts. Die gepatchte Version dieses Quellcodes wird hier ebenfalls zu Prüfzwecken aufbewahrt.
reports/result-20260401-0230.txtCVE-Scan-Bericht (generiert am 01.04.2026), der CVE-2025-12543 in undertow-core-1.4.18.Final unter folgendem Pfad identifizierte:
/opt/jboss/wildfly/modules/system/layers/base/io/undertow/core/main/undertow-core-1.4.18.Final.jar
Der Scan-Bericht (result-20260401-0230.txt) bestätigte, dass undertow-core-1.4.18.Final von CVE-2025-12543 (CVSS 9.6) betroffen ist.
Der Fix befindet sich in Undertow PR #1857, zusammengeführt in main (09.01.2026) und zurückportiert auf 2.2.x und 2.3.x. Der Fix fügt HostHeaderHandler.java hinzu und bindet es in HttpReadListener ein, um den Host-Header bei jeder Anfrage zu validieren.
Undertow 1.4.x → 2.2.x ist ein Major-Version-Sprung mit brechenden API-Änderungen. WildFly 11 ist über JBoss Modules eng an Undertow 1.4.x gekoppelt. Ein direkter JAR-Austausch würde beim Start ClassNotFoundException / NoSuchMethodError verursachen.
HostHeaderHandler.java zurückportierenSchreiben Sie eine eigenständige Version von HostHeaderHandler.java, die mit Undertow 1.4.18.Final kompatibel ist:
IP4_EXACT, IP6_EXACT) inline einfügen — nicht verfügbar in 1.4.x NetworkUtilsexchange.isHostIncludedInRequestURI() entfernen — nicht verfügbar in 1.4.x HttpServerExchangeKompilieren gegen den Undertow 1.4.18 + xnio Classpath innerhalb des WildFly-Images:
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 mit Javassist patchenDekompilieren Sie HttpReadListener mit Procyon, um den Injektionspunkt zu lokalisieren:
Connectors.executeRootHandler(this.connection.getRootHandler(), httpServerExchange);
befindet sich in handleEventWithNoRunningRequest().
Da HttpReadListener anonyme innere Klassen ($1, $2, $3) enthält, die aus dekompiliertem Quellcode nicht referenziert werden können, ist eine vollständige Neukompilierung nicht praktikabel. Verwenden Sie stattdessen Javassist (PatchHttpReadListener.java), um den Bytecode direkt zu instrumentieren — Ersetzen des executeRootHandler-Aufrufs, um den Root-Handler mit HostHeaderHandler.WRAPPER zu umschließen.
java -cp javassist.jar:undertow-core-1.4.18.Final.jar:out \
PatchHttpReadListener undertow-core-1.4.18.Final.jar out/
Kopieren Sie das originale JAR und fügen Sie die gepatchten/neuen Klassendateien ein:
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
Fügen Sie ein COPY für das gepatchte JAR hinzu und ersetzen Sie das Original im Image:
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 .
Validierung:
# Valid Host header — should return 200
curl -v -H "Host: localhost:8080" http://localhost:8080/
# Bad characters in Host — should return 400 Host Header Bad Characters
curl -v -H "Host: evil<script>" http://localhost:8080/
# Duplicate Host headers — should return 400 Bad Request
# Note: curl deduplicates Host headers internally, so a raw TCP request is required for this test
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>&-
# Port out of range — should return 400 Host Header Malformed Port
curl -v -H "Host: localhost:99999" http://localhost:8080/
| Anfrage (Request) | Erwartet (Expected) | Ergebnis (Result) |
|---|---|---|
Host: localhost:8080 (gültig) | 200 OK | ✓ |
Host: evil<script> (ungültige Zeichen) | 400 Host Header Bad Characters | ✓ |
Zwei Host:-Header (dupliziert, raw TCP) | 400 Bad Request | ✓ |
Host: localhost:99999 (ungültiger Port) | 400 Host Header Malformed Port | ✓ |
Host-Header enthaltenVor diesem Patch stand die Option REQUIRE_HOST_HTTP11 von WildFly standardmäßig auf false, was bedeutete, dass HTTP/1.1-Anfragen ohne Host-Header stillschweigend akzeptiert wurden.
Nach diesem Patch setzt der HostHeaderHandler RFC 7230 streng durch — alle HTTP/1.1-Anfragen ohne einen Host-Header werden mit 400 No Host Header abgelehnt, unabhängig von der Einstellung REQUIRE_HOST_HTTP11.
Wer könnte betroffen sein:
GET / HTTP/1.1 ohne Host-Header sendenWas ist zu tun:
Stellen Sie sicher, dass alle HTTP/1.1-Clients einen Host-Header enthalten. Dies ist bereits durch RFC 7230 erforderlich und jede Standard-HTTP-Bibliothek (curl, Java's HttpClient, etc.) macht dies automatisch. Nur nicht konforme oder sehr alte benutzerdefinierte Clients sind betroffen.
# This will now be rejected with 400:
GET /health HTTP/1.1
Connection: close
# This is correct and will work fine:
GET /health HTTP/1.1
Host: your-server:8080
Connection: close
Wenn Sie patch/undertow-core-1.4.18.Final-patched.jar in einer neuen Umgebung neu generieren müssen (z.B. wenn das vorgebaute JAR nicht verfügbar ist), verwenden Sie das bereitgestellte Build-Skript.
Anforderungen: Java 8 JDK, curl, Internetzugang zu Maven Central.
cd patch
bash build.sh
Das Skript wird:
HostHeaderHandler.java kompilierenPatchHttpReadListener.java kompilieren und ausführen, um den Bytecode von HttpReadListener mittels Javassist zu patchenundertow-core-1.4.18.Final-patched.jar neu paketierenNach Abschluss fahren Sie wie gewohnt mit docker build fort.
Hinweis:
wildfly-dist-11.0.0.Final.tar.gzist nicht in diesem Repository enthalten (überschreitet das 100-MB-Limit von GitHub). Laden Sie es vor dem Erstellen von Maven Central herunter: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
Kollegen können das Image mit ihrer eigenen Bereitstellung mounten oder erweitern:
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/