catch-img

@antv を起点とした「Mini Shai-Hulud」第三波の特徴と対応策を解説

2026年5月19日未明(UTC)、Alibaba 系の人気データ可視化ライブラリ群 @antv/* を起点とした、大規模なnpmサプライチェーン攻撃が発生しました。
本キャンペーン「Mini Shai-Hulud」の第三波では、わずか22分間で323パッケージ・637バージョンが侵害され、echarts-for-reacttimeago.js といった広く使われる周辺パッケージにも波及しています。

第三波の最大の特徴は、攻撃が npm 単独にとどまらず、PyPI・VSCode拡張・GitHub Actions をまたぐ「マルチエコシステム攻撃」へと拡大したこと、そしてトークンを失効させても生き延びる新型のC2(遠隔操作)機構が組み込まれたことです。
第二波(TanStack)が「正規ビルドパイプラインのハイジャック」だったのに対し、第三波は「広大な公開権限を持つメンテナーアカウントの侵害」を起点としており、攻撃の入口と規模が大きく変わりました。

本記事では、第三波の特徴から脅威、対応策までを解説します。

国内唯一のISMAP登録済
脆弱性管理ツール

 脆弱性・EOL・OSSライセンスを一元管理
 SBOM・法規制に対応
 クラウド・オンプレ環境に対応

目次[非表示]

  1. 1.サマリー
    1. 1.1.今回の攻撃の3つの特徴
      1. 1.1.1.メンテナーアカウント侵害による「ポートフォリオ一括汚染」
      2. 1.1.2.npm にとどまらないマルチエコシステム化
      3. 1.1.3.トークン失効後も生き残る新型C2と、インシデント対応への「罠」
      4. 1.1.4.サプライチェーン攻撃の高度化
  2. 2.事象の解説
    1. 2.1.時系列タイムライン
      1. 2.1.1.Shai-Hulud キャンペーン全体の系譜
      2. 2.1.2.第三波の詳細タイムライン
    2. 2.2.攻撃メカニズム
      1. 2.2.1.①メンテナーアカウントの侵害
      2. 2.2.2.②自動化された大量公開
      3. 2.2.3.③optionalDependencies + GitHubコミット参照による第2の実行経路
      4. 2.2.4.④難読化と環境ゲーティング
      5. 2.2.5.⑤認証情報の窃取
      6. 2.2.6.⑥GitHub Actions ランナーメモリの窃取
      7. 2.2.7.⑦窃取データの送信(Exfiltration)
      8. 2.2.8.SLSA Provenance(来歴)の偽造
    3. 2.3.影響範囲
      1. 2.3.1.侵害されたパッケージ
      2. 2.3.2.直接の影響を受ける環境
      3. 2.3.3.開発環境への永続化
      4. 2.3.4.ワーム型の伝播
    4. 2.4.脅威の特徴
      1. 2.4.1.インシデント対応を妨害する「罠」
    5. 2.5.マルチエコシステムへの拡大
  3. 3.GitHubプライベートリポジトリへの侵害
    1. 3.1.インシデントの概要と被害規模
      1. 3.1.1.侵入の手口
  4. 4.緊急対応(感染が疑われる場合)
    1. 4.1.手順1. 影響範囲の確認
      1. 4.1.1.①ロックファイルの確認
      2. 4.1.2.②悪意のあるファイル・マーカーの確認
      3. 4.1.3.③CI/CDログの確認
      4. 4.1.4.④GitHubアカウントの確認
    2. 4.2.手順2. 永続化機構の停止(最優先)
      1. 4.2.1.Linux
      2. 4.2.2.macOS
      3. 4.2.3.IDE / AIツール設定の浄化
    3. 4.3.手順3. ネットワーク隔離
    4. 4.4.手順4. シークレットの即時ローテーション
    5. 4.5.手順5. キャッシュの浄化と環境の再構築
  5. 5.自衛の強化
    1. 5.1.--ignore-scripts を CI のデフォルトに
    2. 5.2.クールダウン戦略(重要)
  6. 6.サプライチェーンの脆弱性を可視化する 脆弱性管理クラウドyamoryのご紹介
    1. 6.1.幅広いレイヤーのITリスクを一元管理
    2. 6.2.分かりやすいダッシュボードで結果を可視化
    3. 6.3.間接依存関係にあるライブラリの脆弱性も瞬時に発見
    4. 6.4.政府認定のクラウドセキュリティ評価制度『ISMAP』に登録された唯一の脆弱性管理ツール

サマリー

今回の攻撃の3つの特徴

メンテナーアカウント侵害による「ポートフォリオ一括汚染」

攻撃者は、@antv データ可視化スイートを含む547パッケージを保有する npm メンテナーアカウント atooli@hust.cc)の公開資格情報を窃取し、アカウントを乗っ取りました。

第二波(TanStack)が pull_request_target の設定不備を突いた「ビルドパイプラインのハイジャック」だったのに対し、第三波の入口はアカウント侵害です。
攻撃者は、広大な公開権限を持つ一つのアカウントを狙うことで、5/19 01:39〜02:06 UTC のあいだに323パッケージ・637バージョンを自動的に汚染しました。さらに別のメンテナーアカウント prop も侵害され、同一キャンペーンとして6パッケージが公開されています。

「一つのアカウントを獲るだけで、その人が公開できるすべてに悪意あるバージョンを撒ける」
これがワーム型サプライチェーン攻撃の本質であり、第三波はその破壊力を改めて示しました。

npm にとどまらないマルチエコシステム化

第三波は npm 単独の事象ではありません。同一キャンペーンの一部として、以下の複数エコシステムにまたがる侵害が確認されています。

  • npm: @antv/* を中心とした323パッケージ・637バージョン

  • npm(SAP系): @cap-js/openapi 1.4.1(SAP CAP のOpenAPI生成ツール)

  • PyPI: durabletask 1.4.1〜1.4.3(Microsoft の Azure Durable Task Python SDK)

  • VSCode拡張: nrwl.angular-console 18.95.0

  • GitHub Actions: actions-cool/issues-helperactions-cool/maintain-one-comment

特に PyPI の durabletask 版ペイロードは、単なる認証情報窃取にとどまらず、AWS Systems Manager(SSM)と Kubernetes を悪用した横展開(ラテラルムーブメント)機能を備えており、侵害された開発環境やCIランナーから他のクラウドワークロードへ感染を広げる「侵入フレームワーク」へと進化しています。

トークン失効後も生き残る新型C2と、インシデント対応への「罠」

第二波までの永続化機構(gh-token-monitor)に加え、第三波では kitty-monitor という新しいC2デーモンが追加されました。これは ~/.local/share/kitty/cat.py に設置され、GitHub のコミット検索APIをC2チャネルとして悪用します。攻撃者がキーワード firedalazer を含む署名済みコミットを投稿すると、感染端末がそれをポーリングして検知し、任意の Python コードをダウンロード・実行します。

この機構の厄介な点は、窃取済みGitHubトークンが有効かどうかに依存しないことです。
つまり、トークンをローテーション(失効)させても kitty-monitor は生き残ります。

さらに、gh-token-monitor には自爆機構が組み込まれています。窃取したGitHubトークンが失効すると rm -rf ~/; rm -rf ~/Documents を実行し、ホームディレクトリとドキュメントを破壊します。インシデント対応の定石である「まずトークンを失効させる」をそのまま実行すると端末データが消える設計であり、対応の順序を誤ってはいけません。

サプライチェーン攻撃の高度化

近年のnpmサプライチェーン攻撃は、単純なマルウェア混入から、CI/CD・クラウド・開発者ツールのすべての層を狙う「侵入フレームワーク」へと進化しています。

第三波は、署名(SLSA Provenance)・スキャナ・--ignore-scripts といった既存防御を同時にすり抜けるだけでなく、StepSecurity Harden-Runner などのCI/CDセキュリティツールを能動的に無効化し、GitHub Actions のワークフローログから証拠を消去する挙動まで備えています。「検知できる」ことと「被害を防げる」ことは別問題であり、自衛戦略の抜本的な見直しが求められるフェーズに入ったと認識すべきです。

なお、本キャンペーンを運用する攻撃者グループ「TeamPCP」は、攻撃フレームワークのソースコード全体を公開(オープンソース化)したと報じられています。これにより、OIDCトークン悪用・Provenance偽造・AIツール永続化といった高度な手口が他の攻撃者にも拡散し、模倣犯による亜種の出現が既に確認されています。

事象の解説

時系列タイムライン

Shai-Hulud キャンペーン全体の系譜

発生時期

名称

主な標的

影響規模

手口の特徴

2025年9月

Shai-Hulud 初期

npm(広範)

約4パッケージ

自己増殖型npmワームの初出現

2025年11月

SHA1-Hulud

Zapier, PostHog, Postman ほか

600超パッケージ

コンテナ脱出、破壊的ワイパー

2026年4月

Mini Shai-Hulud 第一波

SAP CAP-JS / MBT

約4パッケージ

Claude Code の SessionStart フック注入が初出

2026年5月11日

Mini Shai-Hulud 第二波

@tanstack/*

42パッケージ・84バージョン

OIDC窃取による有効なSLSA署名付きワーム

2026年5月19日

Mini Shai-Hulud 第三波

@antv/*ほか

323パッケージ・637バージョン

メンテナーアカウント侵害、マルチエコシステム化

第三波の詳細タイムライン

日時

出来事

5/16 06:10

GitHub上で最も早い窃取データ送信(exfil)リポジトリの作成を確認

5/18 11:49

@cap-js/openapi 1.4.1 が、侵害された cap-npm のPAT経由で公開(OIDCフローを迂回)

5/18 12:25〜12:36

SAP関連のexfilリポジトリ出現、クリーンな @cap-js/openapi がOIDC経由で再公開

5/19 01:25

悪意あるorphanコミット 1916faa3…antvis/G2 リポジトリへ push

5/19 01:39

atool アカウントから最初の悪意ある @antv パッケージが公開

5/19 01:47

悪意あるorphanコミット dc3d62a2…antvis/G2 へ push

5/19 01:56

第1公開波が終了(約317バージョン)

5/19 02:05〜02:06

第2公開波(約314バージョン)

5/19 〜02:18

各種スキャナによる検知開始、セキュリティ研究者が報告を開始

5/19 04:00

窃取データ送信用の公開GitHubリポジトリを約1,948件確認(以降も増加)

5/20

Microsoft などがレポート公開、GitHubが大規模な無害化措置を実施、antv アカウント側も収束を確認

攻撃メカニズム

第三波の侵害は、以下の段階が連鎖して成立しました。

①メンテナーアカウントの侵害

攻撃の起点は、npm メンテナーアカウント atool の公開資格情報の窃取です(窃取経路は調査中)。このアカウントは @antv スイートを含む547パッケージの公開権限を持っていました。

②自動化された大量公開

侵害されたアカウントから、悪意あるバージョンが2つの波に分けて高速に公開されました。各パッケージのtarballには、正規のライブラリコードを残したまま、以下の2点が追加されています。

  • ルート直下に、約499KBの高度に難読化された index.js ペイロード

  • package.json"preinstall": "bun run index.js" の追加(および bun を依存関係に追加)

preinstall フックは npm install の最中、他のインストール処理よりも前に自動実行されます。期待したライブラリと一緒に、ワームも同時に手に入る構図です。

③optionalDependencies + GitHubコミット参照による第2の実行経路

第二波(TanStack)と同じ手口として、package.jsonoptionalDependencies に、npm公開パッケージではなく GitHub のコミットを直接参照するエントリが注入されました。

"optionalDependencies": {
  "@antv/setup": "github:antvis/G2#<コミットハッシュ>"
}

攻撃者は正規の antvis/G2 リポジトリをフォークし、ペイロードを含む orphanコミット(どのブランチにも属さないコミット) を作成したうえでフォークを削除しました。GitHubはフォーク削除後もコミットオブジェクトを保持するため、コミットハッシュさえ分かれば悪意あるコードにアクセスできます。コミットは実在するメンテナー(huiyu.zjt <huiyu.zjt@ant.com>)が作成したかのように偽装され、antvis/G2 への書き込み権限は一切不要でした。

この参照先で実行されるスクリプトは "prepare": "bun run index.js && exit 1" であり、&& exit 1 によって「依存関係のインストールに失敗した」ように見せかけつつ、ペイロード自体は既に実行を完了させる仕掛けになっています。多くの汎用脆弱性スキャナはnpmレジストリ外のGitHub参照を検査対象外としており、この時点で検知の網をすり抜けます。

④難読化と環境ゲーティング

index.js は単一行に圧縮された Bun バンドルで、多層の難読化が施されています。

  • 第1層: 1,732個のBase64文字列をローテーション配列に格納(シャッフルキー 0xa31de
  • 第2層: C2ドメインや環境変数名などの重要文字列を、独自のPBKDF2+SHA-256暗号で実行時にのみ復号
  • 環境ゲーティング: Microsoft が分析した検体では、GitHub Actions(Linux)以外の環境で即座に終了する挙動が確認されています。ただしブートストラップ経路の異なる複数の亜種が存在し、開発者端末(macOS を含む)を標的とするものも確認されています(後述の「開発環境への永続化」を参照)。なお Git API 経由でのデータ送信時は、main/master/dependabot//renovate//gh-pages ブランチを回避します

ペイロードは起動後、自身をデタッチされたバックグラウンドプロセスとして複製(デーモン化)し、フォアグラウンドのインストール処理は正常に見えるようにします。

⑤認証情報の窃取

ペイロードは80以上の環境変数と100以上のファイルパスを走査し、開発端末とCI/CD環境の双方から認証情報を収集します。

  • GitHub: GITHUB_TOKEN、PAT(gh[op]_*)、インストールトークン(ghs_)、GitHub CLI トークン、Actionsシークレット、OIDCトークン
  • AWS: アクセスキー、EC2 IMDS(169.254.169.254)、ECSメタデータ(169.254.170.2)、Secrets Manager、SSM Parameter Store
  • Google Cloud / Azure: サービスアカウントJSON、サービスプリンシパル資格情報
  • npm: 2FAバイパス(bypass_2fa)スコープを持つ公開トークン
  • インフラ: Kubernetes サービスアカウントトークン、HashiCorp Vault トークン(12以上のパスを探索)
  • パスワードマネージャ: 1Password、Bitwarden、Pass、Gopass(ロック解除の試行を含む)
  • その他: SSH秘密鍵、Docker認証情報、DB接続文字列、Stripe/Slackトークン、.env/.npmrc、AIツール設定(~/.claude.json~/.claude/mcp.json

⑥GitHub Actions ランナーメモリの窃取

Linux の GitHub Actions ランナー上では、ペイロードが Runner.Worker プロセスを /proc 走査で特定し、/proc/<pid>/mem から "isSecret":true とマークされたシークレット値を直接抽出します。これはワークフローログのシークレットマスキングを完全にバイパスする手口です。

加えて、バインドマウントを利用して runner ALL=(ALL) NOPASSWD:ALL のsudoersルールを注入する権限昇格や、/etc/hosts の改ざんも確認されています。

⑦窃取データの送信(Exfiltration)

収集データは「JSON化 → gzip圧縮 → AES-256-GCM暗号化 → RSAで鍵をラップ」という多重処理が施され、攻撃者のRSA秘密鍵でしか復号できません。仮に通信が捕捉されても、何が盗まれたかを防御側が特定できない設計です。

送信経路は冗長化されています。

  1. 主経路: hxxps://t.m-kosche.com:443/api/public/otel/v1/traces への直接HTTPS送信。OpenTelemetryのトレース送信に見せかけたパス。User-Agentは python-requests/2.31.0 に偽装(実体はJS/Bunプロセス)
  2. フォールバック: 有効なGitHubトークンが得られた場合、被害者アカウント配下に公開リポジトリを作成し、results/ 配下に暗号化データをコミット

GitHubのデッドドロップ・リポジトリは、Dune(砂の惑星)由来の単語を組み合わせた {dune単語}-{dune単語}-{3桁数字} 形式(例: atreides-ornithopter-112)で命名され、説明文には niagA oG eW ereH :duluH-iahS(逆から読むと Shai-Hulud: Here We Go Again)が含まれます。自社/個人のGitHubアカウントに身に覚えのない公開リポジトリが作られていないかは、侵害判定の有力なシグナルです。この説明文を持つ公開リポジトリは、5/19時点で1,948件(Upwind)から2,700件超(Aikido)まで観測されており、現在も増加しています。

SLSA Provenance(来歴)の偽造

窃取したGitHub Actions のOIDCトークンを使い、Fulcio(fulcio.sigstore.dev)から署名証明書を取得し、Rekor(rekor.sigstore.dev)に登録することで、暗号学的に有効な SLSA Build Level 3 の来歴情報を生成できます。

ここで重要なのは、署名そのものは「本物」であるという点です。Sigstoreの来歴は「どのパイプラインが成果物を生成したか」を証明するのであって、「そのパイプラインが正しく振る舞っていたか」は証明しません。「署名されているから安全」というメンタルモデルは、第二波・第三波で連続して破られています。

影響範囲

侵害されたパッケージ

汚染されたのは @antv 名前空間のコアパッケージ(@antv/g2@antv/g6@antv/x6@antv/l7@antv/s2@antv/f2@antv/g@antv/g2plot@antv/graphin@antv/data-set など)に加え、名前空間外の人気パッケージも含まれます。

パッケージ

概要

月間ダウンロード数(目安)

size-sensor

要素サイズ検知ユーティリティ

約420万

echarts-for-react

Apache ECharts の React ラッパー

約380万

@antv/scale

スケール計算ライブラリ

約220万

timeago.js

相対時刻表示ライブラリ

約115万

@antv/g6

グラフ可視化エンジン

約100万

さらに @lint-md/*@openclaw-cn/*@starmind/* 名前空間のパッケージや、canvas-nest.jsjest-canvas-mockjest-date-mock などのスコープなしパッケージにも波及しています。侵害されたパッケージ群は合計で週間約1,600万ダウンロード規模に達します。

AntV は Alibaba 発のデータ可視化スイートであり、企業ダッシュボード、財務レポートツール、グラフ分析プラットフォームなどで広く採用されています。ダッシュボードやチャート、データ集約型のUIをJavaScriptで構築している場合、依存ツリーのどこかに該当パッケージが含まれている可能性は十分にあります。

直接の影響を受ける環境

直接の影響範囲は、2026年5月19日 01:39〜約02:18 UTC の間に、侵害バージョンに対して npm install を実行した開発者・CI環境です。

特にCI/CD環境はリスクが高く、ペイロードは明示的に環境変数として渡されたものだけでなく、ランナープロセスがアクセスできるすべてのシークレット(OIDCトークン、リポジトリシークレット、組織シークレット)を読み取れます。侵害バージョンがインストールされた場合、それらはすべて侵害されたものとして扱うべきです。

開発環境への永続化

第三波が「パッケージを消すだけでは終わらない」のは、複数の永続化機構が仕込まれるためです。

  • AIコーディングエージェントの乗っ取り: .claude/settings.jsonSessionStart フックを作成し、node .claude/setup.mjs を実行。Claude Code セッションを開くたびにマルウェアが再実行される。ペイロードのコピーは ~/.claude/package/index.js~/.codex/package/index.js にも配置
  • IDEフック: .vscode/tasks.json"runOn": "folderOpen" を設定し、プロジェクトを開くたびに発火
  • kitty-monitor(新型C2デーモン): ~/.local/share/kitty/cat.py を設置。GitHubコミット検索を毎時ポーリングし、キーワード firedalazer を含むRSA署名済みコマンドを検知すると任意のPythonコードを実行。Linuxでは systemd ユーザサービス、macOSでは LaunchAgent として登録
  • gh-token-monitor(トークン監視): ~/.local/bin/gh-token-monitor.sh が60秒ごとに窃取トークンの有効性を確認

ワーム型の伝播

ペイロードには npm への伝播ロジックが残っており、これが各波の「速さ」を生んでいます。窃取した npm トークン(bypass_2fa スコープ)でアカウントが公開可能なパッケージを列挙し、ペイロードを注入して再公開します。GitHub Actions 環境では、Actions の OIDC トークンを registry.npmjs.org のエンドポイントでパッケージ単位の npm 公開トークンに交換することも可能です。

加えて、chore/add-codeql-static-analysis というブランチに、Run Copilot という名前のワークフロー(.github/workflows/codeql.yml)を注入し、toJSON(secrets)format-results というアーティファクトにダンプしたうえで、ワークフロー実行を削除して証拠を消す二段階の挙動も確認されています。

脅威の特徴

インシデント対応を妨害する「罠」

第三波のマルウェアは、防御側の対応を強く意識して設計されています。

  • 自爆機構: gh-token-monitor が窃取トークンの失効を検知すると rm -rf ~/; rm -rf ~/Documents を実行。ペイロードには脅迫文字列 IfYouInvalidateThisTokenItWillNukeTheComputerOfTheOwner がハードコードされている
  • トークンローテーション耐性: kitty-monitor はトークンの有効性に依存しないため、トークンを失効させても遠隔操作チャネルが生き残る
  • セキュリティツールの無効化: Docker環境では、StepSecurity Harden-Runner などの監視コンテナを特定して停止。/etc/hosts を改ざんし agent.stepsecurity.io などへの通信を遮断
  • その他の回避策: デコイ(おとり)トークンの検知、ペイロードハッシュの世代ごとの変更、特定ロケール(ロシア語環境など)でのスキップ

マルチエコシステムへの拡大

PyPI の durabletask 版ペイロードは、__init__.py にインポート時実行のローダーが追加されており、npm のライフサイクルスクリプトに頼らずとも、Python が当該パッケージを import した時点で発火します。さらに、AWS SSM の DescribeInstanceInformation で19リージョンのEC2インスタンスを列挙し、AWS-RunShellScript で他ホストへ感染を広げる、kubectl exec で他のPodへ感染するなど、「窃取」から「横展開」へと役割を進化させています。

GitHubプライベートリポジトリへの侵害

Mini Shai-Hulud第三波の被害として最も深刻なインシデントの一つが、VS Code拡張機能を起点としたGitHub内部リポジトリの侵害です。

インシデントの概要と被害規模

2026年5月20日、GitHubは自社の従業員端末がマルウェアに感染した結果、約3,800件のプライベートリポジトリが不正アクセスを受け、データが流出したことを公表しました。

攻撃者グループとみられる「TeamPCP」は、ダークウェブ上のフォーラムで犯行声明を出し、流出したソースコード等のデータを約9万5,000ドルで売却すると脅迫しています。

なお、GitHubは顧客環境や外部リポジトリへの影響は確認されていないと説明しています。

侵入の手口

攻撃の起点となったのは、220万以上のインストール数を持つ人気VS Code拡張機能「Nx Console」です。2026年5月上旬、Nxのコントリビューターの一人が、同じくMini Shai-Huludキャンペーンの一環として先行して流通していた悪意あるパッケージに巻き込まれ、ローカルのGitHub CLIトークンを窃取されました。

攻撃者はこのトークンを悪用し、2026年5月18日 12:30 (UTC) に、悪意のあるコードを仕込んだ nrwl.angular-console v18.95.0 をVS Code Marketplaceに公開しました。マーケットプレイス上での公開はわずか17分間(12:47に削除)でしたが、IDEの自動アップデート機能により、Nxの内部分析では約6,000件のアクティベーション(発火)が確認されています。

緊急対応(感染が疑われる場合)

⚠️ 対応順序を厳守してください
自爆機構を解除する前にトークンを失効させると、ホームディレクトリなどが削除される恐れがあります。また kitty-monitor はトークン失効後も生存します。必ず「① 影響範囲の確認 → ② 永続化機構の停止 → ③ ネットワーク隔離 → ④ シークレットの失効 → ⑤ キャッシュの浄化」の順で実施してください。

手順1. 影響範囲の確認

npm audit だけでは検知漏れが発生します。以下の観点で侵害の痕跡を確認してください。

①ロックファイルの確認

# 侵害された名前空間・パッケージを検索
grep -E "@antv/|@lint-md/|@openclaw-cn/|@starmind/|echarts-for-react|timeago\.js|size-sensor|canvas-nest\.js" \
  package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null

# GitHub URL形式の不審な依存(optionalDependencies等)が紛れていないか確認
grep -E "github:antvis/G2#|github:cap-js/openapi#|@antv/setup|@sap/setup" \
  package-lock.json pnpm-lock.yaml yarn.lock 2>/dev/null

検出されたバージョンが、2026年5月19日 01:39〜約02:18 UTC に公開されたものでないか、各社アドバイザリの侵害バージョン一覧と照合してください。

②悪意のあるファイル・マーカーの確認

# preinstall フックに bun run index.js が含まれていないか
grep -r "bun run index.js" node_modules/*/package.json 2>/dev/null

