Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-95664 — CVE-2026-95664 の再現可能な Spring Boot および Quarkus の再現プログラム。camel-aws2-s3 の CamelAwsS3Key ヘッダーを介した Simple 式インジェクションを実証し、修正を検証します。 | Kitploit
ツール/GitHubGitHub/oscerd/cve-2026-95664
防御ツール脆弱性分析エクスプロイトウェブアプリケーション悪用学習と教育
GitHuboscerd/cve-2026-95664

CVE-2026-95664

CVE-2026-95664 の再現可能な Spring Boot および Quarkus の再現プログラム。camel-aws2-s3 の CamelAwsS3Key ヘッダーを介した Simple 式インジェクションを実証し、修正を検証します。

リポジトリを見る
1日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-95664 — camel-aws2-s3: ヘッダーで指定されたオブジェクトキーが Simple 式として評価される

Apache Camel の脆弱性に対する実行可能な概念実証(PoC)再現プログラムです。この脆弱性では、camel-aws2-s3 プロデューサーが CamelAwsS3Key メッセージヘッダーからオブジェクトキーを取得し、4.8.0 以降、AWS2S3Utils.determineKey() がその値に ${ または $simple{ が含まれている場合にその値を Simple 言語 に渡していたため、ルートが動的キーを使用できるようになっていました。この評価は、ルートで設定された keyName オプションと同様に、ヘッダーから取得した値にも適用されていました。

ランタイムディレクトリスタック
Camel Spring Bootcamel-spring-boot/Spring Boot 3.5.13 + camel-aws2-s3 4.22.1
Camel Quarkuscamel-quarkus/Camel Quarkus 3.39.0 (Quarkus 3.39.0, Camel 4.22.0)

なぜこれが重要なのか

ヘッダーはルート設定ではありません。aws2-s3 コンシューマーは、作成するすべてのエクスチェンジに CamelAwsS3Key を設定し、その値は読み取ったオブジェクトのキー、つまりバケット内のオブジェクト名です。したがって、1 つの aws2-s3 エンドポイントから消費して別のエンドポイントへ送信するだけのルートでも、消費された各オブジェクトの名前がプロデューサーに到達し、評価されていました。

そのようなルートが消費するバケット内のオブジェクト名を選択できる者、通常はそのバケットへのアップロードが許可された任意のプリンシパルが、任意の Simple 式を Camel プロセス内で評価させることができました。Simple は JVM システムプロパティ、環境変数、設定プロパティを読み取ることができ、これらにはしばしば認証情報が含まれます。また、クラスパスに camel-bean がある場合は、レジストリ内の Bean のメソッドを呼び出すこともできます。

プロデューサーに keyName を設定することは保護にはなりませんでした。なぜなら、ヘッダーがそれより優先されるからです。

実行方法

cd camel-spring-boot          # or: cd camel-quarkus
mvn clean package
docker compose up -d --build
until [ "$(curl -s http://localhost:8080/exploit/ready)" = "Started" ]; do sleep 1; done
curl -s http://localhost:8080/exploit/attack
docker compose down

影響を受けるビルドでの出力(両方のランタイムで同一):

Route under attack: from("direct:archive").to("aws2-s3://archive-bucket?amazonS3Client=#s3Client&region=eu-west-1&autoCreateBucket=false&keyName=archived.txt")
The route configures a FIXED destination key: keyName=archived.txt. It never asks for a
dynamic key. The CamelAwsS3Key header, which the aws2-s3 consumer sets to the name of the
object it read, takes precedence over that option.

Values the deployment holds but the route never references:
  system property app.db.password = PROD-DB-PASSWORD-s3cr3t-77
  environment AWS_SESSION_TOKEN    = ENV-SESSION-TOKEN-s3cr3t-88

1) An ordinary object name in the consumed bucket: 'invoice-2026.pdf'
     key the producer wrote: [invoice-2026.pdf]

2) An object an uploader named '${sys.app.db.password}'
     key the producer wrote: [PROD-DB-PASSWORD-s3cr3t-77]
     the JVM system property was resolved into the key: true

3) An object an uploader named '${env.AWS_SESSION_TOKEN}'
     key the producer wrote: [ENV-SESSION-TOKEN-s3cr3t-88]
     the environment variable was resolved into the key: true

