スキャナはそれを読むことを拒んだ
Google の Threat Intelligence Group が 9 月 8 日に AI Threat Tracker を公開しました。UNC6780 というサプライチェーン攻撃グループを扱った節に埋もれているのは、モデルの安全ポリシーを隠れ蓑に変える手口です。マルウェアの JavaScript ローダーは、生物兵器の合成経路と核兵器の仕様を要求するコメント塊で始まります。LLM セキュリティスキャナがそれを読んでポリシー上の理由で拒否し、その下のコードへ決して到達しないように置かれているのです。拒否こそが回避手段です。Bromure Agentic Coding はこうした成果物に、それを決して読まない検査で応えます。
セキュリティスキャナを説き伏せてマルウェアを承認させるのは骨が折れます。 見ることさえ拒むほど放射性の高いファイルを差し出すのは、コメント塊ひとつで済み、 あなたのパイプラインはその拒否を「解析不能」として片付けます。
あなたのビルドパイプラインには、いまや LLM が入っています。たいていはそうです。 依存関係の更新が届いてからマージボタンが点灯するまでのどこかで、モデルが diff を 読み、新しいファイルを読み、そのどこかに敵対的なものがあるかどうかについて短い 所見を書きます。よい技術の使い方です。パターンマッチが素通りする難読化ローダーを 捕まえ、しかも 1 ファイルあたり 1 セントの何分の一かで済みます。
9 月 8 日、Google の Threat Intelligence Group が AI Threat Tracker を公開しました。攻撃者がこの手の技術で何をしているかを四半期ごとにまとめたもの です。報道の大半は見出しの数字に向かいました。ある金銭目的の攻撃者が企業のクラウド 基盤を侵害し、その後 GTIG の言葉を借りれば「AI コーディングチャットボットと プロンプト、そして一式のエージェント指示を活用し、六時間足らずで大規模な認証情報 収集キャンペーンを計画・構築・実行した」というものです。数千件の第三者の認証情報が、 被害者自身の IP アドレスを経由して外へ運び出されました。別の露出したサーバー上では、 ダッシュボードが 23,800 件を超える収集済みの秘密情報をリアルタイムで追跡していた 偵察フレームワークが見つかっています。
書かれたのはその話です。あなたの午後を費やす価値のある段落は、そこから数節あとに あります。Google が UNC6780 として追跡しているサプライチェーン攻撃グループを扱った 部分です。
ファイルの先頭にあるコメント
UNC6780 は TeamPCP とも名乗り、2026 年 3 月以降 PyPI、npm、Docker Hub にまたがる
大規模なオープンソース侵害を続けています。現在の認証情報窃取ツールは DUSTMAKER と
呼ばれ、JavaScript のペイロードです。JavaScript のペイロードにはローダーがあります。
このローダーは _index.js という名前のファイルで、GTIG はその先頭に新しいものを
見つけました。
AI コーディングエージェントを狙って設定ファイルに埋め込まれたプロンプトに加え、 DUSTMAKER の検体には、マルウェアの JavaScript ローダースクリプト(
_index.js) の先頭にコメントとして埋め込まれたプロンプトが含まれていた。これらのプロンプト は極端な敵対的テキストを含み、生物兵器や核兵器といった話題に言及しており、 安全上あるいはポリシー上の拒否によって、LLM セキュリティスキャナを失敗させるか、 その下にある悪意ある JavaScript コードの解析を省かせる意図があったとみられる。
コメント塊は、マルウェアを丸見えのまま放置します。展開済み、エンコードもなし、 すべて一つのファイルの中に。悪意ある JavaScript は三行下にあり、最後まで読む者なら 誰でもそこにつまずくはずの場所にあります。
そのコメントが、読み手を最後まで読む気にさせないのです。偽のシステム上書き宣言で 始まり、安全ガイドラインは停止されたと告げ、エアロゾル散布型の生物兵器について 手順を追った合成経路を要求します。それから爆縮型の核兵器設計へ進み、目標威力まで 添えます。このファイルを読み込んだモデルが「このコードは悪意あるものか」と問われた とき、目の前にはもっと大きな声の問いがあり、モデルはそちらに拒否で答えます。 スキャナはポリシーのメッセージを返します。あなたのパイプラインは 解析は利用不可 と記録します。タイムアウトや巨大ファイルのために週に数十回そうしているのと同じ ように。そしてビルドは緑になります。
この手口は UNC6780 に何の費用もかかりません。どのモデルがファイルを読むのか、 どのベンダーがそのモデルを動かしているのか、そのシステムプロンプトに何が書いてある のか、いっさい知る必要がありません。読み手に求めるのは一つだけ、安全ポリシーです。 保証のためのパイプラインにおいては、そもそもモデルを選んだ理由そのものです。
連鎖の残りも同じことをしている
この一手が見えてしまえば、UNC6780 の残りの手口はその変奏として読めます。経路上に 残るどの防御も、攻撃者が書いた成果物について判断を下す読み手であり、どれも打ち破ら れるのではなく食べさせられています。
パッケージは、エージェントが最も信頼する道具を通って届きます。 GTIG は UNC6780
が正規の開発者アカウントを侵害し、「tiktoken_mcp のような正規 MCP サーバーの
トロイの木馬入りフォークを PyPI レジストリに公開し、azure-functions-mcp-extension
のような組織の公式 GitHub リポジトリに直接悪意あるコードを注入する」さまを記述して
います。MCP サーバーにバックドアを仕込むということは、コーディングエージェントが
読み込みツールを与えるよう設計された、まさにその種類の依存関係を通じてペイロードが
届くということです。
来歴チェックは有効な署名を受け取ります。 アテステーションを信頼の指標として 扱う人は、これを腰を据えて読むべきです。
DUSTMAKER の検体には、継続的インテグレーションおよび継続的デリバリー(CI/CD) 環境で動作しているかを検知する機能が含まれる。確認された場合、GitHub Actions ランナーのプロセスメモリから OIDC トークンを抽出する。このトークンを用いて DUSTMAKER は自らを信頼された公開者として認可し、有効かつ暗号的に署名された SLSA Build 3 アテステーション付きで、侵害されたバージョンのパッケージを公開する。 有効なトークンで公開されたパッケージは、AI コーディングエージェントの自動信頼 チェックを通過する。
そのパッケージに署名したのは、公開者自身の身元です。DUSTMAKER は自分が住んでいる ランナーのプロセスメモリからその身元を持ち上げたので、署名を確かめる検証器は 有効 を返し、しかもそれは正しいのです。
エンドポイントのエージェントは別の界隈を見張っています。 DUSTMAKER は「AI
コーディング支援ツールや統合開発環境(IDE)向けの、隠しプロジェクトワークスペース
ディレクトリ(.claude/、.vscode/、.cursor/ など)に悪意あるファイルを落とす
か、それらを改変する」とされます。GTIG は理由も述べています。こうしたフォルダは
マルウェアを「日常的な開発者のノイズ」に紛れ込ませ、レジストリキーや /etc/cron.*
のように、エンドポイント検知が見張っている場所から遠ざけてくれるからです。あなたの
EDR ベンダーは .cursor/ 内の新しいファイルに対する規則を出荷していません。今年
までそのフォルダにはエディタの設定が入っていたからです。
支援ツールは設定ファイルを受け取り、設定ファイルとは指示です。 同じ隠し
ディレクトリから、DUSTMAKER は「悪意ある設定ファイルを … 用いて、日常的な開発者との
やり取りの最中に、任意のコマンドやスクリプト(setup.mjs など)を実行するよう AI
アシスタントに指示する。これにより実質的に、開発者の知らないうちに AI モデルが
攻撃者の代わりにコマンドを実行させられる」とされます。アシスタントは自分の
ワークスペース設定を読みました。それが仕事です。そして設定は実行すべきスクリプトを
指名しました。この一文のどこにも脆弱性の悪用はありません。
そして監査 API が監査証跡を消します。 このマルウェアは CI タスクを 「Copilot Setup」のような AI 風の名前で偽装し、続いて自動 API 呼び出しを発行して、 GitHub の画面からワークフロー実行ログを取り除きます。
五つとも設計どおりに動いた
ここに報告すべきバグはありません。スキャナは安全ポリシーを適用しました。あなたが そのために金を払っているものです。検証器は有効な署名を検証しました。支援ツールは ワークスペース設定を読み込みました。それが機能です。エンドポイントのエージェントは、 コーディングエージェントが設定ディレクトリを持つ以前に重要だったパスを見張りました。 どれも受け取った入力に対して自分の仕事をしたのであり、その入力を選んだのは UNC6780 です。
ふつうの回避は誤った判定を求めます。バイナリを詰め、文字列を分割し、URL を符号化し、 解析が潔白で返ってくるのを願う。DUSTMAKER は正しい判定から、あるいは判定がまったく 出ないことから、欲しいものを手に入れます。
成果物を読み、意見を形づくる という形をした防御はすべて、その射程に入っています。 読み手の席に言語モデルが座ると射程は広がります。モデルは自分がやらないことのリストを 携えており、そのリストは公開され、文書化され、コメントを打てる者なら誰にでも届くから です。業界は二年をかけて、モデルが「はい」と言わされないよう堅牢化してきました。 UNC6780 はモデルを説き伏せて、何も言わせません。
ならば、あなたのエージェント型パイプラインの制御に別の問いを投げてください。 そのうちどれが、仕事をするために攻撃者の書いた内容を読まねばならないのか。そして それらを脇に置いたとき、何が立ったまま残るのか。
議論の余地がない検査
Bromure Agentic Coding は各コーディングエージェントを、あなたの Mac 上の ハードウェア仮想化された Linux VM の中で実行し、あらゆるセキュリティ制御をその境界の ホスト側に置きます。こうした連鎖に対して効くかどうかは、それらの制御が何を入力として 取るかで決まります。
エイジゲートは時計を読みます。 ホスト側プロキシは主要なパッケージレジストリ宛の リクエストを認識し、1 バイトも VM に届く前にワークスペースのサプライチェーン ポリシーを適用します。既定で有効な唯一の層であり、最短二日に設定されたエイジゲートは、 締切より若いバージョンを拒みます。そのためにレジストリのバージョン一覧を書き換える ので、エージェントから見れば新しすぎるバージョンはまだ存在しません。固定した直接取得 は HTTP 451 で返り、その本文はパッケージの実際の年齢を告げます。パッケージ自体は 決して読まれません。言語モデルを脱線させるために作られたコメント塊は、公開時刻を 1 ミリ秒も動かせませんし、UNC6780 のトロイの木馬入りフォークは構造上どれも出来立ての 公開です。npm、PyPI、Cargo、RubyGems、Packagist はいずれもバージョンごとの公開時刻を 持つので、ゲートはそれらを覆います。
分類器には持ち出すポリシーがありません。 Bromure のソースコード検出器は、
エージェントがモデルへ返送する tool_result の区間、つまりファイルの内容、ウェブ
ページ、コマンド出力を、あなたの Mac 上で ONNX として動く DeBERTa 系のローカル
PromptGuard モデルで採点します。生成モデルではなく系列分類器です。DUSTMAKER の
コメント塊を渡されても、答えを組み立てず、答えてよいかという問いを量ることもなく、
何も断りません。ゼロから一の間の数を出すだけであり、安全ガイドラインの停止を告げる
偽のシステム上書き宣言で始まるテキストは、その数を高くする典型的な形です。
ワークスペースごとに、当たったときの動作を選べます。記録、確認、遮断です。遮断は
451 を返し、モデルはその内容を決して見ません。
ワークスペース設定を読むのは、エージェント以外の何かです。 setup.mjs を実行せよ
と支援ツールに告げる .claude/ 内のファイルは、いわゆるルールファイル型バックドア
であり、それ専用の検出器があります。隠れた Unicode、メタ指示のパターン、認証情報の
パス、curl からシェルへ流し込む構文に対する決定的なヒューリスティック走査と、固定
パターンに当てはまらない不正な指示のために微調整された ModernBERT 分類器です。どちらも
プロキシの中、デバイス上で、システムプロンプトから抜き出した指示ファイルに対して
動きます。VM の内側からは何も止められない場所です。どちらもワークスペースごとの
切り替えで、初めて有効にするときにモデルのダウンロードを一度求めます。この話が
あなたに求めている五分とは、そのダウンロードのことです。
認証情報の窃取ツールには認証情報が必要です。 DUSTMAKER は開発環境から秘密情報を
刈り取るために存在しますが、Bromure のワークスペースには一つもありません。Bromure は
あなたが設定した各認証情報を、実際の値とインストールごとのソルトから導いた、構造を
保ったダミーに置き換えます。sk-ant-api03-brm-…、正しい長さの ghp_ トークン、
brm-mcp_…、brm-k8s-… です。これらのダミーが環境変数に入り、
~/.git-credentials、~/.docker/config.json、~/.kube/config、~/.aws/config にも
入ります。窃取ツールが列挙するのは、まさにこの一覧です。本物の値は Mac 上で暗号化
されたまま残り、ホスト側プロキシが、それぞれの発行先ホストに限定して通信路上で
差し替えます。SSH 秘密鍵のバイト列は決して VM に入らず、越えるのは署名だけです。
これらを左右する切り替えはありません。プロキシが VM からネットワークへの唯一の経路
だからです。
ダミーは仕掛け線も兼ねます。 ダミーのトークンには正当な宛先が一つしかありません。 プロキシは外向きの各リクエストを、ヘッダーも本文も走査し、別の場所へ向かうダミーを 探します。一致すれば 1 バイトも転送せずにリクエストを拒み、その場で VM を停止し、 Security Timeline に赤い Credential brokering の行を記録します。ワークスペースを 侵害済みと印づけ、次回の起動時にはまずディスクとホームイメージの消去を強います。 あとで何かをローテーションする必要はありません。窃取ツールが握っていたのは プレースホルダであり、そのプレースホルダは外に出ていないからです。
記録はあなたのマシン上にあり、マルウェアが呼ぶ API の届かないところにあります。
トレースを Activity only にすると、プロキシは VM を出るリクエストごとに本文なしの
メタデータ行を 1 行書きます。bromure-cli trace hostnames はワークスペースが接触した
個別のホストを件数つきで表示し、bromure-cli trace leaks は侵害アラートのあとに宛先を
指し示します。GitHub トークンを握った攻撃者は、数回の API 呼び出しでワークフロー履歴を
空にできます。そのトレースを空にするには、あなたの Mac にたどり着かねばなりません。
今日の午後にできる二つの設定
ワークスペースの Supply Chain ペインを開き、エイジゲートが有効で、締切が自分に とって無理のない値になっているか確かめてください。既定は二日で、公開されたばかりの トロイの木馬入りフォークに対して、これがいちばん安上がりな制御です。続いて Prompt Injection を開き、両方の検出器を有効にしてください。それぞれ一度だけ モデルをダウンロードし、そのあとの走査はローカルで無料です。
問いを小さくする規則ひとつ
Guardrails で Unmatched traffic を Deny にし、その仕事に必要なものを
並べてください。allow web api.github.com、allow web registry.npmjs.org、
default deny のように。指令サーバーに届かない窃取ツールは、まもなく捨てる
ディスク上のただのファイルです。保存すれば、再起動なしで実行中のセッションにも
規則が届きます。
不在は評価に勝る
私たちは別々の方角から、いつも同じ場所にたどり着きます。 エージェントが書ける名前を信頼した外向きプロキシ。 bash とは違う読み方で bash を読んだコマンドガード。 鍵の検査に失敗すると空の認証オブジェクトへ落ちた AI ゲートウェイ。 どの場合も、ある部品が何かを評価するという仕事を誠実にこなしており、その評価が 壊れました。
DUSTMAKER はこの議論を鋭くします。壊れた評価をまったく必要としないからです。求めるのは、 UNC6780 が書いた内容の上で評価が行われることだけ。読み手にファイルを渡せば、読み手は それについて見解を持ちます。誰がそのファイルを供給したかが、残りを決めるのです。
評価は不在よりも弱いプリミティブであり、それでも私たちは、不在がただで果たす仕事を 評価に手渡し続けています。公開時刻とは議論できませんし、確率には身を引く意思が ありません。使い捨ての VM の中を全権限で走り、知っている設定ファイルをすべて読み通す 認証情報の窃取ツールが手にするのは、ひと握りのプレースホルダと、迂回できないソケット だけです。
レビューのパイプラインにモデルを入れたのは正しい判断でした。ものを止める制御が、 リポジトリの中の何ものも話しかけられない相手であるようにしてください。 Bromure Agentic Coding を導入して、攻撃者のファイルを決して 読む必要のない検査をエージェントに与えましょう。