# ルート直下に注入された大容量(約400KB超)の index.js
find node_modules -maxdepth 2 -name "index.js" -size +400k 2>/dev/null

③CI/CDログの確認

GitHub Actions のログから、以下のシグナルを探してください。

  • npm install 中の予期しない bun の実行
  • @antv/setup / @sap/setup に関する optional dependency のインストールや失敗
  • 依存関係インストール中の t.m-kosche.com 等への予期しないアウトバウンド通信
  • 公開すべきでないワークフローからの npm publish や、不審な OIDC トークン要求

④GitHubアカウントの確認

# 説明文が "niagA oG eW ereH :duluH-iahS" の身に覚えのない公開リポジトリ
# Dune由来の命名(例: atreides-ornithopter-112)
gh repo list --json name,description \
  | grep -E "atreides|fremen|harkonnen|sardaukar|gesserit|fedaykin"

# 注入されたブランチ・ワークフロー
git branch --all | grep "codeql-static-analysis"

該当する公開リポジトリが存在する場合、窃取データのフォールバック送信が発生した証拠となります。

手順2. 永続化機構の停止(最優先)

⚠️ シークレットを失効させる前に、感染が疑われる端末・ランナーから永続化機構を停止・削除してください。
監視デーモン(gh-token-monitor / kitty-monitor)を先に無力化しておけば、その後のネットワーク隔離やトークン失効が自爆機構の引き金になる可能性そのものを排除できます。逆に隔離やトークン失効を先に行うと、実装次第で自爆機構が作動する可能性を否定できません。