4) The $simple{} marker is handled the same way: '$simple{routeId}-${exchangeId}'
     key the producer wrote: [route1-D953127238C9F86-0000000000000000]
     evaluated rather than used literally: true

5) CONTROL - the same object name through a route doing removeHeader("CamelAwsS3Key")
     key the producer wrote: [archived.txt]
     the configured keyName was used instead: true

>>> PROVEN: ...

プローブ5は、まだアップグレードできないデプロイ向けにアドバイザリが提示する回避策を、実際に動作する形で示したものです。

配線の仕組み

AWSアカウントもネットワークも不要です。再現プログラムは、S3の録画用スタンドイン(amazonS3Client=#s3Client)を登録し、プロデューサが実際に書き込みを要求したキーを捕捉します。これが観測すべき唯一の要素です。実際のAWS2S3Producerと実際のAWS2S3Utils.determineKey()が実行され、最後のSDK呼び出しだけが捕捉されます。

ドライバはCamelAwsS3Keyを、消費されたオブジェクトの名前に設定します。これはaws2-s3コンシューマが行うこととまったく同じなので、コンシューマ側に独自のバケットは必要ありません。

スタンドインはheadBucketにも応答します。これはAWS2S3Endpoint.doStart()がルート開始前にバケットの存在を確認するためです。このチェックは脆弱性とは無関係です。

脆弱性の概要

項目値
コンポーネントcamel-aws2-s3 (AWS2S3Utils.determineKey())
CWECWE-917 (式言語インジェクション)
深刻度中
攻撃ベクトルaws2-s3ルートが消費するバケット内のオブジェクト名に${または$simple{が含まれ、それがCamelAwsS3Keyでプロデューサに運ばれる
影響Camelプロセス内でSimple式が評価される: システムプロパティ、環境変数、設定プロパティの読み取り、camel-beanが存在する場合はレジストリBean上のメソッド呼び出し
影響を受けるバージョン4.8.0から4.18.5未満、4.19.0から4.22.2未満(4.8.0より前のリリースはヘッダ値をそのまま使用していたため影響なし)
修正済みバージョン4.18.5、4.22.2、4.23.0
JIRACAMEL-24901
クレジットApache Software FoundationのAndrea Cosentino

アドバイザリ: https://camel.apache.org/security/CVE-2026-95664.html

バケット名も同じ評価を経ていましたが、コンシューマは自身のエンドポイントに設定されたバケットをバケットヘッダに入れるだけで、リモートオブジェクトに由来する値を使うことは決してないため、バケット名はこの経路では到達できませんでした。

修正内容

動的なSimple式として扱えるのは、ルートによって設定されたキーだけです。ヘッダ経由で提供されたキーは、リテラルとして使用され、評価されることはなくなりました:

String key = exchange.getIn().getHeader(AWS2S3Constants.KEY, String.class);
if (ObjectHelper.isEmpty(key)) {
    // only the configured key (supplied by the route) may be a dynamic simple expression;
    // a key provided through the header is used literally and never evaluated
    key = configuration.getKeyName();
    if (key != null && hasSimpleFunction(key)) { ... evaluate ... }
}

main 上で apache/camel#26746(1fd7a667)として修正され、camel-4.22.x と camel-4.18.x にバックポートされています。

アップグレード後、メッセージヘッダー経由で指定されたキー名またはバケット名はそのままリテラルとして使用されます。そのため、CamelAwsS3Key や CamelAwsS3OverrideBucketName に未評価の Simple 式を意図的に設定していたルートは、ルート内でその式を評価する(setHeader(..., simple(...)))か、エンドポイントの keyName / bucketName オプションとして設定する必要があります。

修正済みビルドの確認

camel.version を 4.22.2 に設定して再度実行してください。4.22.1 → 4.22.2 で検証済みです:

2) An object an uploader named '${sys.app.db.password}'
     key the producer wrote: [${sys.app.db.password}]
     the JVM system property was resolved into the key: false

4) ... key the producer wrote: [$simple{routeId}-${exchangeId}]
     evaluated rather than used literally: false

>>> NOT reproduced: the header was used literally.

免責事項

このリポジトリは教育および防御目的で公開されています。Apache Camel ユーザーが脆弱性を理解し、影響を受けているかどうかを確認し、アップグレードによって問題が解決することを確証できるようにするためのものです。所有または運用していないシステムに対してこの資料を使用しないでください。

ツールをダウンロード