テック技報最新号へ →
セキュリティ

--ignore-scripts だけでは止まらない npm ワームに備える(testmetest:ネイティブアドオンと AI ツール起動時の仕込み)

testmetest 系のワームには、インストール時ではなく「アプリが読み込んだ瞬間」にネイティブアドオンから起動する版と、Claude・Gemini のセッション開始や VS Code でフォルダーを開く操作で動く仕込みをリポジトリに置く版がある。install script の停止に加え、読み込み時・エディター起動時の実行も点検対象にする。

@MalwareBibleJP · 2026-10-30
#npm#supply-chain#worm#native-addon#ignore-scripts#ai-agent#vscode#incident-response

何が起きたか

  • JFrog は、11 の個人・組織が持つ GitHub リポジトリ 42 件で、Claude・Gemini のセッション開始時や VS Code でフォルダーを開いたときに不正コードを動かす設定を確認(42 件は配置の確認数で、実行成功数ではない)。
  • 約 13MB の不正ファイルは、GitHub のコード検索や通常のコンテンツ取得 API では見落とされ、ファイル構成を直接列挙して取得できた。10 種類の難読化ファイルが同じコードへ復号された。
  • 復号コードは、GitHub Actions 上から npm トークンや Trusted Publishing を使って不正公開を試みる系統。
  • SafeDep が調べた @testsecuiitytestme/cache-helper 1.0.3 は、Node.js のネイティブアドオンが隠しファイル .napi_cache を復号して起動する。--ignore-scripts では防げない。

対策

  1. install script の停止は前提のまま、それ以外も見る: 依存パッケージの install script を既定で止める(pnpm allowBuilds ほか) は引き続き有効だが、require 時に .node バイナリーを読むパッケージは別枠で審査する。新しく .node ファイルや binding.gyp、node-gyp-build 系の依存が増えた差分は要注意。
  2. 知らない名前空間・typo っぽい名前を入れない: testsecuiitytestme のような名前は公開待機期間(依存パッケージの「クールダウン」設定(minimumReleaseAge / min-release-age))や悪性ブロック付きレジストリで止める。
  3. リポジトリ内の「起動時に動く設定」を点検する: AI エージェントのフック(セッション開始時のコマンド)、.vscode/tasks.json の runOn: folderOpen などを、クローン直後・PR レビュー時に確認する。観点は AI 開発ツール・エディタ設定ファイル経由の永続化をチェックする と GhostAction 第 2 段階:VS Code の自動タスクと偽フォントで開発端末を狙う手口への備え を参照。
  4. GitHub の検索結果を「無い」の証拠にしない: 大きなファイルは検索で出ないことがある。疑わしいリポジトリは clone してファイル一覧(git ls-files、サイズ順)で確認する。

感染が疑われるときの順番

SafeDep の案内は ネットワーク切断 → 常駐処理の除去 → 認証情報の失効・再発行 の順。盗んだ GitHub トークンの失効を検知するとホームディレクトリを削除する処理があるため、JFrog も常駐処理を先に除去するよう求めている。トークン失効を先にやらない。

出典

X の元の投稿を開く