Linux

# ① まず監視プロセスを SIGKILL で即時強制終了する
#    SIGKILL はプロセス側のハンドラで捕捉できないため、停止直前の rm -rf を防げる
pkill -9 -f 'gh-token-monitor' || true
pkill -9 -f 'kitty/cat\.py'    || true

# ② サービスを停止・無効化し、再起動および次回ログイン時の起動を防ぐ
#    (プロセスは①で終了済みのため、stop が SIGTERM をマルウェアに送ることはない)
systemctl --user stop    gh-token-monitor.service kitty-monitor.service 2>/dev/null || true
systemctl --user disable gh-token-monitor.service kitty-monitor.service 2>/dev/null || true

# ③ 永続化ファイルを削除する
rm -f  ~/.config/systemd/user/gh-token-monitor.service
rm -f  ~/.local/bin/gh-token-monitor.sh
rm -rf ~/.config/gh-token-monitor/
rm -f  ~/.config/systemd/user/kitty-monitor.service
rm -f  ~/.local/share/kitty/cat.py
rm -f  /var/tmp/.gh_update_state

macOS

# ① 監視プロセスを SIGKILL で即時強制終了する
pkill -9 -f 'gh-token-monitor' || true
pkill -9 -f 'kitty/cat\.py'    || true

# ② LaunchAgent を解除し、再起動および次回ログイン時の起動を防ぐ
launchctl bootout "gui/$(id -u)" ~/Library/LaunchAgents/com.user.gh-token-monitor.plist 2>/dev/null || true
launchctl bootout "gui/$(id -u)" ~/Library/LaunchAgents/com.user.kitty-monitor.plist   2>/dev/null || true

