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

そのリポジトリは本当にMicrosoftのものだった

2026年6月5日から6日にかけて、Miasmaワームが、Microsoft自身の4つのGitHub組織 — Azure、Azure-Samples、microsoft、MicrosoftDocs — にまたがる73のリポジトリに認証情報窃取コードをプッシュしました。その中には公式デプロイActionである`Azure/functions-action`や、5月に一度浄化済みだった`durabletask`も含まれていました。今回、ペイロードは`npm install`を待ちませんでした。開発者がClaude Code、Cursor、Gemini CLI、またはVS Codeでリポジトリを開いた瞬間に発火したのです。なぜ信頼シグナル — 「Microsoftのリポジトリだから」 — が再び攻撃面だったのか、そしてそれを開くエージェントが、プロファイルごとのBromure VM内で、認証情報ブローカー、読み書きguardrail、パッケージクールダウンの背後に住むとき何が変わるのかを示します。

1週間前、ワームはRed Hatのnpmスコープに乗り込んできて、 preinstallフック経由で発火しました。今週はMicrosoftの GitHubに乗り込んできて、インストールを一切必要としませんでした。 Miasmaは、Microsoftが所有する73のリポジトリ — 公式デプロイActionであるAzure/functions-actionをはじめ — に プロジェクトスコープの設定を植え付け、開発者がClaude Code、 Cursor、Gemini CLI、またはVS Codeでリポジトリを開いた瞬間に ペイロードが実行されました。トリガーはクローンではありません。 あなたのエージェントで開くことがトリガーだったのです。

失敗したデプロイをデバッグするためにAzure/functions-actionを クローンする開発者はためらいません。そして向けるエージェントも ためらいません。それはMicrosoft自身のAzure組織からのファースト パーティリポジトリ — エコシステムの半分がAzure/functions-action@v1 として参照する、あのGitHub Actionの正典的なソースです。審査すべき メンテナーはいません。なぜならメンテナーはMicrosoftだからです。 目を凝らすべき名前もありません。なぜなら名前は本来あるべき通りに 正確だからです。だからリポジトリは開かれ、エージェントはあらゆる 現代的なコーディングツールがフォルダオープン時に行う通りに プロジェクトの設定を読み — そしてそれらの設定ファイルの1つが コマンドを指し、そのコマンドはおよそ4.3メガバイトの塊で、 ファイルシステムをキーのために読み始めます。

私たちはこのまさに同じキャンペーンのnpm側を取り上げました、 7日前のことです。Miasmaは同じワーム — TeamPCPが 5月中旬に公開した「Mini Shai-Hulud」コードの変種 — であり、 それが示す不快な事実も同じもので、もう一回転ねじを締めたものです: 評判の良いソースはセキュリティコントロールではない。それは コントロールのように感じられます。サプライチェーンアドバイスの ほとんどがそれに寄りかかっています。そして6月5日、それは何ひとつ 買えませんでした、しかも二重に:ネームスペースはMicrosoftのもので、 そして実行はあなたがインストールを選んだパッケージから来たもの ではありませんでした。それはフォルダを開くことから来たのです。

MiasmaがMicrosoftのリポジトリに行ったこと。

2026年6月5日から6日にかけて、GitHubは悪意のあるコミットが プッシュされた後、Microsoftの4つのGitHub組織にまたがる73の リポジトリを無効化しました。The Hacker NewsStepSecurity による詳細な分析によります。Redmond Magazine は6月8日に報じました。内訳:

  • Azure — 49リポジトリ。Azure/functions-action(公式の Functionsデプロイメント Action)と、.NET、Python、Java、Go、 PowerShell用の言語ワーカーを含みます。
  • microsoft — 10リポジトリ。
  • Azure-Samples — 13リポジトリ。
  • MicrosoftDocs — 1リポジトリ。

