FlawOpen

flawopen.com/Teardowns/cve-2026-105812-bedrock-agentcore-generated-code-injection

● CVE-2026-105812 · CVSS v4 8.8 · 高
セキュリティ研究 · FlawOpen

CVE-2026-105812:AgentCore取込時のコード注入

Bedrock AgentCore Starter Toolkit 0.3.13以前では、エージェント設定が安全にエンコードされず、生成Pythonに取り込まれる場合がありました。別の利用者がエージェントをインポートし、その後実行またはデプロイすると、生成コードが利用者のローカル権限またはAgentCore Runtime実行ロールで動く可能性があります。パッケージを更新しても、生成済みの成果物は修復されません。[1], [2], [3]

💡 わかりやすい解説 (ELI5)

インポーターは、エージェントの設定をPython命令に変換するラベルプリンターのようなものです。修正前は、一部の値が安全にエスケープされず引用符の間に貼り付けられていました。値に含まれる引用符で文字列が早く閉じ、続きがPython構文として解釈されることがあります。修正では値をPython文字列リテラルとしてエンコードし、データのまま保ちます。[2], [5]

主要な概念と専門用語

エージェントのインポート
Bedrockエージェントの設定を読み取り、StrandsやLangChainなどのフレームワーク向けにローカルPythonプロジェクトを生成するStarter Toolkitの処理。[2], [5]
コード生成
プログラムのテンプレートと設定値などの入力を組み合わせてソースコードを作ること。[2], [5]
Python文字列リテラル
テキストをデータとして表すソースコード上の記法。repr()は文字をエスケープした引用形式を返し、Python構文になることを防ぎます。[5]
CWE-94
コード生成の制御不備。入力データが安全にエンコードされず、生成ソースに挿入されました。[2], [3]
生成済み成果物
エージェントのインポートで作られたローカルまたはデプロイ済みコード。AWSによると、影響を受けた成果物は置き換える必要があり、インポーターの更新だけでは不十分です。[1], [2]

フレームワーク対応

  • このガイドで説明する弱点の CWE 参照: CWE-94

根本原因の分析 (Root Cause)

脆弱なインポート変換処理は、f-stringとテンプレートを使ってPythonを組み立て、プロンプトなどBedrockエージェントの設定値を直接埋め込んでいました。Python文字列の区切り文字を含む値は、想定されたテキストの文脈から抜け出す可能性がありました。0.3.14の修正では、repr(str(value))を使うpython_string_literal()と、JSON互換データを正規化するpython_data_literal()を導入し、生成文字列をこれらのエンコーダーに通します。メンテナーのアドバイザリが示す攻撃連鎖では、同じAWSアカウント内の認証済み主体がエージェントデータを変更でき、別の利用者がそれをインポートした後、生成プロジェクトを実行またはデプロイする必要があります。生成コードは利用者のローカル権限またはAgentCore Runtime実行ロールで動きます。AWSは、影響バージョンで作られた成果物について更新だけでは不十分と説明しています。0.3.14以降で再インポートし、ローカルおよびデプロイ済みの出力を置き換えてください。CVE-2026-106032はインポート時の外部OpenAPI参照に関する別の問題であり、このコード生成の欠陥とは異なります。

生成コードの脆弱性に到達する条件

境界文書化された条件防御策
Toolkit のバージョン0.3.13 以前は、一部の値を安全なリテラルエンコードなしで生成 Python に挿入していた。0.3.14 以降へアップグレードするか、@aws/agentcore に移行する。
データを変更できる主体同じ AWS アカウント内の認証済みプリンシパルが Bedrock Agent の関連フィールドを変更できる。エージェントデータの書き込み権限を信頼できるプリンシパルに限定する。
別ユーザーによるインポート別のユーザーが影響を受ける Starter Toolkit の手順で変更済みエージェントをインポートする。他のプリンシパルが提供したエージェントデータを信頼せず、インポート前に出所を確認する。
実行の契機インポートしたユーザーが生成プロジェクトを実行またはデプロイすると、そのコードはローカル権限または AgentCore Runtime ロールで動作する。分離した最小権限の認証情報とランタイムロールでインポートとテストを行う。
生成済みの成果物パッケージを更新しても、影響バージョンで既に生成されたプロジェクトは修正されない。修正版で再インポートし、ローカルとデプロイ済みの成果物を置き換える。

ステップ・バイ・ステップの攻撃フロー

ステップ 1

同じアカウントの主体がエージェントデータを変更できる

前提条件は、AWSアカウントの認証済み主体が、アクショングループのスキーマ、コラボレーション指示、プロンプトの上書きなど、Bedrock Agentの関連フィールドを変更できることです。[2]

ステップ 2

別の利用者がエージェントをインポートする

影響を受けるStarter Toolkitの処理が変更されたデータを読み、Pythonプロジェクトを生成します。欠陥はコード生成の境界にあり、通常のインポートで直ちに実行されるわけではありません。[2], [5]

ステップ 3

未エンコード値がPythonソースに入る

0.3.13以前では、一部の自由形式の設定値が安全なリテラル化なしで、引用符付きPythonテンプレートに埋め込まれていました。[2], [5]

ステップ 4

生成プロジェクトを実行またはデプロイする

インポートしたエージェントを利用者が実行またはデプロイすると、生成コードがローカル権限またはAgentCore Runtime実行ロールで動く可能性があります。[1], [2]

ステップ 5

更新し、生成済み出力を置き換える

0.3.14ではPythonリテラルのエンコードが追加されました。修正版で再インポートし、ローカルおよびデプロイ済みの出力を置き換えてください。AWSは非推奨のStarter Toolkitから@aws/agentcoreへの移行を推奨しています。[1], [5]

ソースコード比較:脆弱 vs 堅牢化

この上流差分の抜粋では、脆弱な変換処理が設定値を三重引用符のPython文字列へ直接埋め込んでいたことが分かります。修正では完成したテキストを python_string_literal() に渡し、repr() でデータとしてエスケープします。0.3.14では他の生成文字列とJSON互換データにも同じ原則を適用し、出力を解析してマーカーが文字列定数のままか確認する回帰テストも追加されました。これはソースコードの分析であり、注入値や実行可能なエクスプロイトではありません。[2], [5]

ソース抜粋: services/import_agent/scripts/base_bedrock_translate.py と services/import_agent/utils.py — PRE_PROCESSINGプロンプトの該当箇所

脆弱な実装
# 0.3.14 の修正前: テンプレート値は三重引用符を使う Python ソースに直接挿入されていた。
self.prompts_code += f"""
    PRE_PROCESSING_TEMPLATE=\"""\n
    {config["basePromptTemplate"]["system"]}
    \"""
"""
堅牢化されたセキュアパッチ
# 0.3.14: 値全体を Python の文字列リテラルとしてエンコードする
prompt = f"\n\n    {config['basePromptTemplate']['system']}\n    "
self.prompts_code += f"\n    PRE_PROCESSING_TEMPLATE={python_string_literal(prompt)}\n"

# services/import_agent/utils.py
def python_string_literal(value: Any) -> str:
    return repr(str(value))

エンジニアリング&システム堅牢化チェックリスト

参考資料