# ③ 永続化ファイルを削除する
rm -f ~/Library/LaunchAgents/com.user.gh-token-monitor.plist
rm -f ~/Library/LaunchAgents/com.user.kitty-monitor.plist
rm -f ~/.local/bin/gh-token-monitor.sh ~/.local/share/kitty/cat.py

IDE / AIツール設定の浄化

  • .vscode/tasks.json"runOn": "folderOpen" 設定を削除
  • .claude/settings.json の不審な SessionStart フックを削除
  • ~/.claude/package/index.js~/.codex/package/index.js.claude/setup.mjs.vscode/setup.mjs を削除
  • .github/workflows/codeql.yml の改ざんを確認

手順3. ネットワーク隔離

感染が疑われる端末・ランナーをネットワークから隔離してください。

手順4. シークレットの即時ローテーション

⚠️ 手順2、手順3の完了を確認した後にのみ実施してください

汚染環境からアクセス可能だったすべての資格情報を「変更」ではなく「失効(Revoke)」させ、新しいキーを発行してください。

  • AWS / Google Cloud / Azure / Kubernetes / Vault のアクセスキー・トークン
  • GitHub Personal Access Token、GitHub Actions シークレット
  • npm publish トークン、npm trusted-publishing アイデンティティ
  • SSH秘密鍵、Docker認証情報、DB接続文字列
  • パスワードマネージャの資格情報、AIツールに保存されたAPIキー