その形を、仕組みまで剥ぎ取ると:

  • 侵入口は、コミットアクセスを持つ以前に侵害されたコントリビュー ターアカウントで、リポジトリに直接悪意のあるコミットを プッシュするために使われました — [skip ci]とタグ付けされ、 さもなければ実行されたであろうCI/CDチェックをすり抜けました。
  • そのコミットはプロジェクトスコープの設定 — フォルダを開くと コーディングエージェントやIDEが自動的に読んで実行する類の ファイル:エディタのタスク、エージェントフック、プロジェクトで 定義されたMCPサーバー — を植え付けました。これは Adversa AIのTrustFallが Claude Code、Cursor CLI、Gemini CLI、Copilot CLIにまたがって 実証したのと同じ類の信頼境界です — 4つすべてが、フォルダ信頼の プロンプトの直後にプロジェクト定義の設定を実行します。
  • ペイロード — およそ4.3 MBの難読化されたコード — は、 リポジトリがClaude Code、Gemini CLI、Cursor、またはVS Codeで 開かれたとき、またはnpm testスクリプト経由で実行されたときに 実行されました。クローンだけでは発火しません。 クローンした ツリーにエージェントを向けるという行為が、それを実行したのです。
  • 実行時、ペイロードはホストをGitHubトークン、AWSキー、Azure サービスプリンシパル、GCP認証情報、npmおよびPyPI公開トークン、 SSHキー、.envファイルのためにスイープし、盗んだアクセスを 使って自身を先へとコミットしました — これがそれを一回限りでは なくワームたらしめているものです。

1つの詳細は深掘りする価値があります:Azure/durabletaskが攻撃を 受けたリポジトリの中にあり — そしてそれは5月にすでにTeamPCP キャンペーンで侵害され、浄化されていました。一度修復された リポジトリが、5週間後に再び汚染されたのです。浄化は、到達して 維持できる状態ではありません。それは、チェーン内の別の認証情報が 奪われた瞬間に転がり落ちてしまう状態なのです。

何が起きなかったかについても、同じくらい正確である価値が あります。Microsoftの社内ネットワークは侵害されていません。 クラウドサービスとしてのAzureも侵害されていません。顧客データも 本番システムも触れられていません。これはソースコードリポジトリ に対する攻撃であり — そしてその最も広く感じられた帰結は、マルウェア そのものとは何の関係もありませんでした:GitHubが Azure/functions-actionを無効化した瞬間、Azure/functions-action@v1を 参照していた地球上のあらゆるパイプラインが解決を停止したのです。 Microsoftは最も注目度の高い運び手でした。実際に乗っ取られたのは、 6月3日から5日の間にエージェントで汚染されたリポジトリを開き、 自分のマシンから認証情報をスイープされた開発者たちでした。

開発者ラップトップ — フォルダオープン時にエージェントが実行する何にでも見えるホスト秘密MICROSOFT自身のGITHUB侵害されたコントリビューターアカウント → push [skip ci]Azure/functions-actionAzure/durabletask(再び)+ プロジェクト設定を植え付け開発者がクローンgit clone …/functions-actionまだ何も実行されないファーストパーティ ⇒ためらう理由なしコーディングエージェントで開く — ペイロード発火Claude Code · Cursor · Gemini CLI · VS Codeフォルダオープン → プロジェクト設定を読むエージェントフック / タスク / MCPサーバー↳ 4.3 MBのペイロードを実行(クローンだけでは実行されなかった)ホストファイルシステム&ENV — 全て本物、全てペイロードが読める$GITHUB_TOKEN, gh hosts.ymlpushアクセス(本物)~/.aws, Azure SPNクラウドキー(本物)~/.npmrc, PyPIトークンここで公開(本物)~/.ssh/id_ed25519, .envキー + CIシークレット(本物)tar | encrypt | exfiltrate→ マシンから収集される自己伝播盗んだGitHubアクセス次のリポジトリにコミット同じ設定を植え付ける73リポジトリ, 4組織durabletask: 二度被弾
影響を受けたMicrosoftリポジトリをコーディングエージェントで開く開発者マシン上のMiasma。以前に侵害されたコントリビューターアカウントが、プロジェクトスコープの設定 — エージェントフック、エディタタスク、MCPサーバー定義 — を植え付ける[skip ci]コミットをプッシュします。開発者はリポジトリをクローンし(何も実行されない)、Claude Code、Cursor、Gemini CLI、またはVS Codeで開きます。フォルダオープン時、エージェントはその設定を読んで実行し、4.3 MBのペイロードを実行します。これはホストをGitHubトークン、AWSキー、Azureサービスプリンシパル、npm/PyPIトークン、SSHキー、.envファイルのためにスイープし、それらを暗号化し、外に送り出し、盗んだGitHubアクセスを使って自身を次のリポジトリにコミットします。タイポスクワットなし、偽メンテナーなし、npm installなし。信頼シグナルはMicrosoftの組織名であり、実行はフォルダを開くことから来ます。

