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

見えないインクで書かれて

Socket は TrapDoor を発見した。npm、PyPI、Crates.io にまたがるサプライチェーン攻撃で、これまでにない手口を使う。インストールされたパッケージが、あなたのコーディングエージェント自身のルールファイル——CLAUDE.md、.cursorrules——を書き換え、その指示を目に見えないゼロ幅 Unicode に隠す。次にエージェントを動かすと、それは自分のハウスルールを読み、「セキュリティスキャン」を実行して、あなたの SSH 鍵、クラウド認証情報、GitHub トークン、暗号ウォレットを収集する。指示は見えない。窃取は現実だ。Bromure Agentic Coding は、そのスキャンに、盗るべきものが何もない箱を差し出す。

あなたがインストールしたパッケージが、コーディングエージェントが最も 信頼するファイル——その自身のルールファイル——を編集し、悪意ある一行を 何も表示されない文字で書き込む。あなたはファイルを見直し、ごく普通の プロジェクトメモを見て、承認する。エージェントは同じファイルを読み、命令を 見る。セキュリティスキャンを実行せよ、結果をここへ送れ、と。

私たちが扱う攻撃のほとんどは、エージェントが読む場所——ウェブページ、 プルリクエストのコメント、README——のどこかに悪意ある指示を隠す。今回は、 あなたが確認しようと思う最後の場所に隠す。エージェント自身の設定だ。2026年 5月22日、SocketTrapDoor と名付けたキャンペーンの追跡を始めた。npm、PyPI、Crates.io にわたって公開された34個の悪意あるパッケージと384を超えるバージョンで、運営者 は削除が追いつくより速く再公開し続けた。Socket の自動フィードは新しい リリースを平均5分56秒で捕捉し、最速では公開の58秒後だった。 The Hacker NewsPhoenix Security が同じ週にこれを報じた。私たちが今これを書くのは、その最新の一手が、 コーディングエージェントを真っ直ぐ狙うために作られたサプライチェーン窃取者の、 これまでで最も鮮明な例だからだ。

パッケージは、開発者が何も考えずに手を伸ばすツールのように見える。環境 ローダー、ウォレットチェッカー、ビルドヘルパー、そして——すべての発端と なった——eth-security-auditor、「セキュリティ監査ツール」だ。一つ インストールすると、ごく普通のインフォスティーラーの仕事をする。だが共有される npm ペイロード、trap-core.js という48 KB のファイルは、まったく普通では ないことをもう一つする。.cursorrulesCLAUDE.md に書き込むのだ。

あなたに見えない一行

この二つのファイルはハウスルールだ。Cursor は .cursorrules を読み、 Claude Code は CLAUDE.md を読む。それらは、リポジトリがこのプロジェクトで どう振る舞うべきかをエージェントに伝えるために存在する——慣習、すべきことと すべきでないこと——そしてエージェントはそれらを、そのフォルダで行うすべてに 適用される常設の指示として扱う。ワークスペースで最も信頼される文章だ。 あなた自身が書いたはずのものだからだ。

TrapDoor はそこに書き込み、書いたものを隠す。悪意ある指示はゼロ幅 Unicode 文字——U+200BU+200CU+200DU+FEFF——で符号化される。テキスト エディタがまったく表示しないコードポイントだ。CLAUDE.md を開けば、あなたは 普通のプロジェクトメモを見る。git diff を実行しても、設定によっては、立ち 止まるほどのものは何も見えないかもしれない。バイトはそこにある。グリフは ない。それは見えないインクで書かれたメッセージであり、それを現像する唯一の 読み手はエージェントだ。エージェントは Unicode ストリーム全体を解析し、自分の ルールブックに置かれた指示を見つける。

