
Docker base image con fix backportato per la validazione dell'header Host per CVE-2025-12543 in Undertow 1.4.x, che consente il deployment sicuro di applicazioni WildFly 11.
Questo repository fornisce un'immagine Docker di base costruita su WildFly 11.0.0.Final con una correzione backportata per CVE-2025-12543, una vulnerabilità critica di validazione dell'header Host in Undertow.
L'immagine è pensata per essere fornita ai colleghi come base. Possono distribuire la propria applicazione .war e il proprio standalone.xml sopra di essa.
| Campo | Dettaglio |
|---|
| ID CVE | CVE-2025-12543 |
| Componente | io.undertow:undertow-core |
| Gravità | Critica (CVSS 9.6) |
| Versioni vulnerabili | Tutte le versioni < 2.2.39 (incluse le 1.4.x) |
| Corretta in | Undertow 2.2.39 / 2.3.22 |
| Versione WildFly 11 | undertow-core-1.4.18.Final — vulnerabile |
Undertow non valida correttamente l'header Host nelle richieste HTTP in arrivo. Le richieste contenenti header Host malformati o dannosi vengono elaborate senza essere respinte, consentendo:
Altri utenti sono ancora su WildFly 11 e non ci sono risorse o piani attuali per l'aggiornamento. La correzione è stata backportata direttamente nel JAR Undertow 1.4.18.Final.
.
├── Dockerfile # Definizione principale dell'immagine
├── README.md
├── wildfly-dist-11.0.0.Final.tar.gz # Archivio della distribuzione WildFly 11
├── reports/
│ ├── result-20260401-0230.txt # Report di scansione CVE che ha identificato la vulnerabilità
│ └── wildfly_11.0.0.Final_*.txt # Report di scansione aggiuntivi
└── patch/
├── src/
│ ├── HostHeaderHandler.java # Correzioni backportata — nuova classe handler
│ ├── HttpReadListener_only.java # Sorgente HttpReadListener decompilato + patchato (riferimento)
│ └── PatchHttpReadListener.java # Strumento di patch del bytecode tramite Javassist
├── build.sh # Script di build — ricostruisce il JAR patchato da zero
├── undertow-core-1.4.18.Final.jar # JAR originale (non patchato) — conservato come riferimento
└── undertow-core-1.4.18.Final-patched.jar # JAR patchato iniettato nell'immagine
DockerfileCostruisce l'immagine finale. Esegue le seguenti operazioni:
bitnamilegacy/java:1.8.432-7-debian-12-r2 (OpenJDK 1.8.0_432) come base/opt/jboss/wildflyundertow-core-1.4.18.Final.jar con la versione patchatastandalone.sh -b 0.0.0.0 (si lega a tutte le interfacce)patch/undertow-core-1.4.18.Final-patched.jarIl JAR Undertow patchato. È identico all'originale tranne per due modifiche:
io/undertow/server/handlers/HostHeaderHandler.class (e le sue classi interne)io/undertow/server/protocol/http/HttpReadListener.class — inietta HostHeaderHandler nella pipeline delle richiestepatch/src/HostHeaderHandler.javaL'handler backportato di validazione dell'header Host. Trasposto dalla PR Undertow #1857 (UNDERTOW-2656).
Tutte le costanti (IP4_EXACT, IP6_EXACT, tabelle di caratteri) sono autonome — nessuna dipendenza da API introdotte in Undertow 2.x. A ogni richiesta HTTP, valida:
400 Bad Request a ogni violazionepatch/src/PatchHttpReadListener.javaUn patcher del bytecode Javassist monouso. Carica HttpReadListener dal JAR originale e sostituisce:
// Prima
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// Dopo
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
Questo inietta HostHeaderHandler automaticamente in ogni richiesta HTTP, senza richiedere una ricompilazione completa di HttpReadListener (che dipende da classi interne complesse e dagli internals di xnio).
patch/src/HttpReadListener_only.javaSorgente decompilato dell'HttpReadListener originale di Undertow 1.4.18.Final, usato come riferimento per individuare il punto di iniezione. Anche la versione patchata di questo sorgente è conservata qui per scopi di audit.
reports/result-20260401-0230.txtReport di scansione CVE (generato il 01-04-2026) che ha identificato CVE-2025-12543 in undertow-core-1.4.18.Final in:
/opt/jboss/wildfly/modules/system/layers/base/io/undertow/core/main/undertow-core-1.4.18.Final.jar
Il report di scansione (result-20260401-0230.txt) ha confermato che undertow-core-1.4.18.Final è vulnerabile a CVE-2025-12543 (CVSS 9.6).
La correzione si trova nella PR Undertow PR #1857, integrata in main (09-01-2026) e backportata nelle serie 2.2.x e 2.3.x. La correzione aggiunge HostHeaderHandler.java e lo collega a HttpReadListener per validare l'header Host a ogni richiesta.
Undertow 1.4.x → 2.2.x è un salto di versione major con modifiche di API che rompono la compatibilità. WildFly 11 è strettamente accoppiato a Undertow 1.4.x tramite JBoss Modules. Una sostituzione diretta del JAR causerebbe ClassNotFoundException / NoSuchMethodError all'avvio.
HostHeaderHandler.javaScrivere una versione autonoma di HostHeaderHandler.java compatibile con Undertow 1.4.18.Final:
IP4_EXACT, IP6_EXACT) — non disponibili in NetworkUtils della 1.4.xexchange.isHostIncludedInRequestURI() — non disponibile in HttpServerExchange della 1.4.xCompilare usando il classpath di Undertow 1.4.18 + xnio all'interno dell'immagine 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 tramite JavassistDecompilare HttpReadListener con Procyon per individuare il punto di iniezione:
Connectors.executeRootHandler(this.connection.getRootHandler(), httpServerExchange);
situato in handleEventWithNoRunningRequest().
Poiché HttpReadListener ha classi interne anonime ($1, $2, $3) che non possono essere referenziate dal sorgente decompilato, una ricompilazione completa non è fattibile. Si usa invece Javassist (PatchHttpReadListener.java) per instrumentare direttamente il bytecode — sostituendo la chiamata executeRootHandler in modo che avvolga il root handler con HostHeaderHandler.WRAPPER.
java -cp javassist.jar:undertow-core-1.4.18.Final.jar:out \
PatchHttpReadListener undertow-core-1.4.18.Final.jar out/
Copiare il JAR originale e iniettare i file di classe nuovi/patchati:
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
Aggiungere un COPY per il JAR patchato e sostituire l'originale all'interno dell'immagine:
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 .
Validazione:
# Header Host valido — dovrebbe restituire 200
curl -v -H "Host: localhost:8080" http://localhost:8080/
# Caratteri non validi in Host — dovrebbe restituire 400 Host Header Bad Characters
curl -v -H "Host: evil<script>" http://localhost:8080/
# Header Host duplicati — dovrebbe restituire 400 Bad Request
# Nota: curl deduplica internamente gli header Host, quindi è necessario un tentativo TCP grezzo per questo 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>&-
# Porta fuori range — dovrebbe restituire 400 Host Header Malformed Port
curl -v -H "Host: localhost:99999" http://localhost:8080/
| Richiesta | Atteso | Risultato |
|---|---|---|
Host: localhost:8080 (valido) | 200 OK | ✓ |
Host: evil<script> (caratteri non validi) | 400 Host Header Bad Characters | ✓ |
Due header Host: (duplicato, TCP grezzo) | 400 Bad Request | ✓ |
Host: localhost:99999 (porta non valida) | 400 Host Header Malformed Port | ✓ |
HostPrima di questa patch, l'opzione REQUIRE_HOST_HTTP11 di WildFly era impostata di default su false, il che significava che le richieste HTTP/1.1 senza header Host venivano accettate silenziosamente.
Dopo questa patch, HostHeaderHandler applica rigorosamente la RFC 7230 — tutte le richieste HTTP/1.1 senza header Host vengono respinte con 400 No Host Header, indipendentemente dall'impostazione di REQUIRE_HOST_HTTP11.
Chi potrebbe essere interessato:
GET / HTTP/1.1 senza header HostCosa fare:
Assicurarsi che tutti i client HTTP/1.1 includano un header Host. Questo è già richiesto dalla RFC 7230 e qualsiasi libreria HTTP standard (curl, HttpClient di Java, ecc.) lo fa automaticamente. Sono interessati solo i client non conformi o personalizzati molto vecchi.
# Ora verrà respinta con 400:
GET /health HTTP/1.1
Connection: close
# Questo è corretto e funzionerà:
GET /health HTTP/1.1
Host: your-server:8080
Connection: close
Se è necessario rigenerare patch/undertow-core-1.4.18.Final-patched.jar in un nuovo ambiente (ad es. il JAR precompilato non è disponibile), usare lo script di build fornito.
Requisiti: JDK Java 8, curl, accesso a Internet per Maven Central.
cd patch
bash build.sh
Lo script eseguirà le seguenti operazioni:
HostHeaderHandler.javaPatchHttpReadListener.java per patchare il bytecode di HttpReadListener tramite Javassistundertow-core-1.4.18.Final-patched.jarAl termine, procedere con docker build come al solito.
Nota:
wildfly-dist-11.0.0.Final.tar.gznon è incluso in questo repository (supera il limite di 100 MB di GitHub). Scaricarlo da Maven Central prima della build: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
I colleghi possono montare o estendere l'immagine con la propria distribuzione:
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/