Bromure Agentic Coding内で開かれた同じリポジトリ。

Bromure Agentic Codingは、あなたのコーディング エージェントをプロファイルごとのLinux VM内で実行します — 独自のカーネル、独自のファイルシステム、独自のネットワーク スタックを、AppleのVirtualizationフレームワーク上で持ちます。 プロファイルは一貫した作業のスコープです:このクライアントこの内部サービスデプロイをデバッグするためにクローンした このオープンソースリポジトリ。あなたはAzure/functions-actionを そのプロファイルにクローンし、その中でエージェントで開きます。 フォルダオープンのトリガーは設計通りに正確に発火します。ペイロード は実行されます。そしてそれは、到達できないホスト上のキーを探しに 行きます。

なぜなら認証情報はプロファイル内にないからです。VMはスタブgitghawskubectlnpm、その他Authorizationヘッダー を期待する何にでも本物に見える偽トークン — を出荷します。あなたの Mac上のプロキシがサンドボックスから出ていくすべての接続の前に座り、 スタブを認識し、リクエストが出ていく際にワイヤ上でそれを本物の 秘密と入れ替えます(鍵を握っていたサンドボックスが その仕組みを解説しています)。本物のGitHub PAT、本物のAWSキー、 本物のAzureプリンシパル — それらのどれも、VMが読めるファイル、 環境変数、メモリのページに触れません。SSHキーはmacOSのキーチェーン から一切出ません。OpenSSHが常に意図していた通り、ssh-agent ソケットだけが転送されます。

ではMiasmaのスイープをその境界を通して歩いてみましょう。 ペイロードは環境を$GITHUB_TOKENのために読み、スタブを見つけます。 ~/.awsを読み、何も見つけません。~/.npmrcを読み、公開トークン を見つけません。~/.sshを読み、キーファイルを見つけません — そこにあるのは転送されたソケットであって、ディスク上の秘密鍵では ありません。4.3 MBの塊は、書かれた通りに正確に最後まで実行されます。 それはただ、あなたのキーを一度も保持していなかった箱を、重要な全て からハードウェアで強制された境界の反対側で流出させるだけです。

プロファイルごとのBROMURE VMエージェントがfunctions-actionを開くプロジェクト設定 → ペイロード発火実行されるがゲスト内に限るペイロードに見えるもの$GITHUB_TOKENstub_7f3a…~/.aws, ~/.npmrcスタブ / 不在~/.ssh キーファイルソケットのみ伝播: git push(自身)書き込みが必要 → プロキシに依頼ホストキーの流出: 奪うものなし依存関係が必要?npm install → 取得がVMを出るBromureのプロキシ経由でプロキシ · あなたのMAC認証情報ブローカー本物のPAT/キーをここで保持スタブ → 本物、ワイヤ上で値はVMに入らないGUARDRAIL: 読み書きpush = 変更 → プロンプト動詞 + ターゲットを名指しサプライチェーンOSV + socket.dev スキャンクールダウン: < 2日は保留インストールスクリプト除去結果ホストキー:スタブが収集され、本物は手付かず伝播のためのpush:一時停止、あなたが拒否新鮮な悪性パッケージ:VMに決して届かない被害半径 = 1プロファイル
Miasmaがそれらに当たる順番に、3つの層。(1) サプライチェーン:プロキシはすべてのパッケージ取得をOSVとsocket.devに照らしてスキャンし、クールダウンより新しいリリースを隔離します — そのためエコシステムがまだ追いついている間、エージェントは新鮮な悪意ある依存関係を引き込むことすらできません。(2) 認証情報の仲介:VMはスタブだけを保持し、本物の秘密はプロキシの背後でホスト上に座り、ワイヤ上で入れ替えられるので、ペイロードのホストスイープはプレースホルダーを見つけます。(3) Guardrails:ワームの伝播ステップ — 自身を先へコミットするためのgit push — は状態を変える呼び出しであり、読み書きguardrailがそれをワイヤ上で止めて、動詞とターゲットを名指しして尋ねます。各層はエージェントの下、エージェントが迂回できないVM境界で強制されます。