手順5. キャッシュの浄化と環境の再構築

GitHub Actions の「Caches」から関連キャッシュを削除し、汚染されたビルドキャッシュを排除してください。可能であれば、感染が疑われる開発端末・CIランナー・コンテナはクリーンイメージから再構築することを推奨します。汚染バイナリがキャッシュに残る限り、再感染のリスクは消えません。

自衛の強化

第三波のような攻撃を前提に、平時の防御策を見直す必要があります。

--ignore-scripts を CI のデフォルトに

preinstall / prepare 等のライフサイクルスクリプトは、インストール時に自動実行されます。CI環境では npm ci --ignore-scripts を標準とし、ライフサイクルスクリプトが本当に必要なケースのみ明示的に許可する運用が有効です。

ただし注意点として、optionalDependencies 経由のGit依存(github: 参照)は、利用するパッケージマネージャやバージョン次第で --ignore-scripts の効果が変わります。「--ignore-scripts しているから安全」と過信せず、後述のクールダウンと組み合わせてください。

詳しくは TanStackを起点とした「Mini Shai-Hulud」第二波の特徴と対応策を解説 を参照ください。

クールダウン戦略(重要)

サプライチェーン攻撃は「公開 → 検知 → アドバイザリ発行 → スキャナ反映」までに数時間〜半日のラグがあります。第三波でも、公開(01:39)から検知(約02:18)まで約40分の期間がありました。この期間の間に侵害バージョンを取り込むと、スキャナが反応する前にペイロードは既に実行され、認証情報は端末を離れています。

