『読めない命令』は検閲を通り抜ける──GitHub Copilot CLIが、閲覧したページの暗号文を自分で解いて .env を28秒で運び出した
Adversa AIが公開した「暗号文脈インジェクション(CCI)」は、暗号化した命令で検閲をすり抜け、GitHub Copilot CLIに自分でローカルの秘密情報を運び出させる手口。autopilotと外部URL閲覧が前提で、GitHubは脆弱性ではないと線引きした。
GitHub Copilot CLI について、閲覧した一枚のWebページだけで開発者のローカルファイルを攻撃者へ送り出せる手口が報告されました。セキュリティ企業 Adversa AI が10月6日に公開した「Cryptographic Context Injection(CCI、暗号文脈インジェクション)」で、暗号化した命令を使って従来のプロンプトインジェクション対策をすり抜ける点が特徴です。
『読めない命令』が、検閲をすり抜ける仕組み
通常、エージェント向けのインジェクション対策は、取り込んだテキストを走査して不審な指示を弾きます。CCIはこの前提を外します。攻撃者は命令そのものを強力な暗号文(ciphertext)に変え、復号鍵と「これを復号せよ」という指示を同じページに添えます。研究者の Rony Utevsky 氏は、CCIは悪意ある命令を強い暗号文として届け、鍵素材と復号指示を添えて、エージェント自身の実行環境でその復号を走らせる、と説明しています。
要点は、フィルタが読むのは文字列であって、実行結果ではないことです。Adversa AI は「静的なガードレールはテキストを読むが、実行はしない」と指摘します。暗号文は復号して初めて中身が現れるため、取り込み時点の分類器は悪意を検知できません。しかも復号された平文は、エージェントが自分で動かしたコードの出力として現れます。結果として、外部から来た命令であるにもかかわらず、エージェントは自らの内部出力のように信用してしまいます。
28秒で .env.prod が運び出された
攻撃が成立する前提は、Copilot CLI が autopilot(自律)モードで動いていること、利用者がエージェントに攻撃者のURLを見に行かせること、そして許容的なモデルがセッションを担当していること、の3点です。実証では次の順で情報が抜かれました。
- 利用者が悪意あるURLを Copilot CLI に渡す。
- ページには暗号文と2つの「復号鍵」が置かれている。
- 1つ目の鍵は偽物で、鍵を組み立てるにはローカルファイルの読み取りが必要な“テンプレート”になっている。
- エージェントは鍵を完成させる過程で
.env.prodなどのローカルファイルを読む。 - 本物の2つ目の鍵で復号が成功し、現れた命令が別のURLへのアクセスを促す。
- そのURLに、収集した秘密情報が載って攻撃者の手元へ届く。
Adversa AI によれば、すべての秘密情報を含む .env.prod はおよそ28秒で外部へ送られ、ファイルがマシンを離れたことを示す表示は画面に一切出なかったとされます。
同じ命令でも、担当モデル次第で通ってしまう
この攻撃は、どのモデルが処理するかで結果が割れました。処理モデル別の挙動は次のとおりです。
| 処理したモデル | 結果 |
|---|---|
| Microsoft mai-code-1.1-flash | 試行の約50%で攻撃を完遂 |
| OpenAI GPT-5.6(2モデル) | 同じ命令を拒否 |
問題は、モデルの自動振り分け(Auto)を使うアカウントでは、脆弱なモデルと安全なモデルのどちらが割り当てられるかを利用者が選べず、見えもしない点です。Adversa AI はこれを「モデルの当たり外れ」と表現します。同じ操作でも、その時どのモデルに当たったかで安全性が変わってしまうわけです。
「脆弱性ではない」というGitHubの線引き
GitHub のバグバウンティ担当はこの報告を確認したうえで、脆弱性とは分類しませんでした。理由は、利用者が攻撃者の管理するコンテンツを取りに行くよう Copilot CLI に明示的に指示し、自律的に動く権限を与えているため、というものです。即時の修正予定は示されず、将来的な機能制限の可能性に触れるにとどまりました。
研究者側はこれに反論しています。曰く、同じ命令は平文なら製品自身の拒否動作ではねられる、暗号化だけがそれを通してしまう——つまり、すり抜けを許しているのは暗号化という手口そのものだ、という指摘です。どちらの言い分を採るにせよ、「自律エージェント × 外部コンテンツ × 広い権限」という組み合わせが危ういという点では共通しています。
いま打てる手
まず利用者側でできるのは、autopilot(自律)モードを外し、信頼できないページをエージェントに自律閲覧させないことです。より踏み込んだ防御として、Adversa AI は次の5層を挙げています。
| 対策 | 内容 |
|---|---|
| 解決済み引数の記録 | ツール呼び出しを、テンプレートではなく実際に解決された引数の形で記録する |
| 連鎖の検知 | 「外部コンテンツ取得+コード実行+ファイル読取+外部通信」が連なったら警告する |
| 不可逆操作のゲート化 | 新しい通信先への接続や作業領域外への書き込みに確認を求める |
| 取得内容の隔離 | 取り込んだページは、ツールや認証情報に触れないサンドボックスで処理する |
| 調達時の精査 | ツール出力と命令チャネルを分離しているか、全モデルがインジェクション耐性基準を満たすかを導入前に確認する |
CCIは、取り込んだ文字列を検閲する従来の防御が、エージェント自身の実行環境を介されると無力化しうることを示した事例といえます。暗号化や難読化で中身を隠されると入口での検査だけでは追いつかない——こうした懸念は以前から指摘されており、今回はそれが具体的な手口として示された形です。自律で動かすほど便利になる一方、何を外から読ませ、どこまでの権限を預けるかは、依然として利用者側の設計判断に委ねられています。
参照: The Register / Adversa AI / Cybersecurity News / VentureBeat