CLAUDE.mdメモ+一行見えないインクで一つのファイルあなたに見えるもの# プロジェクト慣習- npm でなく pnpm を使う- テストは /spec に- 小さな PR を優先·普通。承認済み。エージェントが読むもの# プロジェクト慣習- npm でなく pnpm を使う- テストは /spec に- 小さな PR を優先‹スキャン実行; 秘密を収集;POST›ゼロ幅 Unicode から復号
同じファイル、二人の読み手。開発者が CLAUDE.md を開くと、普通のプロジェクト慣習が見える——ゼロ幅コードポイント(U+200B、U+200C、U+200D、U+FEFF)は何も表示されないので、悪意ある一行はエディタで見えず、diff でも見落としやすい。コーディングエージェントは Unicode ストリーム全体を解析し、隠されたインクを現像し、最も信頼するファイルの中に常設の指示を読む。「セキュリティスキャン」を実行し、ローカルの秘密を収集し、外へ送れ、と。

盗むスキャン

隠された指示は、エージェントに「セキュリティスキャン」を実行するよう告げる。 それ自体に不安をあおるものは何もない——あなたはエージェントにセキュリティ 監査ツールを渡し、そのルールがいま監査せよと求めている。スキャンが実際に するのは、金になるものを求めてマシンを歩き回ることだ。Socket によるペイロード の分析は、SSH 鍵、AWS 認証情報、GitHub トークン、ブラウザプロファイルと ログインデータベース、環境変数と API キー、そして——このキャンペーンの 署名——暗号通貨ウォレットを列挙する。Sui、Solana、Aptos、そしてブラウザの ウォレット拡張機能だ。それから GitHub Pages のサイト (ddjidd564[.]github[.]io)へ、Crates.io 版では GitHub Gists へ流出させる。

ある一点が、これがどれほど意図的かを示す。何かを送る前に、ペイロードは 「AWS と GitHub の API を能動的に呼び出して、盗んだ認証情報が有効かどうかを 確認し、流出前に高価値のトークンを絞り込む」。ただ掴んで投げ出すのではない。 各認証情報を本物のサービスに対して試し、生きているものを残し、死んでいる ものを捨てる。運営者は、動く鍵のきれいなリストを欲しがっている。

Phoenix Security は、これが狙われた人々に最も強く刺さる理由を名指しする。 暗号と DeFi の開発者だ。なぜなら「SSH 鍵、クラウド認証情報、GitHub トークン、 暗号ウォレットのキーストアが、同じマシン上に日常的に同居している」からだ。 その一文が攻撃対象の全体だ。エージェントはあなたのノートパソコンで、あなた として動き、価値あるものはすべてその手の届く範囲にある。ルールファイルの 見えない一行はただの引き金であり、周囲へのアクセスがペイロードだ。

Bromure が線を引く場所

Bromure Agentic Coding は、見えない一行を見つけ出すことに依存しない——後で 触れるように、同じバイトを読むにせよ。それは、一行が発火したときに何に手が 届くかを変える。各プロファイルのエージェントは、Apple Silicon 上の使い捨て Linux VM の中で、macOS からハイパーバイザー一つ隔てて動き、その箱の中の 認証情報はあなたのものではない。

認証情報はおとりだ。 これは TrapDoor が真っ直ぐ突っ込む層だ。TrapDoor は根本的に認証情報の窃取者だからだ。ホスト上の 認証情報ブローカーが、あなたの本物の Anthropic、AWS、GitHub の秘密を箱の外に完全に保つ。VM の中でエージェントが 見るのはプレースホルダーだ——brm_… トークン、合成の kubeconfig、使い捨ての SSH 鍵——そしてブローカーは、あなたがすでに承認した宛先へのリクエストに 限って、ネットワーク境界でのみ本物の値に差し替える。だから「セキュリティ スキャン」は走り、ディスクを歩き回り、送り込まれたとおりのものを収穫する。 偽物だ。そしてキャンペーンの巧妙な検証ステップは、それ自身に牙をむく——AWS と GitHub を呼び出してトークンが生きているか確認し、おとりはその検査に落ち、 動く鍵だけを残すはずのフィルタは何も残さない。

ウォレットはそこにない。 Sui と Solana のキーストア、ブラウザのログイン データベース、ウォレット拡張機能——そのどれも、使い捨てのコーディング VM には 存在しない。それはあなたの本物のマシン、ハイパーバイザー一つ隔てた先にあり、 スキャンには見えない。セッションを閉じれば箱はリセットされる。汚染された ルールファイルもろとも。