「速い検知」はインシデント対応には役立ちますが、最初の数十分にインストールしてしまった環境は守れません。最も実効性の高い防御は、新規公開バージョンを一定期間取り込まないことです。

  • パッケージマネージャ側で「公開後N日以内のバージョンを禁止」する設定(minimumReleaseAge 等)を導入
  • 社内プロキシレジストリで新規バージョンの取り込みを遅延
  • 依存更新PRの自動マージは、公開から一定期間経過後に限定

サプライチェーンの脆弱性を可視化する 脆弱性管理クラウドyamoryのご紹介

株式会社アシュアードが提供する脆弱性管理クラウド「yamory」は、システム内に潜む脆弱性などのITリスクの検知から対応の優先度付けまでを自動で行う、国産のクラウドサービスです。

yamoryを使えば、重大な脆弱性が発生したときでも、「どのプロジェクトで、どのバージョンの該当パッケージが利用されているか」を即座に特定することが可能です。

幅広いレイヤーのITリスクを一元管理

クラウド・オンプレミス環境に問わず、インフラからアプリレイヤー内のITリスク(脆弱性・EOL・OSSライセンスリスク・クラウド設定不備)を一元管理することができます。

分かりやすいダッシュボードで結果を可視化

お使いのシステム環境に合わせて、検出したITリスクの対応優先度を自動で判別し、結果をダッシュボードに可視化。専門家でなくてもリスクの状況をひと目で把握することができます。

