
CVE-2026-43867 の再現コード — Apache Camel camel-pqc AwsSecretsManagerKeyLifecycleManager における安全でないキーメタデータの逆シリアル化 (RCE)
このプロジェクトは、Apache Camel の camel-pqc コンポーネントにおける Java デシリアライゼーションの脆弱性を実証するもので、CVE-2026-43867 として追跡されています。AwsSecretsManagerKeyLifecycleManager.deserializeMetadata() は、永続化された耐量子計算機鍵メタデータを AWS Secrets Manager のシークレットから読み戻す際に、保存された値を Base64 デコードしてから、生の java.io.ObjectInputStream.readObject() でデシリアライズし、ObjectInputFilter を使用しません。KeyMetadata へのキャストは readObject() が戻った後にのみ行われるため、readObject() の副作用はすべて先に実行されます。そのシークレットに書き込み可能なプリンシパル (secretsmanager:PutSecretValue) は、通常の鍵ライフサイクル操作中にデシリアライズされる巧妙に細工された直列化オブジェクトを保存でき、コード実行につながる可能性があります。
アドバイザリ: https://camel.apache.org/security/CVE-2026-43867.html
CVE-2026-46590 と同じ欠陥(独立に報告されたもの。そのアドバイザリは HashiCorp Vault および ファイルベースの関連マネージャも対象としています)。また、CVE-2026-40048 (CAMEL-23200) に対する不完全な修正のフォローオンであり、 これは
FileBasedKeyLifecycleManagerを JSON/PKCS#8/X.509 形式に変更しましたが、ObjectInputFilterを追加せず、 AWS/Vault マネージャをカバーしませんでした。
// AwsSecretsManagerKeyLifecycleManager - 影響を受ける 4.18.2
private KeyMetadata deserializeMetadata(String base64) throws Exception {
byte[] data = Base64.getDecoder().decode(base64);
ByteArrayInputStream bais = new ByteArrayInputStream(data);
try (ObjectInputStream ois = new ObjectInputStream(bais)) { // ObjectInputFilter なし
return (KeyMetadata) ois.readObject(); // ガジェットはキャスト前にここで発動する
}
}
getKeyMetadata(keyId) は <keyPrefix>/<keyId>/metadata という名前のシークレットを読み取り、その JSON エンベロープ
({"metadata":"<base64>","keyId":...,"algorithm":...}) を解析して、metadata フィールドを deserializeMetadata に渡します。
修正(4.18.3 / 4.21.0)では、共有の KeyMetadataCodec が導入され、すべてのマネージャでメタデータを JSON として保存し、
残っているレガシーな ObjectInputStream の読み取りを許可リスト方式の ObjectInputFilter で制約します。
被害者は、AWS マネージャを使用して PQC 鍵を管理するアプリケーションです。攻撃者は、メタデータシークレットに書き込める任意のプリンシパル
(secretsmanager:PutSecretValue) です。この PoC は AWS Secrets Manager をエミュレートするために LocalStack を使用します。
/exploit/attack エンドポイントは、巧妙に細工されたメタデータシークレットを書き込み、その後マネージャの読み取りパスを駆動します。
CVE-2026-43867/
├── pom.xml # camel-pqc 4.18.2 + aws-sdk secretsmanager 2.41.28 + commons-collections 3.2.1
├── Dockerfile # アプリを実行(ガジェット構築用に --add-opens)
├── docker-compose.yml # LocalStack (Secrets Manager) + 再現ツールアプリ
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── Gadget.java # CommonsCollections6 ガジェット。readObject() 中に発動
│ └── ExploitController.java # 細工されたシークレットを書き込み、その後 getKeyMetadata() を呼び出す
└── resources/
└── application.properties
実際の攻撃では、直列化バイト列は攻撃者によってオフラインで生成されます(例: ysoserial を使用)。この PoC はガジェットをプロセス内で構築するため、JVM が
--add-opens java.base/java.util=ALL-UNNAMEDで実行されます。 これはガジェット構築上の詳細であり、脆弱性自体とは無関係です。
mvn clean package -DskipTests
docker compose up -d --build
これにより LocalStack(AWS Secrets Manager をエミュレート)と再現ツールアプリが起動します。アプリはエンドポイントオーバーライド経由で
AwsSecretsManagerKeyLifecycleManager を LocalStack に向けます。
curl -s http://localhost:8080/exploit/attack
# -> 細工された直列化メタデータを AWS Secrets Manager シークレット 'pqc/keys/victim-key/metadata' に書き込みました。
# getKeyMetadata() が java.lang.ClassCastException をスローしました(想定どおり — ガジェットは readObject() 中に実行されます...)
#
# >>> RCE の証明 — /tmp/pwned が存在: true
docker exec cve-2026-43867 ls -la /tmp/pwned
docker compose down
AwsSecretsManagerKeyLifecycleManager を使用するアプリケーションのうち、鍵メタデータシークレットがアプリケーション自身の信頼されたアイデンティティ以外の者によって書き込めるもの。
デシリアライゼーションは通常の鍵ライフサイクル操作中に実行されます(getKeyMetadata、loadExistingKeys、listKeys、ローテーションチェックなど)。
AwsSecretsManagerKeyLifecycleManager を使用するアプリケーション。secretsmanager:PutSecretValue を持っている)。commons-collections:3.2.1)。4.18.3 / 4.21.0(CAMEL-23726)にアップグレードしてください。メタデータは JSON として保存され、残っているレガシーな
ObjectInputStream の読み取りは許可リスト方式の ObjectInputFilter によって制約されます。
アップグレードするまでの間:
secretsmanager:PutSecretValue を、アプリケーション自身のアイデンティティのみに制限する(最小特権の IAM)。この再現ツールは、セキュリティ研究および許可されたテストのみを目的として提供されており、公開されて修正済みの脆弱性に対するものです。 明示的な許可なしにシステムに対して使用しないでください。
| プロパティ | 値 |
|---|
| コンポーネント | camel-pqc (AwsSecretsManagerKeyLifecycleManager) |
| 影響を受けるクラス | org.apache.camel.component.pqc.lifecycle.AwsSecretsManagerKeyLifecycleManager#deserializeMetadata |
| CWE | CWE-502: 信頼されないデータのデシリアライゼーション |
| 影響 | 鍵管理アプリケーションでのコード実行(メタデータシークレットへの書き込みアクセスが必要) |
| 影響を受けるバージョン | 4.18.0 から 4.18.3 未満、4.19.0 から 4.21.0 未満 |
| 修正バージョン | 4.18.3、4.21.0(camel-pqc は 4.14.x LTS ラインにはありません) |
| JIRA | CAMEL-23726 |
| 報告者 | Venkatraman Kumar (Securin) |