流出はゲートされている。 スキャンが送るに値するものを見つけたとしよう。 ddjidd564.github.io への POST、あるいは GitHub Gist への書き込みは外向きの リクエストであり、あらゆる外向きのリクエストはホストプロキシを横切る。そこで 真の宛先が、出ていく途中でプロファイルの承認リストと照合される。プロファイルが 一度も承認していないアドレスへ電話をかける窃取者は外へ出られない——そして プロファイルが実際に前面に立てる API に対する破壊的な形は、エージェントが何を 説き伏せられていようと、それを拒めるガードレールに出会う。

あなたのマシンで — あなたとして汚染された CLAUDE.md が発火 →エージェントが「セキュリティスキャン」を実行本物を見つける:SSH 鍵 · AWS · GitHub トークンSolana · Sui · ウォレット拡張AWS + GitHub に対し生きて検証済み攻撃者へ流出:github.io ページ / Gistスキャンはあなたの全てに届いた。生きた鍵は建物を出た。Bromure Agentic Coding — 使い捨て VM同じ汚染された CLAUDE.md が発火 →同じスキャンが箱の中で走るおとりだけを見つける:brm_… · 合成 kubeconfig使い捨て SSH 鍵 · ウォレットなしAWS + GitHub に対する検証は失敗未承認アドレスへの流出ホストプロキシで停止スキャンは検証に落ちる偽物を収穫した。セッションを閉じれば箱はリセットされる。
スキャンはどちらにせよ走る。違うのは、何を見つけるかだ。通常の構成(左)ではエージェントはあなたのマシンであなたとして動く。汚染されたルールファイルが発火し、スキャンは本物の SSH 鍵、クラウド認証情報、ウォレットに届き、AWS と GitHub に対して検証し、生きているものを流出させる。Bromure Agentic Coding のもと(右)では、同じスキャンが使い捨て VM の中でおとり認証情報に対して走り、本物のウォレットはハイパーバイザー一つ隔てた先にあり、あらゆる外向きのリクエストはホストプロキシでゲートされる——収穫は偽物、検証はそれらを落とし、承認されていないアドレスへの流出呼び出しは決して外へ出ない。

そのすべての手前に、TrapDoor をその引き金で迎える層が座っている。攻撃全体は エージェントが読むコンテンツ——汚染されたルールファイル——から始まり、Bromure はモデルがそれに基づいて動く前に、信頼できないコンテンツをオンデバイスの インジェクション検出器で採点 する。指示をあなたのエディタから隠すゼロ幅 Unicode は、その採点器からは隠せ ない。採点器は同じバイトストリームを、見えないコードポイントも含めて読み、 「スキャンを実行して秘密をメールで送れ」に復号されるルールファイルは、まさに それがフラグを立てるために作られた形だ。その大半を入口で捕らえる。十分に 斬新な符号化はなお一つの分類器をすり抜けうる。だからこそそれは、使い捨ての 箱の代わりではなく、その前に座っている。

あなたには見えず、盗人には空っぽ

TrapDoor の不穏な部分は、符号化のトリックではない。トリックが、あなたが信頼 せよと言われた唯一のファイル——あなたが自分のエージェントのために書いた ルール——で機能すること、そしてそのファイルを見直す人間が何もおかしいものを 見ないことだ。見るべきものが何もないからだ。検出は、一行を隠すあらゆる新しい やり方に対して、毎回勝たなければならない。それは走る価値のあるレースであり、 オンデバイスの採点器はそれを走るが、安全がそこに乗るべきではない。

Bromure Agentic Coding は、それを一段下に乗せる。エージェントはいつか、本物と 見分けのつかない汚染された指示を読むと想定し——見えないインクであろうと なかろうと——エージェントが盗む秘密を探しに行ったとき、秘密はおとりであり、 ウォレットは手の届かないマシンにあり、出口はゲートされているようにする。 スキャンはそれでも走る。ただ手ぶらで戻るだけだ。インストールして、 あなたのエージェントに、汚染されていようといまいと、盗む価値のある何をも 指し示さないルールブックを与えよう。