間接依存関係にあるライブラリの脆弱性も瞬時に発見

ライブラリの依存関係をツリー構造で可視化。間接依存関係にあるライブラリの脆弱性も瞬時に発見することができます。

今回侵害にあった@antv等も、どこで使われているのかを瞬時に確認することができます。

政府認定のクラウドセキュリティ評価制度『ISMAP』に登録された唯一の脆弱性管理ツール

yamoryは、政府情報システムのためのセキュリティ評価制度『ISMAP』において、
「唯一、SBOM・脆弱性管理ツールとして登録された国産クラウドサービス」です。

経済産業省が策定した「ソフトウェア管理に向けたSBOMの導入に関する手引」においても、唯一の有償国産ツールとして紹介され、数多くの企業様に導入いただいております。

  • 重大サプライチェーン攻撃が発生したとき、すぐに該当パッケージが自社システムで使われているかを確認したい。
  • ITリスクを一元管理できるサービスを探している。

というご担当者様。
ぜひこの機会に、ISMAP登録済みのセキュアな基盤で、ITリスク管理をスタートしませんか?

国内唯一のISMAP登録済
脆弱性管理ツール

 脆弱性・EOL・OSSライセンスを一元管理
 SBOM・法規制に対応
 クラウド・オンプレ環境に対応

人気の記事

募集中のセミナー

ページトップへ戻る