Mini Shai-HuludがAntVを襲撃:メンテナーアカウントの侵害により300超の悪意あるnpmパッケージが公開
2026年5月19日
27 分で読めます@antvの
攻撃には、
要約
攻撃の | サプライチェーン攻撃、 |
脅威アクター | TeamPCP |
キャンペーン | Mini Shai-Hulud |
インシデント発生日 | 202 |
侵害された | 323パッケージに |
推定週間ダウンロード数 | 約1,600万件 |
マルウェアの | 認証情報の |
Snykの | Snyk Vulnerability Databaseに |
直ちに | 5月19日より |
影響を受けたパッケージ
侵害されたatoolは
第1波:01:39~01:56 UTC
(約317バージョン) 第2波:02:05~02:06 UTC
(約314バージョン)
影響を
パッケージ | Snyk Advisor | 月間ダウンロード数 |
| 420万 | |
| 380万 | |
| 220万 | |
| 115万 | |
| 100万+ |
侵害されたtimeago.js、size-sensor、canvas-nest.jsなど、
AntVは
攻撃の仕組み
ステージ1:メンテナーアカウントの侵害
攻撃は、atoolの
ステージ2:悪意あるパッケージの自動公開
攻撃者は
ルート階層の
index.js:498KBの、高度に 難読化された Bun用JavaScriptペイロード package.jsonを変更し、 次を 追加: "preinstall": "bun run index.js"
preinstallライフサイクルフックは、
ステージ3:Sigstoreの来歴情報を利用した孤立コミットの注入
今回のantvis/G2リポジトリに
注目すべき
このhuiyu.zjt <huiyu.zjt@ant.com>にantvis/G2を
この
盗んだhttps://fulcio.sigstore.dev)からhttps://rekor.sigstore.dev)
重要なのは、
ステージ4:認証情報の収集
開発者のbun run index.jsが
AWS:アクセスキー
( AKIA[0-9A-Z]{16})、セッショントークン、 EC2 IMDS ( 169.254.169.254)、ECSメタデータ ( 169.254.170.2)、Secrets ManagerGCP:サービスアカウントJSON、
アプリケーションの デフォルト認証情報 Azure:サービスプリンシパルの
認証情報 GitHub:PATと
OIDCトークン ( gh[op]_[A-Za-z0-9]{36,})npm:
bypass_2faスコープの公開トークン インフラストラクチャ:Kubernetesサービスの
トークン、 HashiCorp Vaultの トークン データベース:MongoDB、
MySQL、 PostgreSQL、 Redisの 接続文字列 サービス:Stripeキー、
Slackトークン、 Docker認証設定 SSHキー:
~/.ssh/id_*
GitHub Actions環境では、/proc/{pid}/mem経由で
ステージ5:データの窃取
収集した
データは
主要C2:
https://t[.]m-kosche[.]com:443/api/public/otel/v1/traces(OpenTelemetryのトレースデータを 装う) GitHubの
予備的な 隠し場所:GitHubトークンが 見つかると、 ペイロードは 被害者の アカウントに リポジトリを 作成します。 名前は Duneを モチーフに した もので、 sardaukar、fremen、atreidesなどの単語と sandworm、ornithopter、stillsuitなどの単語を 組み合わせ、 0~999の 数字を 付けます。 READMEファイルには、 過去の Shai-Huludキャンペーンで 使われた 特徴的な フレーズを 逆順に した もの (例: 「niagA oG eW ereH :duluH-iahS」)が 含まれます。 盗んだ データは results/results-<timestamp>-<counter>.jsonとして コミットされます。 HTTPリクエストの User-Agentには "python-requests/2.31.0"が使われます。
ステージ6:永続化
ペイロードは、npm uninstallでは
AIコーディングエージェントの
乗っ取り: .claude/settings.jsonを作成し、 SessionStartフックでnode .claude/setup.mjsを実行します。 これに より、 影響を 受けた ディレクトリで 開発者が 新しい Claude Codeセッションを 開始する たびに、 マルウェアが 再実行されます。 これは、 TanStackなど 過去の サプライチェーン攻撃キャンペーンでも 見られた 手法と 似ています。 IDEフック:
.vscode/tasks.jsonを変更し、 "runOn": "folderOpen"を設定して、 プロジェクトを 開いた ときに 実行されるようにします。 OSレベルの
デーモン: ~/.local/share/kitty/cat.pyをインストールします。 これは、 firedalazerという キーワードを 含む コマンドを 探す ため、 GitHubの コミット検索APIを 1時間ごとに ポーリングする バックグラウンドデーモンです。 コマンドは ハードコードされた 4096ビット公開鍵で RSA-PSS 署名されている ため、 攻撃者は 最初の 感染後も 長期間に わたり、 侵害された マシンで 任意の Pythonコードを 実行させる ことができます。 Linuxでは systemdユーザーサービス ( ~/.config/systemd/user/kitty-monitor.service)として、 macOSでは LaunchAgent ( ~/Library/LaunchAgents/com.user.kitty-monitor.plist)として 登録されます。
トークン監視:~/.local/bin/gh-token-monitor.shが
ステージ7:ワームによる拡散
ペイロードはbypass_2faスコープの
また、chore/add-codeql-static-analysisと"Run Copilot"(.github/workflows/codeql.yml)です。toJSON(secrets)をformat-results.txtと
影響の分析
直接的なnpm installを
CI/CD環境は
開発者の.claude/settings.jsonの
自己拡散機能がatoolアカウントの
検知方法
ロックファイルをpackage-lock.jsonまたはyarn.lockにatoolアカウントが
Snykで
ツリー内の
永続化の
パッケージレベルの
node_modules/<package>/package.jsonに、preinstallスクリプトbun run index.jsが存在する ペイロードの
SHA2 56: a68dd1e6a6e35ec3771e1f94fe796f55dfe65a2b94560516ff4ac189390dfa1cgithub:antvis/G2#1916faa365f2788b6e193514872d51a242876569(またはコミット 7cb42f57561c / dc3d62a2181b)を参照する オプションの 依存関係
ネットワーク上の
クラウド環境以外からの
169.254.169.254または169.254.170.2(クラウドメタデータのエンドポイント)への アウトバウンドリクエスト OpenTelemetryの
パスを 含む t.m-kosche.com:443へのHTTPリクエスト 実際の
Pythonプロセスからではない、 User-Agentが python-requests/2.31.0のGitHub API 呼び出し
修復方法
影響を
ステップ1: トークンを失効させる前に、永続化の仕組みを削除する。
gh-token-monitor.shデーモンは
ステップ2: npmをクリーンアップし、侵害されていないバージョンを再インストールする。
--ignore-scriptsをpreinstall、postinstall、prepareの
ステップ3: すべての認証情報をローテーションする。
影響を
npm
公開トークン GitHubの
個人アクセストークンと Actionsの シークレット AWSアクセスキー
(および影響を 受けた ランナーから アクセス可能な IAMロール) GCPサービスアカウントキー
Azureサービスプリンシパル
Kubernetesサービスアカウントトークン
HashiCorp Vaultトークン
影響を
受けた マシンに 存在する SSHキー データベース接続文字列
環境変数や
設定ファイルに 保存された APIキー、 サービストークン
ステップ4: GitHub上のワークフローへの不正な挿入とデッドドロップリポジトリを監査する。
ステップ5: 今後の被害を防ぐ。
組織内の
すべての パッケージで、 公開保護を 有効に した npmの 2要素認証を 有効化します。 CI設定に
npm install --ignore-scriptsをデフォルトと して 追加します。 整合性チェック付きの
ロックファイルを 使い、 依存関係を 正確な バージョンに 固定します。 レジストリの
クールダウンポリシーを 検討してください。 公開から 7日以内の パッケージに フラグを 付け、 保留します。 パッケージが
悪意 ある ものとして 報告された 時点で 検出できるよう、Snykを 使って 依存関係 ツリーを 継続的に 監視しましょう。 今後の
マルウェアインシデントを 防ぐ ための セキュリティ制御と 対策に ついて、npm security best practicesリポジトリを 参照し、 その 推奨事項に 従う ことを 強く お勧めします。
より大規模なキャンペーン: Shai-Huludの波状攻撃
AntVへの
波 | 日付 | 主な | 規模 | 特徴的な |
第1波 | 202 | npm | 約4パッケージ | 初の |
第2波 | 202 | Zapier、Posthog、Postman | 600以上の | コンテナからの |
第3波 | 202 | SAP CAP-JS、MBT | 4パッケージ | Claude Codeの |
第4波 | 202 | @tanstack/* | 84バージョン/42パッケージ | OIDCハイジャックに |
第5波 | 202 | @antv/* + 310以上 | 637バージョン/323パッケージ | メンテナーアカウントの |
Snykでは、
各波では、SessionStartフックは
Shai-Huludキャンペーン全体への

Shai-Hulud NPM攻撃: Snykを
攻撃のタイムライン(2026年5月19日、UTC)
時刻 | イベント |
01:39 |
|
01:56 | 最初の |
02:05 | 第2波が |
02:06 | 第2波が |
約02:18 | 検知。 |
継続中 | 調査は |
Snykによる対応
Snykは、
この
Snykで サプライチェーンを 安全に
回答者の



