
Python
Pythonは明確で読みやすい構文を持っているため、プログラミング初心者にもおすすめの言語です。また多くのコミュニティがあり、それぞれがライブラリ開発やフレームワーク開発に貢献しています。
イベント
マガジン
技術ブログ
はじめにはじめまして、高知大学人文社会科学部人文社会科学科4年の坂下康信です。2026年8月3日から9月11日まで、LINEヤフー株式会社のLINEギフトのSRE業務を担当するチームでインターンに参加...
本ブログは 2026 年 10 月 15 日に公開された AWS Blog “ AWS Security Agent (now part of AWS Continuum) exploited 33 of 37 new real-world CVEs ” を翻訳したものです。 AWS は、自律型ペネトレーションテストエージェントである AWS Security Agent (now part of AWS Continuum) を、最近公開された実在の CVE (Common Vulnerabilities and Exposures) 37 件に適用しました。各 CVE は、脆弱性の意図されたシンクにフラグを隠した、稼働中のコンテナ化されたターゲットとしてパッケージ化されています。エージェントは、認証なし、または低権限の状態から開始します。与えられるのはエンドポイント URL と 1 行のヒントのみで、エクスプロイトや概念実証 (PoC) はありません。この条件で、脆弱性を発見し、動作するエクスプロイトを構築し、必要に応じてプリミティブを連鎖させ、フラグを抽出する必要がありました。 結果 37 件中 35 件のフラグを取得しました。 37 件中 33 件 (89.2%) は、 意図された 脆弱性をエンドツーエンドでエクスプロイトして取得しました。 各チャレンジの正規の PoC と照合するサンプル単位の整合性監査で確認済みです。 2 件の取得を再分類しました。 整合性監査の結果、2 件の取得は意図された経路以外によるものと判明したため、該当チャレンジを強化したうえで、未解決として扱っています。 2 件は取得に失敗しました。 いずれもエージェントはバグを発見してエクスプロイトしましたが、フラグを読み取る前にターゲットをダウンさせてしまいました。本番環境での作業を統制する非破壊的なガードレールにより、こうした事態がお客様のシステムで発生することを防いでいます。 注: この 2 件の取得と 2 件の失敗の詳細は、本記事の後半で説明します。 対象となるソフトウェアは、お客様のサービスが実際に動作させているものと同種です。Web フレームワーク、コンテナレジストリ、機械学習 (ML) および AI プラットフォーム、E コマーススタック、tRPC API、複数のメディアプラットフォーム、LDAP 管理コンソールなどが含まれます。脆弱性クラスは 8 つあり、SQL インジェクションやサーバーサイドリクエストフォージェリ (SSRF) から、複数ステップのクロスサイトスクリプティング (XSS) による管理者クッキー窃取の連鎖まで多岐にわたります。本記事で説明する結果はすべて、バグレポートからではなく低権限の状態から開始し、動作するエクスプロイトによって取得したフラグです。 新しいベンチマークを構築した理由 公開されている CVE ベースのエージェントベンチマークは、実在するコンテナ化された脆弱なソフトウェアに対してエージェントを実行できる点で、確かな意義があります。一方で、コンタミネーション (学習データへの混入) のない状態を保てないという弱点があります。CVEBench や XBOW のようなスイートは、事実上飽和状態にあります。バグとその解説記事が学習データに含まれると、現在のモデルはそれらの脆弱性を認識し、ほぼ即座にフラグを取得してしまうためです。 キュレーションされたベンチマークは、ある時点のスナップショットです。CVE が選定され、エクスプロイトの解説記事が公開されるのは一度きりです。そのため、スナップショットが論文として発表されるころには、フロンティアモデルがそれらの解説記事や公開されている PoC を学習済みである可能性が非常に高くなります。それ以降、スコアには本来別々に測定すべき 2 つの要素が混在します。エージェントがバグを実際にエクスプロイトできるかどうかと、モデルが既に答えを記憶しているかどうかです。スコアが示す指標としての有効性は、月を追うごとに低下していきます。 そこで AWS は、公開されているスイートと同じ考え方に基づきながら、新たに公開された脆弱性を継続的に取り込む、独自開発の CTF (Capture The Flag) 形式の最新 CVE ベンチマークを構築しました。このベンチマークは、今四半期に実運用環境で発生している脆弱性クラスを追跡し、CVE の公開と同じペースで拡大していきます。 AWS は、コンタミネーションが入り込む 2 つの経路の両方に対処しています。1 つ目は記憶の経路で、鮮度の高さによって遮断します。チャレンジは、エンドツーエンドの解法がモデルの学習データに含まれている可能性が低い程度に、最近公開された CVE から選定しています。2 つ目は取得の経路で、ランタイムでの CVE 検索を無効化して遮断します。エージェントはエクスプロイトの最中に公開済みの PoC を取得できないため、ターゲットの情報のみを基に動作します。この 2 つの対策は独立しています。一方はモデルが解法を記憶していることへの対策であり、もう一方は新たに解法を取得することへの対策です。いずれも単独では完全な保証にはなりません。最近公開された CVE であっても、セキュリティアドバイザリや部分的な議論、断片的な PoC として学習データに紛れ込む可能性があります。そのため AWS はこのベンチマークを、「コンタミネーションフリー」ではなく「コンタミネーション低減」として報告しています。 「今後の展開」 で触れている取り組みにより、コンタミネーションはさらに低減される予定です。 注 (これまでの数値について): AWS は、CVE-Bench のような確立された公開スイートに対する AWS Security Agent の CVE ベンチマーク結果を 以前報告しています 。本ベンチマークはこれとは異なる尺度で、コンタミネーションを低減し、継続的に更新し、取得ごとに監査します。両者は同じ内容の再掲ではなく、補完的なものとしてとらえてください。 データセットの概要 各チャレンジは、自己完結したパッケージです。 ライブターゲット : 隔離されたサンドボックス内で docker-compose から起動し、影響を受けるバージョンの実際のアップストリームソフトウェア (または忠実な最小限の再現環境) を実行します。 意図されたシンクに配置されたフラグ : データベースの行、管理者のセッションクッキー、内部専用の設定 API、またはそのバグを経由した場合のみ到達できるファイルなどです。脆弱性をエクスプロイトしない限り、フラグを読み取ることはできません。 正規の PoC : 想定された解法を記述したものです。エージェントには一切公開せず、AWS が取得結果を監査する目的でのみ使用します。 最小限のメタデータ : エンドポイント URL、初期認証情報 (ある場合)、1 行のヒントなどです。 今回のサンプルは、2025~2026 年の CVE 37 件です。幅広い脆弱性クラスを対象とし、設定ミスの発見だけでは解けず、実際のエクスプロイトを必要とするものを選定しています。 実行の流れ ベンチマーク内のすべての CVE は同一の固定パイプラインで実行されるため、脆弱性クラスや集計の切り口が異なっていても、結果を比較できます。 図 1: CVE パイプライン 各実行は、次の 7 つのステージで進みます。 ターゲットの起動: 隔離されたサンドボックス内で docker-compose からチャレンジを起動し、意図されたシンクにフラグを配置します。 偵察と発見 : クローラーが、ターゲットのアタックサーフェス (エンドポイント、パラメータ、エントリポイント) をマッピングします。 専門エージェント: 多数の専門エージェントがマッピングされたサーフェスを調査し、リスクの候補を挙げます。 検出結果と検証機能: エクスプロイトを試行する前に、各リスク候補を確認または却下します。 エクスプロイトエージェント: エージェントは、シェル、Python ランタイム、実際のブラウザ、アウトオブバンド (OOB) コールバックリスナーを使用してエクスプロイトを試行します。 フラグの確認: 配置したフラグがエージェントの出力のどこかに現れれば、そのサンプルは取得済みとなります。現れない場合、エクスプロイトエージェントは 10 時間の制限時間が終了するまで試行を続けます。 整合性監査: すべての取得結果について、手動とツールの両方で再確認します。エージェントのトラジェクトリ (実行履歴) を正規の PoC と比較し、意図された脆弱性が実際にエクスプロイトされたことを確かめます。 結果の数値 次の表と図は、Claude Opus 5 上で、サンプルごとに 10 時間の制限を設けて実行した、37 件の CVE (1 エポック) のフルランの結果を示しています。 結果 件数 取得したフラグ数 37 件中 35 件 実際のエンドツーエンドのエクスプロイト (意図された脆弱性、監査済み) 37 件中 33 件 (89.2%) 整合性監査により再分類 (ベンチマークの不備、修正済み) 2 実際の取得失敗 2 対象の脆弱性クラス数 8 複数ステップの連鎖エクスプロイトにより自律的にフラグを取得した件数 6 件超 取得までの所要時間 (中央値) 約 4 時間 次の図は、脆弱性クラス別のベンチマークのカバレッジを示しています。 図 2: 脆弱性クラス別のベンチマークのカバレッジ (結果別に色分け) 次の図に示すとおり、整合性監査後の実行結果では、37 件中 33 件 (89.2%) で、意図された脆弱性を利用してフラグを取得したことが確認されました。 図 3: 整合性監査後の実行結果: 89.2% が意図された脆弱性による取得 (37 件中 33 件) 脆弱性クラス別のカバレッジ 次の表は、37 件の CVE を脆弱性クラス別に分類し、各クラスのチャレンジ数と、整合性監査後にエージェントが意図された脆弱性を利用して実際にエンドツーエンドで取得した数を示しています。失敗と再分類は 3 つのクラスに集中しており、それ以外のクラスはすべて取得できています。 脆弱性クラス CVE 数 実際の取得数 注記 リモートコード実行 (RCE) につながるコマンドインジェクションまたはコードインジェクション 7 7 JavaScript、OS コマンド、フレームワークのコード実行経路 管理者のクッキーを窃取するために使用されたクロスサイトスクリプティング (XSS) 6 6 格納型、SVG、markdown の XSS。管理者ボットと OOB リスナーを介して情報を持ち出し 認証またはアクセス制御の不備 5 5 機能レベルの認可の不備 (BFLA)、安全でない直接オブジェクト参照 (IDOR)、デフォルト認証情報、API ゲートウェイのバイパス SQL インジェクション 5 4 1 件は再分類 (デバッグページからの情報漏えい。監査結果を参照) SSRF 4 3 1 件は再分類 (ネットワークトポロジの不備) ビジネスロジック、クロスサイトリクエストフォージェリ (CSRF)、または検査時と使用時の競合 (TOCTOU) 3 3 投票の改ざん、管理者ボットに対する CSRF、認証の競合状態 RCE につながるファイルアップロード 3 1 2 件は失敗。エクスプロイトの最中にエージェントがターゲットをダウンさせた パストラバーサルまたはローカルファイルインクルージョン (LFI) 2 2 サービス拒否に起因する情報漏えい 2 2 アプリケーションをクラッシュさせると、モニタがインシデントのシークレットを開示する 合計 37 33 注目すべき 3 件の取得事例 集計値からはエージェントがどのくらいの頻度で成功するかはわかりますが、その理由まではわかりません。以下の 3 件の取得事例は、その幅広さを示すために選びました。1 件目は自律的に組み立てられた長い複数ステップの連鎖です。残る 2 件は、既知のペイロードを再生するのではなく、エージェントが障害を越えるために推論を要したエクスプロイトです。いずれも、エンドポイントと 1 行のヒントのみを基にエージェントが取り組んだ、ライブターゲットに対する監査済みのエンドツーエンドの取得です。 6 つのプリミティブからなる完全自律型の連鎖 攻撃対象は、オープンソースのコンテンツ管理システム (CMS) でした。エージェントは、メインのアップローダーとは異なり、CSRF トークンの検証も拡張子チェックも行わない 2 つ目のファイルアップロードエンドポイントを見つけました。これを悪用して、管理者アカウントを完全に侵害しました。次の図に示すとおりです。 図 4: ワークフロー図 取得時のトラジェクトリからの引用です (エンドポイントとペイロードは非表示)。 「セカンダリのドロップゾーンアップロードハンドラー (CSRF トークンなし、拡張子やコンテンツの検証もなし) を悪用して、HTML ページをアップロードしました。コアのアップローダーはこれを拒否しますが、この別経路のシンクは拒否しません。ファイルは同一オリジンで配信され、 document.cookie をエージェントの OOB リスナーへ送信するスクリプトが含まれています」 偵察、プリミティブの発見、ツールのオーケストレーション (アップロード、リスナー、ボットのトリガー)、エクスプロイト後の抽出は、いずれもテンプレートを用いず、エージェント自身が選択しました。 未認証の RCE から root 権限へ 攻撃対象は、AI ワークフロービルダーでした。エージェントは、インポート時にクラス本体がシェルコマンドを実行するカスタムコンポーネントを投稿しました。続いて、プロセスの環境変数から直接フラグを読み取り、次の結果を返しました。 tool result: uid=1000(user) gid=0(root) groups=0(root) … ENV_SECRETS: … FLAG=flag{...} わずか 1 回のリクエストで、root グループのプロセスとしての任意コード実行と、環境変数の完全なダンプが可能になりました。エージェントはコード実行が可能なサーフェスを見抜き、それを悪用して、シークレットをエンドツーエンドで取得しました。 tRPC API を介した、レスポンス全体を読み取れる SSRF 攻撃対象は、セルフホストのダッシュボードアプリでした。tRPC の ping 形式のプロシージャが、攻撃者が自由に指定できる URL を受け取り、アップストリームのレスポンスボディをそのまま返していました。エージェントはこれを使って内部ホストを列挙し、自身のコンテナからは直接到達できない内部専用のエンドポイントに到達しました。 exploit (endpoint redacted): a GET to the vulnerable tRPC procedure with an attacker-controlled internal url → tool result: secret 200 flag{...} (エクスプロイトの内容: 攻撃者が指定した内部 URL を使い、脆弱な tRPC プロシージャに GET リクエストを送信 (エンドポイントは非公開) → ツールの結果: secret 200 flag{...} ) フラグは、ターゲット自身のサーバーサイドの fetch 処理を経由して返されました。これは、意図された SSRF が本来想定している動作そのものです。 検出結果の信頼度: AWS 自身の誤検知を測定 エクスプロイトエージェントは、その検出結果が信頼できなければ役に立ちません。そのため、このパイプラインでは、フラグの取得につながったかどうかにかかわらず、候補となった検出結果をすべて独立して検証しています。次の件数は、フルラン全体に対して検証機能が付与したラベルの集計です。 注: ターゲットに実在する脆弱性が複数ある場合、AWS が狙っていた CVE ではなかったとしても、その検出結果は誤検知とはみなしません。 検出結果の検証結果 件数 エクスプロイト可能と確認 (信頼度: 高) 234 信頼度がより低いもの (中、低、または未確認) 82 検証機能により誤検知と自動ラベル付け 159 重複として追加で除外 1,202 次の図は、提示された 475 件の検出結果が、エクスプロイト可能と確認、低信頼度、誤検知と自動ラベル付けという 3 つの検証ラベルにどのように分かれているかを示しています。 図 5: 組み込みの誤検知フィルターによる検出結果の検証内訳 専用の検証レイヤーが、エージェント自身の誤検知 159 件を検出してラベル付けし、さらに 1,200 件を超える検出結果を重複として除外しました。これにより、確認済みの検出結果はノイズが少なく、高い信頼度を保っています。この自己フィルタリング機能こそが、実用に耐えるペネトレーションテストエージェントと、ノイズの多いスキャナーとを分ける要素です。エージェントは、シードとなった CVE 以外にも、同じターゲット群で信頼度の高い問題を 234 件確認しています。ただし、本ベンチマークは新規の脆弱性発見ではなく、既知の CVE の再現を対象としているため、これらは二次的な結果として扱っています。 すべての成功を監査し、2 件の潜在的な誤りを検出 数値は、精査に耐えるものでなければ公開する価値がありません。そこで AWS は、取得したすべてのフラグのトラジェクトリを、各チャレンジの正規の PoC と比較しました。その結果、2 件の取得はレビューを通過せず、どちらも未解決として再分類しました。 SSRF のチャレンジ。 エージェントはリクエストフォージェリのバグを経由せず、自身のサブネットを列挙して、1 ホップ先にある内部サーバーを検出し、そこに直接アクセスしてフラグを取得しました。巧みな手段ではありますが、テスト対象の脆弱性を迂回しています。AWS はその後、意図された SSRF だけが侵入経路となるよう、この内部サービスを分離されたネットワークの内側に封じ込めました。 SQL インジェクションのチャレンジ。 エージェントはインジェクションを構築せず、アプリケーションを詳細なエラーを出力するクラッシュ状態に陥らせました。そのデバッグエラーページに、フラグを含むサーバー自身の環境情報が表示されていました。効果的な手段ではありますが、テスト対象の脆弱性を利用したものではありません。AWS はアプリケーションを強化し、インジェクションだけがフラグへの到達経路となるようにしました。 これはモデルの失敗ではありません。どちらも、エージェントが意図しない経路でフラグに到達できてしまうベンチマーク側の不備であり、こうした不備をとらえることこそが監査の存在意義です。これが、37 件中 33 件という偽りのない結果です。 エージェントが攻撃対象を壊すとき 最も重要な結果は、2 件の失敗です。いずれもエージェントはバグを発見してエクスプロイトしました。しかし、ベンチマークのフラグ取得という目的のもとで、本番環境での作業を統制する非破壊的なガードレールがない状態で動作した結果、自らのエクスプロイトによって、フラグを読み取る前にターゲットをダウンさせてしまいました。 アプリを操作不能にしました。 ファイルアップロードから RCE に至るあるチャレンジでは、エージェントはコード実行権限を獲得した後も攻撃を強め、アプリケーションのランタイム層が応答を停止しました。トラジェクトリにおける最後の発言は、次のとおりです。 I’ve exhausted read/write vectors on the bricked PHP layer… the app is already 100% non-functional. (操作不能になった PHP レイヤーで読み取り/書き込みの手段をすべて試しました…アプリは既に完全に機能しない状態です) アクセス権は手に入れたものの、フラグを読み取るべき稼働中のアプリがもはや存在しませんでした。 ターゲットをオフラインにしました。 別のチャレンジでは、root レベルのコード実行権限を取得した後も、エージェントはサービスがダウンするまで攻撃を続けました。実行の後半は Connection refused… the server might be down (接続が拒否されました…サーバーがダウンしている可能性があります) という記録で埋め尽くされており、エージェントが採点される時点では、コンテナは既に消えていました。 これは、明暗が入り混じった結果です。全力で動作する自律型の攻撃者は破壊的になり得ます。まさにそのため、次のセクションの内容が重要になります。 信頼性とガードレール: 強力なエージェントを安全に保つ ターゲットをオフラインにできるほどの能力を持つエージェントには、強力なガードレールが必要です。AWS は、その開発に積極的に取り組んでいます。 非破壊的なエクスプロイト。 AWS は、ターゲットの性能や可用性を損なわずに脆弱性を実証できるよう、エージェントを強化しています。破壊的な操作を抑制し、読み取り専用のエクスプロイト実証を優先し、サービスが不安定になった兆候が見られた時点で直ちに手を引くようにします。お客様向けの作業では、影響を実証する過程でサービス停止を引き起こしてはなりません。 ランタイムの信頼性。 実行結果が副次的な損害ではなくエージェントの能力を反映するよう、AWS は長時間実行時のリソース処理と、ターゲットの正常性を回復する機能を強化しています。 ガードレールとスコープ制限の適用。 AWS はガードレール層への投資を継続し、エージェントが認可されたスコープ内で安全に動作するようにしています。これにより、本番環境でも安心して利用できます。 エージェントの能力が高まるほど、ガードレールの重要性も増します。そのため AWS は、ガードレールをすべてのリリースにおける優先事項としています。 この結果が重要な理由 ベンチマークのスコアは、その背後にある手法が信頼できる範囲でしか価値を持ちません。この手法には 3 つの特性があり、89.2% という取得率を信頼でき、具体的な対策の根拠にできるものにしています。 エンドツーエンドでのエクスプロイト。 すべての数値は、低権限の状態から始まる一連の偵察、発見、エクスプロイトの構築、複数ステップの連鎖、抽出を経て、動作するエクスプロイトで取得したフラグに基づいています。 コンタミネーションの低減。 データセットは、学習データとの重複を最小限に抑えるため最近の CVE から選定しており、ランタイムでの CVE 検索も無効化しています。そのため、スコアは記憶ではなくエクスプロイトのスキルをより強く反映し、新たな CVE を追加するたびに更新されます。この 2 つの対策は、コンタミネーションを完全に排除するものではなく、低減するものです。 偽りのない結果を担保する設計。 すべての成功を、意図されたエクスプロイトと照合して監査します。そのため、ベンチマークの不備はそのまま公開されることなく、発見されて修正されます。 このデータセットにおけるエンドツーエンドでの正確な取得率は 89.2% です。AWS はこの数値を出発点として、さらに改善を重ねていきます。 今後の展開 AWS は、このベンチマークを継続的に改善する取り組みを進めています。 検出が難しく、成功を偽装しやすいビジネスロジックのバグや、複数サービスにまたがるエクスプロイトの連鎖に重点を置きながら、短い周期でデータセットを拡大します。 コンタミネーションにさらに対処するための新しい手法を開発します。 本記事で説明した、非破壊的なエクスプロイトとターゲットの正常性の回復に関する取り組みの成果を提供し、高い能力を持つエージェントがサービスを停止させずに影響を実証できるようにします。 データセットが拡大しても数値の正確さを保てるよう、CVE ごとのトラジェクトリ監査を恒久的なゲートとして整備します。 Dazhi Zhang Dazhi は、AWS Continuum のペネトレーションテストチームに所属するシニアセキュリティエンジニアです。セキュリティツールとオートメーション、大規模なマルウェアおよび脆弱性検出サービス、セキュリティアセスメント、脅威モデリング、脆弱性調査など、セキュリティ分野で 15 年の経験を持っています。現在は、ペネトレーションテストエージェントをはじめとするセキュリティエージェントの適合率と再現率を継続的に高めるため、評価手法やベンチマークの設計と改良を担当しています。 Hamed Soleimani Hamed は、AWS のシニアソフトウェアエンジニアで、スケーラブルで可用性の高いシステムの設計と構築において 10 年以上の経験を持っています。新しいものを作ることや複雑な問題を解決することに情熱を持っており、現在はセキュリティテストとソフトウェアデリバリーのための自律型 AI エージェントの構築に注力しています。Hamed の取り組みは、マルチエージェントアーキテクチャ、安全なエージェントランタイム、そしてエージェント型システムを本番環境へ導入するための評価フレームワークにまで及びます。 本ブログは Security Solutions Architect の 中島 章博 が翻訳しました。
はじめに 最近、AIエージェントやコーディングアシスタントの界隈で「Skill(スキル)」という言葉をよく見かけるようになりました。 「サブエージェント(Subagents)と何が違うの?」 「どうやって書けばAIがうまく使ってくれるの?」 そんな方に向けて、この記事では Google 公式の Agent-CLI で実際に使われている Skill のコードを見ながら、その仕組みと書き方のテクニックをわかりやすく解説します。 1. 最近よく聞く「Skill(スキル)」って結局なに? なぜ「サブエージェント」を増やすだけでは限界があるのか? AIに高度な作業をさせたいとき、これ

























