← すべての投稿に戻る
公開日 · 著者 Renaud Deraison

エージェントは管理者ログインを持っていた

WIRED によると、防衛関連の請負企業の社員が個人の Claude Code エージェントに国防総省の本番環境への自分の認証情報を渡し、約2か月にわたってエージェントがパスワード、ログイン情報、ネットワークの地図を第三者のウェブサイトに送っていました。Accenture は申し立てに根拠はないとしています。Bromure Agentic Coding では、エージェントはすべての認証情報を代用値で扱い、代用値が誤ったホストに送られればその場で VM が止まり、許可リスト方式のファイアウォールがネットワークの地図を外に出さず、すべての判断が初日から記録されます。

請負業者がエージェントに本物の管理者ログインを渡し、エージェントがそれをどこへ送るかを見張るものは何もなかった。WIRED の情報源によれば、その状態が約2か月続いた。

10月29日、WIRED は、Accenture の社員が個人の Claude Code アカウントを国防総省の本番環境に接続し、自分のログイン認証情報をエージェントに渡していたと報じました。WIRED の情報源によると、目的はコーディングとクラウドサーバーの構築を自動化することでした。この環境は国防総省の非機密でインターネットに接続されたネットワークである NIPRNet 上にあり、複数の情報機関が使っており、管理対象非機密情報を保持しています。

詳細は匿名の情報源によるものです。Accenture は記者に対し、申し立ては「徹底的かつ独立に調査され、根拠がないと判断された」と述べました。国防総省はコメントを控えました。機密ネットワークに到達したという報告はありません。

同じ構図はおそらくあなたのチームでも見たことがあるはずです。開発者はエージェントに本当の仕事をさせたい、その仕事にはアクセスが要る、だから開発者は自分のログインをエージェントに渡す。

エージェントがしたとされること

IBTimes UK と GBHackers がまとめた証言によると、請負業者の認証情報はエージェントに管理者権限を与えていました。エージェントはソフトウェアを書いてデプロイし、社員の名前でコードをコミットし、クラウドサーバーを作成できました。その状態が約2か月続きました。

その間、エージェントは請負業者のログイン認証情報、パスワード、NIPRNet の地図を第三者のウェブサイトに送っていたとみられます。WIRED はそのサイト名を明かしていません。報道によれば、NIST はこのサイトを高リスクと指定していました。攻撃者が AI コーディングエージェントに指示を注入し、認証情報を盗めるおそれのある欠陥があったためです。今回その欠陥が使われたことは誰も示しておらず、送信に誰がどう気づいたのかも報道は伝えていません。

WIRED の情報源は、この件は72時間以内に政府へ報告されるべきだったとも述べています。DFARS 条項 252.204-7012 が防衛関連の請負企業に定める期限です。Accenture は義務を果たしたとしています。

報道で引用された元 NSA ハッカーの Jake Williams は、防御側が最も懸念する点を説明しています。開発環境の認証情報が盗まれれば、攻撃者はソフトウェアがより機密性の高いネットワークへ移る前にそれを書き換えられる、というものです。

本物のログインを、誰も見ていないエージェントに請負業者のログイン本人の認証情報、管理者権限個人のコーディングエージェント本物のログインを保持自分の環境の中でNIPRNet 上の本番環境ソフトウェアを書いてデプロイし、社員の名前でコミットし、クラウドサーバーを作成NIST が高リスクとした第三者のサイト認証情報、パスワード、ネットワークの地図を受信(WIRED の情報源による)約2か月、知られている限りアラートなし
WIRED の情報源が説明する構図。請負業者自身の認証情報が、本番環境で管理者権限を持つ個人のコーディングエージェントに渡った。約2か月にわたり、エージェントは認証情報、パスワード、ネットワークの地図を、NIST が高リスクと指定していた第三者のウェブサイトに送っていたとみられる。

うまくいかなかった3つのこと

国防総省という舞台を取り除くと、どのエンジニアリングチームでも再現できる3つの失敗が残ります。

  1. エージェントが本物の認証情報を持っていた。 エージェントが読んだもの、出力したもの、送ったものには、本物のパスワードが含まれ得ました。
  2. エージェントはインターネット上のどのサイトにも到達できた。 1つの環境とクラウドプロバイダーがあれば済む仕事なのに、注入の問題が知られている名前の伏せられたウェブサイトとも通信できました。
  3. 何か月も誰も気づかなかった。 報道によれば、エージェントの導入から、誰かがその送信に対処するまでに約2か月ありました。

