RubyGems の extconf.rb からも同系統ワーム:トークン失効の前に常駐を止める
Shai-Hulud/testmetest 系のワームが Ruby では ext/*/extconf.rb から Bun を落として動く。感染疑いでは GitHub トークンを失効する前に net-health-checker/pkg-runtime を止める。失効を先にするとホーム削除のワイパーが走る。
いつ使うか
gem install/bundle installで見知らぬ gem や急な patch 版を入れたあと- Gemfile.lock・CI キャッシュ・イメージに
strutil-coreなど不審 gem がないか洗うとき - npm 版ワーム(--ignore-scripts だけでは止まらない npm ワームに備える(testmetest:ネイティブアドオンと AI ツール起動時の仕込み))と同じ IOCs を Ruby 側でも見るとき
何が分かっているか(strutil-core 1.0.1 の例)
- きれいな 1.0.0 の直後に、同じアカウントが悪性の 1.0.1 を出し、
extconf.rbがインストール時に Bun を取得して同梱index.jsを実行する(require不要)。 - 認証情報窃取、RubyGems/npm/PyPI への再公開、AI ツールの MCP/SessionStart/
AGENTS.md等への仕込み、署名付き GitHub コミットで指示する Python バックドア(pkg-runtime)がある。 - 盗んだ GitHub トークン向けに
net-health-checkerが常駐し、トークンが 401/403 になるとrm -rf ~/系を実行する(npm 版と同じ順序の罠)。 - C2 例:
paleasbest[.]top。関連 PyPI:pystr-codec。公開窓は約 5 時間で RubyGems から削除済みだが、感染後は gem 削除では消えない。
対応
- 疑わしいホストは隔離し、次を先に止める・消す:
net-health-checker(systemd user/LaunchAgent)、pkg-runtime、~/.config/net-health-checker/token、~/.config/index.js、~/.local/share/runtimes/sync.py。 - そのあとで GitHub/GitLab/クラウド/RubyGems/npm/SSH/AI プロバイダ等の認証情報を、きれいな端末からローテーションする。
Gemfile.lock・CI・コンテナにstrutil-coreがいないか検索。メンテ中 gem に身に覚えのないextensions:/ext/*/extconf.rbが増えていないか見る。- リポジトリとホームから、見知らぬ
workspace-toolsMCP、SessionStart フック、.github/init.js、勝手なAGENTS.md/CLAUDE.md/.vscode/tasks.jsonを除去(AI 開発ツール・エディタ設定ファイル経由の永続化をチェックする)。 - 狩りの手がかり:
/tmp/.b_*から Ruby 経由のbun run、CI 上のsudo python3による/proc/*/mem読み、project-utils説明の新規公開リポ、chore/ci-*ブランチ、AutoSyncComplete/msync-3f7a、偽 CodeQL+scan-output成果物。extconf.rbSHA-256c5264f3b9cf2f95c83a70b7dd7430aab8abc262b853dbbcd5386c3a8a9c74769は当該インジェクタ出力の目安。
追記(2026-11-10):strutil-core(testmetest の RubyGems 版)
- 文字列処理ライブラリーを装う
strutil-core1.0.1 が、extconf.rbで Bun 1.2.18 を取得してワーム本体を実行し、何もしない Makefile を書いてインストールを正常終了させていた。requireしなくてもgem installだけで動く。 - Bun のダウンロード URL を分割しており、URL 全体の静的シグネチャーでは検知できない。送信先は
paleasbest[.]top(同じ送信先の PyPI パッケージpystr-codecもある)。 - 対応は同じ:導入端末の隔離、GitHub トークン失効の前に常駐サービス
net-health-checkerとpkg-runtimeを止めて消す、Gemfile.lockと CI キャッシュの確認、保守している gem に覚えのないextconf.rbが足されていないかの点検。 - 出典: @MalwareBibleJP · 2026-11-09
注意
--ignore-scripts相当が無い/弱い Ruby 環境では、ネイティブ拡張のextconf.rbがそのまま install-time 実行になる。新規・急な patch・「文字列ヘルパーなのに巨大な ext」はレビュー対象。- 攻撃の再現手順や PoC は書かない。防御は検知・常駐除去・鍵のローテ・依存の棚卸し。