伝播ステップは書き込みであり、書き込みはプロンプトを受ける。

キーを盗むことはMiasmaの半分にすぎません。もう半分は拡散です: それは盗んだGitHubアクセスを使って自身を次のリポジトリにコミット し、それが一握りの汚染されたリポジトリを73に変えたものです。 正当にpushアクセスを持つプロファイルの中であっても — たとえば あなたがPRを出すつもりでfunctions-actionをクローンしたとして も — ワームの伝播ステップは依然としてプロキシを通って出ていかねば ならず、そこでGuardrailsがそれを迎え撃ちます。

Guardrailsは接続だけでなく操作を読みます — 読み取りと書き込みを 見分けます。git fetchは読み取り、git pushは書き込みです。 プロファイルのGitHub認証情報を書き込み時に尋ねるに設定すると、 エージェントが状態を変える呼び出しに手を伸ばした瞬間 — ワームが 自身の設定を書き戻すのに必要なgit-receive-pack、APIに対する DELETE、EC2へのTerminate* — Bromureはそれをワイヤ上で止め、 動詞、ターゲット、プロファイルを名指しするプロンプトをあなたのMac 上に表示します。あなたが与える付与は時間制限付きです:リリースには 15分、恐ろしいものには単回限り、要求が意味をなさなければ決して。 読み取りはあなたを中断しません。エージェントは一日中fetchしgrepし 読みます。一時停止するのは変更なのです。

これは「エージェントがトークンを持っている」と「エージェントが そのトークンで何でもできる」の違いです。Miasmaの拡散メカニズム 全体は、エージェントが行うと一度もあなたに告げなかった書き込みで あり — そしてエージェントが行うと一度も告げなかった書き込みこそ、 読み書きプロンプトが捕まえるために作られたまさにそのものです。 ワームを伝播させるpushは、あなたが許可しないをクリックする ダイアログボックスになります。「エージェントが本番データベースを 削除した」が事後検証であることをやめ、 あなたが拒否したプロンプトになるのと同じ仕方で。

バージョンは数時間前のもので、Bromureはパッケージを熟成させる。

Miasma — そしてより広範なMini Shai-Hulud系統 — が開発者に到達する 2つ目の方法があります:あなたが開くリポジトリ経由ではなく、 エージェントが作業中にインストールする新鮮に汚染された パッケージ経由です。このキャンペーンのRed Hat側がまさに それで、信頼されたスコープの32パッケージにかかったpreinstall フックでした。そしてそれらのインシデントの残酷な詳細はタイミング です:侵害されたバージョンは典型的に数時間以内に捕まえられて 撤回されます — しかしまさにその数時間こそ、無人で実行される自律 エージェントがそれを引き込みかねない時間なのです。

Bromureのサプライチェーン層は、同じ境界プロキシをスキャン チェックポイントに変え、当日侵害に対して実際に重要な2つのことを 行います:

  • すべての取得をOSVに加えてsocket.devに照らして強制スキャン します。 OSVは、あなたが設定した深刻度しきい値を超える既知の CVEを捕まえます。socket.devは、脆弱性データベースがまだ追いついて いないもの — 不正なインストールスクリプト、振る舞い型マルウェア、 タイポスクワット、公開されたばかりの侵害 — を捕まえます。 フラグの立ったリリースは、tarballがVMに着地する前にブロックされ ます。決定的なのは、スキャンがエージェントの、プロキシで 実行されることです:エージェントが自身の設定をどう書き換えて あなたを迂回しようとも、取得は依然として越えられない境界を通って 出ていくのです。
  • クールダウンを強制します。 Bromureは、過去2日以内に公開された あらゆるリリースを隔離します — 調整可能 — そのため1時間前に アップロードされたバージョンは、エコシステムが追いつく間、その プロファイルでは単にインストール不可能です。機会の窓全体が 公開撤回の間の隙間であるワームに対して、クールダウンは パッケージが悪く見えるかどうかについてのヒューリスティックでは ありません。それは、最初に見つける役を引き受けることへの拒否 です。Bromureがオンザフライで行うインストールスクリプト除去 — tarballからpostinstallフックを引き抜き、インストールが依然 として検証されるようメタデータハッシュを修正する — と組み合わせれ ば、着地するパッケージは無害化されて着地します。

