キーの置き場所が多すぎた
Wiz によると、10 月に侵害を公表した AI 開発プラットフォームは少なくとも 9 社にのぼり、その多くは認証情報へのアクセスに起因し、攻撃者は AI キーを保持する保存済みの環境変数を狙っていました。最新の Northflank は 10 月 30 日、すべての環境変数が復号されたものとみなすよう顧客に伝え、ユーザーからは数時間以内に AI キーが使われたという報告が出ました。Bromure Agentic Coding では、エージェントがコーディングに使うキーは Mac の 1 か所にだけ置かれ、エージェントはそれをプラットフォームにコピーできず、ローテーションは貼り付け 1 回で済みます。
AI キーを貼り付けたプラットフォームは、どれもそのコピーを保持しています。10 月、攻撃者は 9 つのプラットフォームでそのコピーを狙い、Wiz は盗まれたキーが 30 分以内に試されるのを確認しました。
10 月 30 日 11:43 UTC、Wiz は、アプリやデータベース、AI ワークロードをデプロイするクラウドプラットフォーム Northflank に侵害を通知しました。約 2 時間後、Northflank のステータスページはすべての顧客に「Assume all environment variables have been decrypted. Disable/rotate all keys.」(すべての環境変数が復号されたものとみなし、すべてのキーを無効化またはローテーションしてください)と伝えました。15:12 には「Multiple users are confirming that their AI keys have been used.」(複数のユーザーが AI キーが使用されたことを確認しています)と追記。その日最後の 23:38 の更新はこうです。「Users have reported unauthorised use of AI API keys supplied to the Northflank platform.」(Northflank プラットフォームに提供された AI API キーの不正使用がユーザーから報告されています)。BleepingComputer によると、Northflank は攻撃者の侵入経路も、影響を受けた顧客数も明らかにしていません。
Northflank が最初ではありませんでした。同じ日、Wiz の研究者 Benjamin Read と Rami McCarthy は Black October for AI Developer Platforms を公開し、この 1 か月にセキュリティインシデントを公表した AI 開発プラットフォームを少なくとも 9 つ数え上げました。「ほかの月なら、これがセキュリティのトップニュースだったはずだ」と彼らは書いています。
1 か月で 9 つのプラットフォーム
Wiz のリストを順に示します。
| 日付 | プラットフォーム | 公表内容 |
|---|---|---|
| 10/6 | Fireworks AI | 認証情報へのアクセス。「エージェントスウォーム」攻撃の兆候 |
| 10/9 | Andromeda | 「業界全体への攻撃」の一部 |
| 10/14 | Zeabur | 認証情報へのアクセス。同社は事業を終了 |
| 10/15 | Lightning AI | 認証情報へのアクセス |
| 10/16–17 | OpenCode | 「レガシーシステム」。保存されたプロバイダーキーが露出 |
| 10/20 | Railway | 「ビルド基盤での権限昇格」 |
| 10/23 | Warp | サードパーティのベンダー。エージェントのトレースが流出 |
| 10/28 | CommandCode | 蒸留が原因とされる |
| 10/30 | Northflank | 環境変数は復号されたものとみなす |
Wiz は、9 件すべてに共通する単一の脆弱性や依存関係を見つけられませんでした。共通しているのは標的です。インシデントの大半は認証情報へのアクセスにさかのぼり、攻撃者は保存された環境変数、「とりわけ AI へのアクセスを与えるもの」を探していました。OpenCode と CommandCode は蒸留、つまりフロンティアモデルへの盗んだアクセスで安価なモデルを訓練する行為が原因だとしました。残りの需要について Wiz は、LLMJacking と呼ぶ転売市場、つまり盗んだキーを割安なモデルアクセスとして売る市場に結びつけています。
30 分で試され、数百万単位で転売される
Wiz は、Amazon Bedrock 用に使われた企業の認証情報 2 組が盗まれた後にどうなったかも追跡しました。どちらのケースも特定のプラットフォーム侵害とは結びつけられませんでしたが、そのパターンは AI キーがなぜ狙われるのかを物語っています。
- 認証情報へのアクセスが報告されてから 30 分以内に、住宅用 IP から 1 回の
InvokeModel呼び出しでキーが試されました。Claude Fable 5.1 を要求して失敗し、Opus 5.5 にフォールバックしたところ成功しました。 - 次に、小さな Go クライアントが 1 日 14〜120 回キーを確認し、まだ使えるかを確かめていました。
boto3スクリプトが Bedrock と EC2 のクォータを列挙しました。バージョン文字列まで同じスクリプトが、両方のケースに現れました。- その後に大量のトラフィックが来ました。ケース A は約 30 時間で約 80 万回の Bedrock 呼び出しを行い、約 90% が成功。ケース B は約 13 時間で約 170 万回を呼び出し、100 万回以上が成功しました。
Wiz は、2 つのケースが定価で「おそらく 10 万ドルを超える利用料を発生させた」と推定しています。トークンのパターンは、転売されたコーディングエージェントのトラフィックに似ていました。プロンプトキャッシュが使われ、1 つの転売業者の背後に多数のエンドユーザーがいるという形です。Wiz は、キーに触れたインフラを LLM 転売サイトに結びつけており、その中には USDT で支払いを受け付けるサイトもあります。
盗まれた AI キーが流れ込むのはそういう市場です。他人の請求でコーディングエージェントを動かす人たちの市場です。
1 本のキーが 9 か所に行き着くまで
開発者が Anthropic のキーを 1 本取得し、使い始めます。まずコーディングエージェントに入れ、次にアプリの AI 機能が動くようにプレビューデプロイに入れ、評価を走らせる CI ジョブに入れ、ファインチューニングを試すためにノートブックサービスに入れます。どの貼り付けも 30 秒で済み、何かが動くようになります。そして二度と見直しません。
コーディングエージェントはこれを加速させます。「これを Northflank にデプロイして」「Railway のサービスを設定して」と頼めば、開発者と同じことをします。環境から ANTHROPIC_API_KEY を読み、プラットフォームの CLI にサービス変数として渡すのです。デプロイは成功します。キーはデータベースのパスワードの隣に、もう 1 つのプラットフォームに住みつき、それを入力した人間は誰もいません。
やがてどこかのプラットフォームが侵害され、アドバイスは毎回同じです。Northflank のものは「Revoke existing credentials with their issuing providers, generate replacements」(既存の認証情報を発行元で失効させ、代わりを生成してください)でした。そのためにはまず、そのキーが渡ったすべての場所を思い出さなければなりません。
同じ月の Bromure Agentic Coding
Bromure Agentic Coding は、Claude Code、Codex、Grok、Kimi、omp を Mac 上の Ubuntu VM で動かします。マシン 1 台につき VM 1 つです。エージェントとそのリポジトリ、エージェントが実行するすべてのコマンドは VM の中にあります。本物の認証情報と、VM のすべてのトラフィックが通るプロキシは Mac に残ります。
キーは 1 か所にある
モデルのキーは Preferences › Models に一度だけ入力します。Bromure はそれを models.enc に保存します。Mac の Data Protection Keychain にあるマスターキーで AES-GCM 暗号化され、iCloud 同期はオフです。アプリは認証情報、トークンストア、鍵素材をどこにもアップロード、同期、バックアップしません。Bromure はプロバイダーキーを保存するコンソールを運営していないので、攻撃者が私たちの側で侵害できるものはありません。
各 VM の中では、ANTHROPIC_API_KEY に sk-ant-api03-brm- で始まる代用値が入っています。形式が正しいので Claude Code はそれを受け付けます。エージェントが api.anthropic.com を呼ぶと、リクエストは Mac 上のプロキシを通って VM を出て、プロキシが本物のキーに差し替えて転送します。プロキシがキーを付けるのはそのプロバイダー自身のホストだけで、ほかには付けません。Anthropic のキーなら anthropic.com、OpenAI のキーなら openai.com といった具合です。
代わりに Claude、ChatGPT、Grok、Kimi のサブスクリプションでサインインした場合、OAuth トークンは Mac に残り、更新も Mac が行います。VM がリフレッシュトークンを持つことはありません。
エージェントはキーを広められない
では、デプロイをもう一度やってみましょう。エージェントはプラットフォームの CLI を実行し、環境にある値を使ってサービスに ANTHROPIC_API_KEY を設定します。その値は代用値で、それを運ぶリクエストはプラットフォームの API に向かいます。
Bromure のプロキシは、すべての送信リクエストのヘッダーと本文を調べ、発行先ではないホストに向かう代用値を探します。デプロイプラットフォームの API へのリクエストに含まれた Anthropic キーの代用値は、まさにそれです。プロキシは 1 バイトもプラットフォームに届く前に HTTP 451 でリクエストをブロックし、VM を一時停止して This environment may have been compromised を表示します。そこには認証情報の名前、それが属するホスト、送信先のホストが示されます。
このアラートはキーを盗むマルウェアのために作ったものですが、手伝おうとするエージェントにも同じように反応します。コーディング用のキーが、あなたの知らないうちにデプロイプラットフォームへコピーされることはありません。そのコピーが本当に望むものなら、Allow でセッションの残りの間そのホストに送れます。より良い対処は、本番サービス用に本番に限定した専用キーを発行し、エージェントがコーディングに使うキーは Mac に置いたままにすることです。
エージェントは逆方向にもシークレットを持ち込みます。railway variables やプラットフォームの env pull は、本物の値ごと本番の .env をリポジトリに置くことがあります。マシンの Guardrails で Only allow credentials Bromure injects をオンにすると、Bromure が入れたのではない認証情報を運ぶリクエストはすべてブロックされ、同じアラートが出ます。エージェントがプラットフォームからダウンロードした本物のキーは、VM の中で使われないままになります。
盗めるキーのない Bedrock
Wiz が追跡した 2 つのケースは、どちらも長期間有効な企業の認証情報で Amazon Bedrock を使っていました。Bromure では、どのエージェントも Bedrock で動かせます。Claude Code はネイティブに、ほかのエージェントは Bedrock の OpenAI 互換 API を通じてです。そしてどれも Bedrock のキーをまったく必要としません。Bedrock API key 欄を空のままにすれば、Mac がマシンの AWS 認証情報で各リクエストに署名します。
その認証情報は一時的なものにできます。マシンの AWS 認証情報で SSO / Identity Center を選ぶと、Mac は SSO キャッシュから短期のロール認証情報を取得し、期限切れの約 5 分前に更新します。VM には偽のシークレットキーが渡され、それが作る署名は AWS に拒否されます。Mac はその署名を取り除き、署名し直します。誰かに復号されうる長期の Bedrock 認証情報を保持する環境変数は、どこにも存在しません。
ローテーションは貼り付け 1 回
プラットフォームからローテーションを求められても、エージェントが使うキーは 1 つの欄だけです。Preferences › Models に新しいキーを貼り付ければ、入力をやめて約 1.5 秒後に、そのキーを使う実行中のすべてのマシンに Bromure が反映します。認証情報が変わった各エージェントは再開フラグ付きで再起動されるので、会話はそのまま続きます。VM は再起動せず、中で何かを編集する必要もありません。中に古いキーを持っていたものは何もないからです。
キーを 1Password で管理しているなら、マシンのほかの API キーは値ではなく op:// 参照にできます。Bromure は Mac 上でそれを解決し、2 分ごとに解決し直すので、1Password で項目をローテーションすれば、実行中のマシンには再起動なしで数分以内に届きます。
すべての利用を自分で記録
Northflank のもう 1 つのアドバイスは、プロバイダーの利用ログと請求ログに身に覚えのないアクティビティがないか確認することでした。Bromure では、差し替えのたびに Mac の Security Timeline の Credential brokering に 1 行が記録されます。マスクされたキーのプレビューとホストが、sk-a…f9q3 → api.anthropic.com のように表示されます。Bedrock を含む AWS の署名は、マスクされたアクセスキー付きの Credential used 行として現れます。プロバイダーのダッシュボードに急増が見えたとき、どの呼び出しが自分のマシンから来たのかがわかります。
Bromure Enterprise Manager に登録された Mac では、同じ差し替えが credential.token_swap イベントとして組織に送られます。送られるのはプレビューだけで、キーそのものは決して送られません。「うちのキーがどこか別の場所で使われていないか」に答えなければならない管理者は、フリート全体について正規の利用側の記録を手にしています。
コピーは Mac に 1 つ
モデルのキーは models.enc にあり、Keychain の鍵で暗号化され、同期もアップロードもされません。ベンダーのコンソールが保持することもありません。
VM には代用値
エージェントの ANTHROPIC_API_KEY は代用値です。本物のキーは Mac で、プロバイダー自身のホストに対してだけ付けられます。
うっかりコピーなし
デプロイプラットフォームに送られた代用値は 451 でブロックされ、VM は一時停止し、アラートが送信先を示します。
厳格な認証情報
厳格モードをオンにすると、エージェントがプラットフォームの env ファイルから取り出した本物のキーは、使われた瞬間にブロックされます。
SSO で Bedrock
Mac は Identity Center の短期認証情報で Bedrock の呼び出しに署名します。保存されたり盗まれたりする長期キーはありません。
貼り付け 1 回でローテーション
Preferences › Models に入れた新しいキーは、実行中のすべてのエージェントに数秒で届きます。VM は再起動しません。
コピーを数えよう
Wiz は、9 件すべての背後に単一のグループがいるのかをまだ把握しておらず、ほとんどのプラットフォームは根本原因を公表していません。AI キーを保存するプラットフォームはどれもそれを失う可能性があり、10 月は、窃取者にいまや買い手が待っていることを示しました。
エージェントがコーディングに使うキーこそ、そのリストに載ってほしくないキーです。最上位のモデルと最も高い上限で使え、エージェントが一日中使っています。Bromure Agentic Coding では、そのキーは Mac に留まります。エージェントが受け取るのは代用値で、ほかのどのプラットフォームでも使えません。
10 月の 9 件の 1 つである OpenCode コンソールの侵害についてはキーは彼らのコンソールにあったを、Warp で盗まれたエージェントのトレースについてはエージェントのログは彼らのクラウドにあったをお読みください。