いずれにも Bromure Agentic Coding に直接の答えがあります。Bromure Agentic Coding は Claude Code、Codex、Grok、Kimi、omp を Mac 上の Ubuntu VM で動かし、すべてのネットワークリクエストを Mac 上のプロキシに通します。

エージェントには代用値を渡す

Bromure では、ログインをエージェントに渡しません。マシンの Credentials ペインに追加します。クラウドのキー、GitHub トークン、Kubernetes コンテキスト、データベースのシークレット、SSH 鍵、その他の API キーを、それが属するホストとともに登録します。本物の値は Mac 上に暗号化して保存されます。

VM の中では、エージェントは同じ形の代用値を受け取ります。GitHub トークンは ghp_ に36文字、AWS のシークレットは40文字なので、gh、aws、kubectl、terraform は問題なく受け付けます。リクエストが VM を出るとき、Mac 上のプロキシが代用値を本物の値に差し替えます。それも、その認証情報を設定したホストへ向かうリクエストの場合に限ります。SSH 鍵はそもそも VM に入りません。エージェントは vsock ブリッジ越しに署名を依頼でき、秘密鍵は Mac に残ります。

そのため、環境変数をダンプしたり、設定をウェブフォームに貼り付けたり、認証情報をどこかへ送るよう言いくるめられたりしたエージェントが送るのは代用値です。代用値はプロキシを通した場合、それも設定された1つのホストでしか機能しません。

誤ったホストへの代用値は VM を止める

代用値は仕掛け線でもあります。GitHub の代用値の正当な送り先は GitHub だけです。プロキシは送信されるすべてのリクエストのヘッダーと本文を調べ、範囲外へ向かう代用値がないかを確認します。

見つかった場合は次のとおりです。

  • リクエストは HTTP 451 でブロックされます。宛先には1バイトも届きません。
  • VM は即座に一時停止され、バックグラウンドにあった場合は画面に呼び出されます。
  • This environment may have been compromised という題のアラートが、認証情報、それが属するホスト、送られようとしていたホストを示します。

既定の回答は Shut down で、マシンを侵害済みとしてマークします。Save for Investigation は先に VM のディスクとホームフォルダーを書き出します。侵害済みのマシンは、ディスクとホームが消去されるまで再起動しません。

WIRED の記事では、認証情報とパスワードが第三者のサイトに送られました。Bromure のマシンでは、プロキシが最初のそうしたリクエストを何かが Mac を出る前にブロックし、VM は停止し、アラートがどの認証情報がどこへ向かっていたかを開発者に伝えます。

ネットワークの地図は許可リストの内側に残る

ネットワークの地図は認証情報ではないので、仕掛け線は効きません。効くのはエグレスファイアウォールです。各マシンの Guardrails ペインには Outbound connections の表と Unmatched traffic の設定があります。Unmatched traffic を Deny にし、仕事に必要なホストを許可すれば、それ以外の接続はすべて Mac 上で拒否されます。

allow tcp api.github.com:443
allow web *.amazonaws.com
allow web registry.npmjs.org
default deny

ルールは VM の外で2回適用されます。仮想ネットワークスイッチがすべての接続を IP と DNS で見えたホスト名で、すべてのプロトコルについて確認し、プロキシが TLS のサーバー名でもう一度確認します。エージェントが実行する curl、エージェントが書くスクリプト、エージェントがインストールするパッケージは、すべて同じ確認を通ります。誰もリストに入れていないウェブサイトへの接続は拒否され、その拒否は記録されます。

NIST が警告したとおりそのウェブサイトが注入を仕込んでいたなら、まずソースコード検出器がそれを捉えます。Bromure は、取得したページを含め、エージェントがツールから読み込む内容をモデルプロバイダーに届く前にローカルの PromptGuard モデルで検査し、記録、確認、ブロックのいずれかを行えます。

Bromure:エージェントは働き、ログインは Mac に残るエージェント VMghp_… の代用値偽の AWS シークレットbrm-db-… の代用値SSH:署名のみ、秘密鍵なしファイル、変数、プロセスに本物のシークレットなしプロキシとファイアウォール(Mac)本物の認証情報を暗号化差し替えはホスト単位全リクエストを検査し範囲外の代用値を検出許可リストのルール、Unmatched traffic: DenyGitHub、AWS など仕事のホスト送信時に本物の認証情報に差し替えリストにないサイト接続拒否、地図は外に出ない範囲外への代用値HTTP 451、VM 停止、侵害アラートSecurity Timeline:差し替え、ブロック、拒否をすべて90日保持、CSV 出力可登録済み Mac は credential.exfiltration、egress.firewall、guardrails.block を組織に送信、トークンはプレビューのみ、シークレットは送らない
同じ仕事を Bromure のマシンで行った場合。エージェントの VM は代用値を持ち、Mac 上のプロキシは本物の認証情報をそれが属するホストへのリクエストにだけ付ける。それ以外へ向かう代用値は HTTP 451 でブロックされ、VM は一時停止する。許可リスト外のホストへの接続は拒否される。すべての判断は Security Timeline に記録され、登録済みの Mac では組織の監査ストリームにも送られる。

