
CVE-2025-12543に対するUndertow 1.4.xのバックポートされたHostヘッダー検証修正を含むDockerベースイメージ。これによりWildFly 11アプリケーションの安全なデプロイが可能になります。
このリポジトリは、WildFly 11.0.0.Final 上に構築された Docker ベースイメージを提供し、Undertow における深刻な Host ヘッダ検証の脆弱性 CVE-2025-12543 に対するバックポート修正を含んでいます。
このイメージは、同僚にベースとして提供することを意図しています。各自の .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。2つの変更点を除いて元のものと同一:
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.java1回限りの Javassist バイトコードパッチャー。元の JAR から HttpReadListener をロードし、以下の置き換えを行います:
// 変更前
Connectors.executeRootHandler(connection.getRootHandler(), exchange);
// 変更後
Connectors.executeRootHandler(
HostHeaderHandler.WRAPPER.wrap(connection.getRootHandler()),
exchange
);
これにより、HttpReadListener の完全な再コンパイル (複雑な内部クラスや xnio 内部に依存) を必要とせずに、すべての HTTP リクエストに HostHeaderHandler が自動的に注入されます。
patch/src/HttpReadListener_only.javaUndertow 1.4.18.Final の元の HttpReadListener を逆コンパイルしたソース。注入ポイントを見つけるための参考として使用。このソースのパッチ適用版も監査目的でここに保持されています。
reports/result-20260401-0230.txtundertow-core-1.4.18.Final で CVE-2025-12543 を特定した CVE スキャンレポート (生成日 2026-04-01):
/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) を使用してバイトコードを直接操作し、executeRootHandler 呼び出しをルートハンドラを 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
パッチ適用済み JAR の COPY を追加し、イメージ内の元の JAR を置き換えます:
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 ヘッダを重複排除するため、このテストには raw 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 ヘッダを含まなければならないこのパッチの前、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 をコンパイルPatchHttpReadListener.java をコンパイルして実行し、Javassist を介して HttpReadListener のバイトコードをパッチ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/
| リクエスト | 期待値 | 結果 |
|---|
Host: localhost:8080 (有効) | 200 OK | ✓ |
Host: evil<script> (不正文字) | 400 Host Header Bad Characters | ✓ |
2つの Host: ヘッダ (重複、raw TCP) | 400 Bad Request | ✓ |
Host: localhost:99999 (不正ポート) | 400 Host Header Malformed Port | ✓ |