Miasmaに固有には、リポジトリオープンのベクターが見出しです。しかし 同じキャンペーンはパッケージ経由でも拡散し、クールダウンこそが そのnpm側を飢えさせたであろうコントロールです:新鮮な @redhat-cloud-servicesリリース、あるいはそのMicrosoftリポジトリを デバッグ中に引き込まれた新鮮に汚染された推移的依存関係は、それが 危険であるまさにその数時間を通して隔離の中に座ります。

これがあなたを救わない場所。

あなたが承認するpushは、起きるpushです。

読み書きguardrailは、エージェントがあなたに告げなかった書き込み を捕まえます。それはdiffを読みません。あなたが正当に functions-actionにpushしていて、プロンプトを承認するなら、 Bromureはそのpushを転送します — 原理的には、あなたがdiffで 気づかなかった汚染されたワークフローを含めて。承認するものを 読んでください。セッショントレースが、 どのdiffを読むべきかを教えてくれます。

クールダウンは窓であって、壁ではありません。

2日は観測された公開から撤回までの隙間に合わせて調整されています が、忍耐強い攻撃者はクールダウンより長く侵害されたバージョンに 座り続け、それでも3日目にはインストール可能になり得ます。 クールダウンは当日ワームを飢えさせます。それは単に古くなっただけ のパッケージを保証するものではありません。socket.devとOSVが 依然としてそれぞれの役割を果たさねばなりません。

プロファイルは長命なので、持続化は持続します。

Bromureプロファイルは使い捨てのディスクではありません。 プロファイル内のスタートアップパスに自身を書き込むペイロードは、 そのプロファイルでの次のセッションまで生き残れます。それが 目覚めるのは、ホストキーのないゲストと、短命でプロンプトされ、 スコープ制限されたトークンしか話さないブローカーです — 何も 入っていない箱の中での存在 — しかしそれでも存在です。

意図的にブローカーのスコープを定めてください。

あるプロファイルが今日あるリポジトリにpushするようプロビジョニ ングされていて、そのプロファイルが今日Miasmaを実行するなら、 承認された書き込みは通ります。ブローカーの付与が機能するのは、 それが狭いからです。リポジトリを読むだけでよいプロファイルは それに書き込めるべきではありません。決して公開しないプロファイル は公開トークンを保持すべきではありません。隔離は被害を封じ込め、 スコープ定めはそれがそもそもどれだけ大きくなり得たかを決めます。

次の信頼されたリポジトリは、すでにどこかにクローンされている。

TanStackワームの教訓は、 ロックファイルと署名は防御ではないということでした。 Red Hatスコープの教訓は、 公開者もまた防御ではないということでした。Microsoftは次の系を 加えます:リポジトリもまた防御ではなく、そしてトリガーは あなたが選んだインストールである必要さえない — それはあなたの エージェントが開いたフォルダであり得る。Azure/functions-action リポジトリは、信頼されることで何も悪いことをしませんでした。 信頼されることは正典的なファーストパーティ Actionの全ての目的で あり、それこそがそれを汚染する価値のあるものにしたまさにその ものです — durabletaskの場合は二度も。

あなたはそれを、もっと注意深く信頼することでは直せません。なぜなら 信頼は決して見当違いではなかったからです。あなたは、「これはどの リポジトリか」と「どのスコープがこれを公開したか」があなたの キーチェーンが依存する質問でなくなるように物事を配置することで、 それを直します。Bromure Agentic Codingは、 エージェントがプロファイルごとのVM内でリポジトリを開き、本物の 認証情報がブローカーの背後でホスト上に留まり、エージェントが行う すべての書き込みがプロンプトを通り抜けねばならず、パッケージは クールダウンを生き延びるまでインストールできない、そんな設定です。 汚染されたフォルダオープンにできる最悪のことは、あなたのキーを 一度も保持していなかった箱を流出させることです。無料、オープン ソース、そして今日出荷されています。