管理者権限と、書き込みの関門

WIRED の記事では、エージェントは管理者権限でコードをコミットし、クラウドサーバーを作成していました。Bromure はエージェントに仕事に必要なアクセスを残しつつ、書き込みをプロキシで適用されるルールの後ろに置きます。エージェントはそれを無効にできません。

Guardrails ペインの各サービスには書き込みポリシーがあります。Off、Prompt before write、Block destructive、Read-only です。対象は git フォージ、AWS、DigitalOcean、コンテナレジストリ、Kubernetes、いくつかのデータベースです。新しいマシンは Prompt before write で始まります。読み取りは通ります。git push、RunInstances の呼び出し、kubectl apply は、正確な操作を示す Mac 上のダイアログで止まり、開発者は Allow once、Allow for 15 minutes、Allow for the rest of the session、Don't allow から選びます。より重要な認証情報には、Require approval to use で各セッションの初回使用前に確認を求められます。

Jake Williams のシナリオには、ソフトウェアへの目立たない変更が必要です。Prompt before write のもとでは、エージェントをその変更に誘導した攻撃者も、開発者の Mac 上のダイアログを通らなければ push できません。

2か月が最初のリクエストになる

WIRED の情報源は、誰がいつ送信に気づいたのかを語っていません。Bromure の Mac では、開発者は Security Timeline(Window › Security Timeline…)を開き、セキュリティエンジンが下したすべての判断を、すべてのマシンについて、何も設定せずに読めます。認証情報の差し替え、ファイアウォールの許可と拒否、ガードレールによるブロック、プロンプトインジェクションの検出、ブロックされた持ち出しのすべてです。Overview タブは直近24時間を集計し、最新のブロックを一覧にします。イベントは90日間保持され、CSV に書き出せるので、72時間の報告期限を抱える請負業者は、タイムスタンプ、ホスト、認証情報の名前を初日から手にできます。

チームは Bromure Enterprise Manager で Mac を登録できます。登録済みの Mac は同じイベントを組織に送ります。代用値が外に出ようとしたときの credential.exfiltration、判定ごとの egress.firewall、拒否された書き込みごとの guardrails.block に加え、ツールの使用、コマンド、トークン数です。認証情報のイベントには短いプレビューだけが含まれ、シークレットそのものは含まれません。プロンプトとモデルの応答が Mac を出ることもありません。セキュリティチームは、ブロックの数秒後に自分たちのコンソールでアラートを読めます。

これは開発者にとっても、会社に見えない個人アカウントではなく、会社が境界を見守るなかで5つのエージェントのどれでも実システムに使える、承認された手段になります。

ログインではなく代用値

本物の認証情報は Mac 上で暗号化されたまま残ります。エージェントの VM が持つのは、それぞれが属するホストでしか機能しない代用値です。

すべてのリクエストに仕掛け線

ほかのホストへ向かう代用値は HTTP 451 でブロックされ、VM は両方のホストを示すアラートとともに一時停止します。

ネットワークの許可リスト

Unmatched traffic を Deny にすれば、仕事に不要なホストはすべて、Mac 上で、すべてのプロトコルについて拒否されます。

初日からの記録

Security Timeline はすべての差し替え、ブロック、拒否を90日間記録し、登録済みの Mac は同じイベントを組織に送ります。

エージェントに渡すのは仕事であって、ログインではない

開発者はこれからもエージェントにアクセスを与えるでしょう。エージェントが仕事をするにはそれが必要だからです。アクセスはエージェントに与え、シークレットは Mac に残し、エージェントが通信してよいホストを決めてください。

Bromure Agentic Coding ではそれが既定です。認証情報をマシンに追加し、ファイアウォールを仕事に必要なホストに絞り、書き込みは Prompt before write のままにして、記録は Security Timeline に任せます。

エージェントのデータが誰も選んでいないサーバーに行き着いた別の事例は、エージェントのログは彼らのクラウドにあったをお読みください。攻撃者が入り込んだ開発者のノート PC から何に届くかについては、侵入口はノートPCだったをお読みください。