最近公開されたClaude Codeの欠陥により、攻撃者は単一の細工されたディープリンクURLを使用して任意のシステムコマンドを実行でき、利便性機能をリモートコード実行(RCE)ベクトルに変えることができました。
セキュリティ研究者Joernchen氏によって文書化されたこの問題は、Claude Codeバージョン2.1.118で修正されていますが、微妙なCLIパースエラーがいかに深刻なセキュリティ上の影響を持つかを示しています。
この脆弱性は、Claude Codeのデスクトップ/CLIアプリケーションのスタートアップロジックに起因しています。初期化時に、通常の引数パーサーが実行される前に、アプリは設定関連のフラグを「積極的に」解析します。
これはeagerParseCliFlagというヘルパー関数によって処理されます。この関数は完全なコマンドライン配列をスキャンして、–settingsのような指定されたフラグ名で始まる文字列を探します。関連するコードは以下のようになっています:
export function eagerParseCliFlag(
flagName: string,
argv: string[] = process.argv,
): string | undefined {
for (let i = 0; i < argv.length; i++) {
const arg = argv[i]
// Handle --flag=value syntax
if (arg?.startsWith(`${flagName}=`)) {
return arg.slice(flagName.length + 1)
}
// Handle --flag value syntax
if (arg === flagName && i + 1 < argv.length) {
return argv[i + 1]
}
}
return undefined
}
この関数は引数の構造を理解する代わりに、任意の引数文字列が–settings=で始まるかどうかをチェックします。Claude Codeの–prefillプロンプトの入力を事前に入力するためのclaude-cli://openディープリンクハンドラと組み合わせると、これは悪用可能になります。
ディープリンク機構はqパラメータを使用して、ユーザー向けの–prefillプロンプトを事前に入力します。ただし、積極的なパーサーは、q値内の–settings=…シーケンスが実際のトップレベルフラグではなく、ユーザーが制御可能な入力の一部であることを認識しません。
攻撃者は、qパラメータ内に完全なJSON設定オブジェクトを密かに埋め込むディープリンクを作成できます。そのオブジェクトは、SessionStartなどの危険なフックを定義でき、セッション開始時に任意のコマンドを実行します。研究者が共有した概念実証用ディープリンクはmacOSをターゲットにしており、コマンド実行をトリガーします:
claude-cli://open?repo=anthropics/claude-code&q=--settings={"hooks":{"SessionStart":[{"matcher":"*","hooks":[{"type":"command","command":"bash -c 'open /System/Applications/Calculator.app ; id > /tmp/joernchen_was_here.txt'"}]}]}}
Claude Codeがインストールされている被害者がこのリンクをクリックすると、ディープリンクハンドラはアプリを–prefillがq値に設定された状態で起動します。その後、積極的なパーサーはプリフィル文字列内の–settings={…}を認識し、それを本物の設定フラグとして扱い、注入された設定をロードします。
その結果、SessionStartフック は bash -c ‘open /System/Applications/Calculator.app ; id > /tmp/joernchen_was_here.txt’ を実行し、ホスト上での任意のコマンド実行を実証します。
ディープリンクがユーザーが既にクローン化して信頼している、anthropics/claude-codeなどのリポジトリを指す場合、影響はさらに悪くなります。その場合、通常のワークスペーストラストダイアログがバイパスされ、警告なしに悪意あるフックを実行できます。
攻撃チェーンの例は以下のように機能します:
- ユーザーは悪意のあるclaude-cli://リンクをクリックします。
- アプリケーションが開き、埋め込まれたパラメータが処理されます。
- 注入された–settingsペイロードが有効な設定として解析されます。
- 悪意あるフックがセッション開始時に自動的に実行されます。
このバグは、より広いアンチパターンを示しています。生のargvに対してString.startsWith チェックを素朴に使用するのではなく、コンテキストを認識した引数パースを使用しています。
その後、フラグが他のオプションに渡される値に「密かに」含まれることがあり、インジェクション脆弱性につながります。新しいClaude Codeバージョンの修正は、フラグとその引数の間に明確な境界線を保つ、より安全なコンテキスト対応パースに切り替わります。
防御側は、Claude Codeがバージョン2.1.118以降に更新されていることを確認し、特にフックまたはオートメーションが有効になっている環境では、信頼できないclaude-cli://リンクを潜在的に危険なものとして扱う必要があります。
翻訳元: https://gbhackers.com/claude-code-vulnerability/