--ignore-scripts だけでは止まらない npm ワームに備える(testmetest:ネイティブアドオンと AI ツール起動時の仕込み)
testmetest 系のワームには、インストール時ではなく「アプリが読み込んだ瞬間」にネイティブアドオンから起動する版と、Claude・Gemini のセッション開始や VS Code でフォルダーを開く操作で動く仕込みをリポジトリに置く版がある。install script の停止に加え、読み込み時・エディター起動時の実行も点検対象にする。
何が起きたか
- JFrog は、11 の個人・組織が持つ GitHub リポジトリ 42 件で、Claude・Gemini のセッション開始時や VS Code でフォルダーを開いたときに不正コードを動かす設定を確認(42 件は配置の確認数で、実行成功数ではない)。
- 約 13MB の不正ファイルは、GitHub のコード検索や通常のコンテンツ取得 API では見落とされ、ファイル構成を直接列挙して取得できた。10 種類の難読化ファイルが同じコードへ復号された。
- 復号コードは、GitHub Actions 上から npm トークンや Trusted Publishing を使って不正公開を試みる系統。
- SafeDep が調べた
@testsecuiitytestme/cache-helper1.0.3 は、Node.js のネイティブアドオンが隠しファイル.napi_cacheを復号して起動する。--ignore-scriptsでは防げない。
対策
- install script の停止は前提のまま、それ以外も見る: 依存パッケージの install script を既定で止める(pnpm allowBuilds ほか) は引き続き有効だが、
require時に.nodeバイナリーを読むパッケージは別枠で審査する。新しく.nodeファイルやbinding.gyp、node-gyp-build系の依存が増えた差分は要注意。 - 知らない名前空間・typo っぽい名前を入れない:
testsecuiitytestmeのような名前は公開待機期間(依存パッケージの「クールダウン」設定(minimumReleaseAge / min-release-age))や悪性ブロック付きレジストリで止める。 - リポジトリ内の「起動時に動く設定」を点検する: AI エージェントのフック(セッション開始時のコマンド)、
.vscode/tasks.jsonのrunOn: folderOpenなどを、クローン直後・PR レビュー時に確認する。観点は AI 開発ツール・エディタ設定ファイル経由の永続化をチェックする と GhostAction 第 2 段階:VS Code の自動タスクと偽フォントで開発端末を狙う手口への備え を参照。 - GitHub の検索結果を「無い」の証拠にしない: 大きなファイルは検索で出ないことがある。疑わしいリポジトリは clone してファイル一覧(
git ls-files、サイズ順)で確認する。
感染が疑われるときの順番
SafeDep の案内は ネットワーク切断 → 常駐処理の除去 → 認証情報の失効・再発行 の順。盗んだ GitHub トークンの失効を検知するとホームディレクトリを削除する処理があるため、JFrog も常駐処理を先に除去するよう求めている。トークン失効を先にやらない。