
Image de base Docker avec correctif de validation d'en-tête Host rétroporté pour CVE-2025-12543 dans Undertow 1.4.x, permettant un déploiement sécurisé des applications WildFly 11.
Ce dépôt fournit une image Docker de base construite sur WildFly 11.0.0.Final avec un correctif rétroporté pour CVE-2025-12543, une vulnérabilité critique de validation de l'en-tête Host dans Undertow.
L'image est destinée à être fournie aux collègues comme base. Ils peuvent déployer leur propre application .war et leur standalone.xml par-dessus.
| Champ | Détail |
|---|
| Identifiant CVE | CVE-2025-12543 |
| Composant | io.undertow:undertow-core |
| Sévérité | Critique (CVSS 9.6) |
| Versions affectées | Toutes les versions < 2.2.39 (y compris 1.4.x) |
| Corrigé dans | Undertow 2.2.39 / 2.3.22 |
| Version WildFly 11 | undertow-core-1.4.18.Final — affectée |
Undertow ne parvient pas à valider correctement l'en-tête Host dans les requêtes HTTP entrantes. Les requêtes contenant des en-têtes Host malformés ou malveillants sont traitées sans rejet, permettant :
D'autres utilisateurs sont toujours sur WildFly 11, et il n'y a actuellement ni ressources ni projets de mise à niveau. Le correctif a été rétroporté directement dans le JAR Undertow 1.4.18.Final.
.
├── Dockerfile # Définition de l'image principale
├── README.md
├── wildfly-dist-11.0.0.Final.tar.gz # Archive de distribution WildFly 11
├── reports/
│ ├── result-20260401-0230.txt # Rapport de scan CVE qui a identifié la vulnérabilité
│ └── wildfly_11.0.0.Final_*.txt # Rapports de scan supplémentaires
└── patch/
├── src/
│ ├── HostHeaderHandler.java # Correctif rétroporté — nouvelle classe de gestionnaire
│ ├── HttpReadListener_only.java # Source décompilée + corrigée de HttpReadListener (référence)
│ └── PatchHttpReadListener.java # Outil de correction de bytecode Javassist
├── build.sh # Script de construction — reconstruit le JAR corrigé à partir de zéro
├── undertow-core-1.4.18.Final.jar # JAR original (non corrigé) — conservé pour référence
└── undertow-core-1.4.18.Final-patched.jar # JAR corrigé injecté dans l'image
DockerfileConstruit l'image finale. Il :
bitnamilegacy/java:1.8.432-7-debian-12-r2 (OpenJDK 1.8.0_432) comme base/opt/jboss/wildflyundertow-core-1.4.18.Final.jar original par la version corrigéestandalone.sh -b 0.0.0.0 (liaison à toutes les interfaces)patch/undertow-core-1.4.18.Final-patched.jarLe JAR Undertow corrigé. Il est identique à l'original à l'exception de deux modifications :
io/undertow/server/handlers/HostHeaderHandler.class (et ses classes internes)io/undertow/server/protocol/http/HttpReadListener.class — injecte HostHeaderHandler dans le pipeline de requêtespatch/src/HostHeaderHandler.javaLe gestionnaire de validation d'en-tête Host rétroporté. Porté depuis la PR Undertow #1857 (UNDERTOW-2656).
Toutes les constantes (IP4_EXACT, IP6_EXACT, tables de caractères) sont autonomes — aucune dépendance aux API ajoutées dans Undertow 2.x. Sur chaque requête HTTP, il valide :
400 Bad Request en cas de violationpatch/src/PatchHttpReadListener.javaUn correcteur de bytecode Javassist à usage unique. Il charge HttpReadListener depuis le JAR original et remplace :
// Avant
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// Après
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
Ceci injecte HostHeaderHandler automatiquement dans chaque requête HTTP, sans nécessiter une recompilation complète de HttpReadListener (qui dépend de classes internes complexes et d'internals xnio).
patch/src/HttpReadListener_only.javaSource décompilée du HttpReadListener original d'Undertow 1.4.18.Final, utilisée comme référence pour localiser le point d'injection. La version corrigée de cette source est également conservée ici à des fins d'audit.
reports/result-20260401-0230.txtRapport de scan CVE (généré le 2026-04-01) qui a identifié CVE-2025-12543 dans undertow-core-1.4.18.Final à :
/opt/jboss/wildfly/modules/system/layers/base/io/undertow/core/main/undertow-core-1.4.18.Final.jar
Le rapport de scan (result-20260401-0230.txt) a confirmé que undertow-core-1.4.18.Final est affecté par CVE-2025-12543 (CVSS 9.6).
Le correctif se trouve dans Undertow PR #1857, fusionné dans main (2026-01-09) et rétroporté dans 2.2.x et 2.3.x. Le correctif ajoute HostHeaderHandler.java et le câble dans HttpReadListener pour valider l'en-tête Host sur chaque requête.
Undertow 1.4.x → 2.2.x est un saut de version majeur avec des changements d'API cassants. WildFly 11 est étroitement couplé à Undertow 1.4.x via JBoss Modules. Un remplacement direct du JAR provoquerait ClassNotFoundException / NoSuchMethodError au démarrage.
HostHeaderHandler.javaÉcrire une version autonome de HostHeaderHandler.java compatible avec Undertow 1.4.18.Final :
IP4_EXACT, IP6_EXACT) — non disponibles dans NetworkUtils de la version 1.4.xexchange.isHostIncludedInRequestURI() — non disponible dans HttpServerExchange de la version 1.4.xCompiler avec le classpath Undertow 1.4.18 + xnio à l'intérieur de l'image 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 via JavassistDécompiler HttpReadListener avec Procyon pour localiser le point d'injection :
Connectors.executeRootHandler(this.connection.getRootHandler(), httpServerExchange);
situé dans handleEventWithNoRunningRequest().
Comme HttpReadListener a des classes internes anonymes ($1, $2, $3) qui ne peuvent pas être référencées depuis une source décompilée, une recompilation complète n'est pas réalisable. Utiliser plutôt Javassist (PatchHttpReadListener.java) pour instrumenter directement le bytecode — en remplaçant l'appel executeRootHandler pour envelopper le gestionnaire racine avec HostHeaderHandler.WRAPPER.
java -cp javassist.jar:undertow-core-1.4.18.Final.jar:out \
PatchHttpReadListener undertow-core-1.4.18.Final.jar out/
Copier le JAR original et injecter les fichiers de classe corrigés/nouveaux :
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
Ajouter un COPY pour le JAR corrigé et remplacer l'original dans l'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 .
Validation :
# En-tête Host valide — doit renvoyer 200
curl -v -H "Host: localhost:8080" http://localhost:8080/
# Caractères incorrects dans Host — doit renvoyer 400 Host Header Bad Characters
curl -v -H "Host: evil<script>" http://localhost:8080/
# En-têtes Host en double — doit renvoyer 400 Bad Request
# Remarque : curl déduplique les en-têtes Host en interne, donc une requête TCP brute est nécessaire pour ce 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 hors plage — doit renvoyer 400 Host Header Malformed Port
curl -v -H "Host: localhost:99999" http://localhost:8080/
| Requête | Attendu | Résultat |
|---|---|---|
Host: localhost:8080 (valide) | 200 OK | ✓ |
Host: evil<script> (mauvais caractères) | 400 Host Header Bad Characters | ✓ |
Deux en-têtes Host: (doublon, TCP brut) | 400 Bad Request | ✓ |
Host: localhost:99999 (mauvais port) | 400 Host Header Malformed Port | ✓ |
HostAvant ce correctif, l'option REQUIRE_HOST_HTTP11 de WildFly était par défaut à false, donc les requêtes HTTP/1.1 sans en-tête Host étaient acceptées silencieusement.
Après ce correctif, le HostHeaderHandler applique strictement la RFC 7230 — toutes les requêtes HTTP/1.1 sans en-tête Host sont rejetées avec 400 No Host Header, quel que soit le paramètre REQUIRE_HOST_HTTP11.
Qui peut être affecté :
GET / HTTP/1.1 brut sans en-tête HostQue faire :
Assurez-vous que tous les clients HTTP/1.1 incluent un en-tête Host. Ceci est déjà requis par la RFC 7230 et toute bibliothèque HTTP standard (curl, HttpClient de Java, etc.) le fait automatiquement. Seuls les clients non conformes ou très anciens sont affectés.
# Ceci sera désormais rejeté avec 400 :
GET /health HTTP/1.1
Connection: close
# Ceci est correct et fonctionnera :
GET /health HTTP/1.1
Host: votre-serveur:8080
Connection: close
Si vous devez régénérer patch/undertow-core-1.4.18.Final-patched.jar dans un nouvel environnement (par exemple, si le JAR pré-construit n'est pas disponible), utilisez le script de construction fourni.
Prérequis : JDK Java 8, curl, accès Internet à Maven Central.
cd patch
bash build.sh
Le script va :
HostHeaderHandler.javaPatchHttpReadListener.java pour corriger le bytecode de HttpReadListener via Javassistundertow-core-1.4.18.Final-patched.jarUne fois terminé, procédez au docker build comme d'habitude.
Remarque :
wildfly-dist-11.0.0.Final.tar.gzn'est pas inclus dans ce dépôt (dépasse la limite de 100 Mo de GitHub). Téléchargez-le depuis Maven Central avant la construction :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
Les collègues peuvent monter ou étendre l'image avec leur propre déploiement :
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/