Claude Agent SDKは、Anthropicが配る、AIのエージェント(指示を受けて自分で作業を進めるAI)を自社のプログラムに組み込むための部品です。このPython版に、外から受け取った値によって、サーバーで任意のコマンドが動く脆弱性(CVE-2026-96620)がありました。
深刻度を表すCVSS(4.0)は9.2(Critical)です。直した版の0.2.121は7月17日に出ています。GitHubの脆弱性データベースが確認済みとして載せたのは10月17日で、これから開発部門にDependabot(使っている部品の脆弱性を知らせるGitHubの機能)の通知が届き始めます。日付は日本時間です。
Claude Agent SDKで何が起きるか
Python版のSDKは、Claude Codeのコマンドで動かす版(CLI)を同梱しています。アプリがSDKを呼ぶと、SDKは裏でこのCLIを起動して指示を渡します(SDKの説明書き)。
SDKには、前の会話(セッション)を続きから再開する「resume」という指定があります。会話ごとに振られるセッションIDを渡すと、その続きから作業が進みます。公式の手引きの例では、セッションIDはUUID(ランダムな長い番号)の形です。
告知によると、SDKはresumeの値を確かめずに、そのままCLIを起動するときの指定に並べていました。値がハイフン(-)で始まると、CLIはそれを値ではなく、別の指定として読みます。
攻撃する側がresumeの値を決められると、MCP(AIに外部の道具をつなぐための決まり)のサーバーとして、任意のプログラムを起動させる指定を差し込めました。その結果、CLIが起動するときにコマンドが動きます。SDKで決めた権限の設定(使ってよい道具の制限など)も、この動きは止められませんでした。
GitHubのデータベースのClaude Agent SDKの告知。対象の版と直した版、CVSS 9.2が並ぶ出典: GitHub(GitHub Advisory Database)(引用)
CLIは、SDKを使うアプリと同じ機械の上で動きます。そのため、コマンドはアプリを動かしているサーバーや端末の上で、アプリと同じ権限で動くことになります(編集部の整理)。
どんな作りのアプリが狙われるか
告知は、悪用の前提を次のように書いています。
Exploitation required an application to pass untrusted input as the session ID to resume.
出典: Anthropic「Argument Injection via resume Option Allows Arbitrary Command Execution」
アプリが、信頼できない入力をセッションIDとしてresumeに渡している場合に限る、という意味です。修正のプルリクエスト(変更の申し出)は、例として「セッションを再開する」窓口が、リクエストからセッションIDを受け取る作りを挙げています。
たとえば、社内のチャットの画面やAPIで、利用者が「前の会話の続き」を選ぶと、ブラウザーから送られたIDをそのままresumeに入れる作りです。この場合、IDの欄に細工した値を送れる人は、だれでも条件に当たります。社外の人も使える窓口なら、その人たちも含まれます(編集部の整理)。
CVSSの内訳も、これと合います。攻撃の経路はネットワークで、必要な権限と利用者の操作はなしです。ただし「攻撃の前提の条件がある」(AT:P)となっています。
一方、resumeを使っていないアプリや、サーバーの側で発行して保存したIDだけを渡すアプリは、告知の条件に当たりません。
0.2.121では、会話のIDを決める「session_id」という指定も、同じ形に直しました。プルリクエストによると、こちらはCLIの側で値を必ず受け取る作りのため、以前からハイフンで始まる値も値として扱われていました。揃えるために直した、という説明です。
CLIに好きな指定を渡せる「extra_args」は、今回は直していません。プルリクエストは、extra_argsは「CLIに何でも渡せる」ための入り口で、信頼できない値を流し込むこと自体がより大きな問題だとしています。
対象の版と直した版
| パッケージ |
対象 |
直した版 |
| claude-agent-sdk(Python、pipで入れる) |
0.2.121より前 |
0.2.121(7月17日) |
| @anthropic-ai/claude-agent-sdk(TypeScript、npmで入れる) |
告知なし |
0.3.208(7月14日)に同じ修正 |
告知の対象は、Python版のパッケージだけです。TypeScript版には、10月18日時点で告知が出ていません。Python版の修正のプルリクエストは、TypeScript版が同じ修正を0.3.208で入れたと書いています。
TypeScript版の変更履歴(0.3.208)にも、resumeのようにハイフンで始まる値が、別の指定として読まれてしまう不具合を直したとあります。
Python版のSDKの0.2.121のリリースノート。resumeとsession_idの渡し方を直した出典: Anthropic(anthropics/claude-agent-sdk-python)(引用)
日付を整理します。修正は7月16日に取り込まれ、0.2.121は7月17日に出ました。Anthropicは9月12日に自分のリポジトリで告知を出し、GitHubのデータベースが10月17日に確認済みとして載せました。
10月18日時点の最新の版は、Python版が0.2.168(PyPI)、TypeScript版が0.3.302(npm)です。PyPIとnpmは、それぞれの言語の部品の配布先です。
悪用について、告知とリリースノートに記載はありません。米国CISAのKEV(悪用が確認された脆弱性の一覧)には、10月16日版で載っていません。米国NVD(脆弱性のデータベース)は10月17日に受け付けた段階で、まだ分析していません。
Dependabotの通知が今になって届く理由
修正から3か月たって通知が届くのは、GitHubの仕組みによります。GitHubの文書によると、Dependabotは、GitHubが確認した(GitHub-reviewed)告知が新しく出たときに通知します。
今回の告知が確認済みになったのは10月17日です。古い版を依存の一覧に書いたままのリポジトリには、これから通知が出ます。開発部門から「Criticalの通知が来た」と相談があれば、この件かもしれません。
影響する会社・しない会社
- 影響する: Python版のClaude Agent SDKの0.2.121より前を、社内のアプリや業務の自動化に使い、resumeに利用者や外部から来た値を渡している会社
- 影響する: とくに急ぐのは、社外の人も使えるチャットやAPIで「会話の続き」を受け付けている会社です
- 確認が要る: 開発会社や委託先が作ったAIのエージェントを使っている会社。SDKの版とresumeの扱いは、作った側に聞きます
- 確認が要る: TypeScript版の0.3.208より前を使っている会社。告知は出ていませんが、同じ修正が入った版へ上げます
- 影響しない: Python版を0.2.121以降に上げた会社
- 影響しない: Agent SDKを使っていない会社。告知の対象はPythonの部品のclaude-agent-sdkで、社員がClaudeのチャットやClaude Codeを手で使うことは対象に挙がっていません
- 告知の条件の外: resumeを使っていない、またはサーバーで発行したIDだけを渡している会社。それでも、告知は最新の版への更新を勧めています
情シスが今日やること
- SDKを使っているかを洗い出します。 開発部門と委託先に聞き、GitHubのDependabotの通知も見ます。依存の一覧(requirements.txt、pyproject.toml、ロックファイル)でclaude-agent-sdkを探し、動いている環境では
pip show claude-agent-sdk で版を確かめます。
- 0.2.121以降へ上げる日を決めます。 告知は最新の版を勧めています。Python版のSDKはCLIを同梱しているため、上げるとCLIの版も変わります(リリースノート)。検証の環境で動きを確かめてから、本番に入れます。
- resumeに何を渡しているかを、コードで確かめます。 利用者から来た値をそのまま渡していないかを見ます。セッションIDはサーバーの側で持ち、利用者には別の番号で結びつけるか、受け取るならUUIDの形かを確かめてから渡します(編集部の補足)。
- extra_argsにも外の値を入れていないかを見ます。 extra_argsはCLIに何でも渡せる入り口で、今回の修正の対象外です(プルリクエスト)。
- エージェントを動かすサーバーの権限を絞ります。 専用のアカウントやコンテナで動かし、APIキーなどの秘密の情報は要るものだけを渡します。社内でAIのエージェントを作るときの決まりに、SDKの版の管理と、外から来た値の扱いを入れておきます。
エージェントに渡す権限の決め方は、「APIキーは.envに」はもう危ない AIエージェントに渡す権限の決め方でも扱っています。Claude Codeそのものの脆弱性は、AnthropicのClaude Codeに脆弱性、プラグイン導入前に版確認にまとめています。