Shai-Huludの流れをくむワームが悪意あるRuby Gemに潜伏、開発者の機密情報を窃取しAIコーディングツールも汚染

RubyGemsの悪意あるパッケージ「strutil-core」に、5.48 MBの認証情報窃取ワームが仕込まれていたことがわかりました。開発者がインストールした時点で、ワームが実行されます。

このワームは「testmetest」の新たなビルドです。公開されたShai-Huludツールキットから派生した「Miasma」ファミリーに属します。

アカウント「jamnajiea」は2026年11月1日に正常な1.0.0を公開しました。その2時間足らずあとに、悪意ある1.0.1を投稿しています。

Socketは、このGemに依存する公開パッケージを確認できておらず、被害者も確認していません。そのため、実際の影響範囲は不明です。

このGemは文字列処理のヘルパーを装っています。しかし、ネイティブ拡張のスクリプトであるextconf.rbには、ビルド処理が一切ありません。

LinuxとmacOSでは、JavaScriptランタイムのBunをダウンロードし、同梱のindex.jsをインストール中に実行します。その後、空のMakefileを書き出すため、インストールはエラーなく完了します。

アプリケーションがこのGemを読み込む必要はありません。gem installやbundle installを実行するだけで感染します。

このインストーラーは、ワームが備えるRubyGemsへの自己注入モジュールの出力と同一です。このモジュールの挙動は、1.0.1として公開されたGemの内部で、ライブラリが1.0.0のままになっている理由も説明します。注入処理がgemspecのバージョンだけを書き換え、Rubyのソースには手を加えないためです。

Socketは、このモジュールが2026年6月のMiasmaペイロード(難読化解除済み)に由来すると突き止めました。空でないインストーラーの36行のうち、33行が完全に一致しています。

Socketの研究者によると、AIスキャナーは公開から70秒後にこのGemを検知しました。RubyGemsは、悪意あるバージョンの公開から約5時間後に、両バージョンを削除しています。

発見されたRuby Gem

ペイロードは、クラウド、CI、レジストリ、SSH、ウォレット、AIコーディングツールの認証情報を狙います。Bitbisonのサンドボックスでは、.claude/.credentials.jsonや.codex/auth.jsonなど、51か所の認証情報ストアへの読み取りが記録されました。

GitHub Actions内では、ランナーのプロセスメモリを抜き取ります。これは、2025年3月のtj-actions/changed-filesの侵害で使われたのと同じ手法です。StepSecurityによると、Harden-Runnerの無効化も試みますが、成功しないということです。

盗まれたデータは暗号化され、paleasbest[.]topに送信されます。GitHubとGitLabはフォールバック先です。コードにはさらに、RubyGems、npm、PyPIへの再公開ルーチンが含まれています。JFrog Artifactory、GitHub、GitLab、SSH経由での拡散機能も備えています。

Socketは、これらのルーチンが存在することは確認しました。ただし、下流で再公開が成功した例は確認していません。

ワームは、ローカルのAIツール設定にworkspace-toolsというMCPサーバーとSessionStartフックを書き込みます。

盗んだGit認証情報を使い、CLAUDE.md、AGENTS.md、.cursor/mcp.json、.vscode/tasks.jsonのタスクといったファイルをリポジトリにコミットします。

生成されるAGENTS.mdは、コーディングエージェントに最初にセットアップスクリプトを実行するよう指示します。そのため、感染したリポジトリを開くと、ワークスペースの信頼設定や承認設定によっては、ワームが再び実行される可能性があります。

Pythonのバックドアであるsync.pyは、公開GitHubコミットを1時間ごとに確認し、マーカー「msync-3f7a」を探します。実行するのは、攻撃者による有効なRSA-PSS署名がURLに付いたスクリプトだけです。

盗んだGitHubトークンが有効だと確認されると、「net-health-checker」という監視プロセスが45秒ごとにそのトークンを検査します。401または403の応答を受け取ると、ホームディレクトリを削除します。このため、先にトークンを失効させると、データが破壊されるおそれがあります。

strutil-coreは、sync.py、コマンドマーカー、ワイパーのロジック、リポジトリの命名パターンをtestmetestと共有しています。testmetestについては、SafeDepが10月に報告しました。

一方で、新たなC2ドメイン、RubyGems経由の配布経路、異なる暗号化方式を使っている点が異なります。Shai-Hulud のソースコードは2026年5月から公開されています。そのため、コードが共通しているからといって、同一の攻撃者によるものとは断定できません。

同じドメインは、PyPIパッケージのpystr-codec(バージョン0.1.0〜0.1.2)にも登場しています。Kamil Mańkowski氏はこれをMAL-2026-18432として記録し、Miasmaファミリーのワームの一部だと説明しています。

1.0.1をインストールした場合は、まずホストを隔離してください。そのうえで、トークンを失効させる前に、net-health-checkerとpkg-runtimeの永続化機構を取り除く必要があります。

続いて、クリーンな端末から認証情報をローテーションし、マシンを再構築してください。ペイロードはGemのディレクトリの外にも居座るため、Gemをアンインストールしても感染は解消されません。

侵害指標(IoC)

カテゴリ 指標の種類 指標
悪意あるパッケージ Ruby gem strutil-core
ネットワーク指標 ドメイン paleasbest[.]top
ネットワーク指標 URL hxxps://paleasbest[.]top/v1/api

注: IPアドレスやドメインは、誤って名前解決されたりハイパーリンク化されたりするのを防ぐため、意図的に無害化(デファング)しています(例:[.])。元に戻す場合は、MISP、VirusTotal、自社のSIEMなど、管理されたスレットインテリジェンス基盤の中だけで行ってください。

MTTRを21分短縮し、被害が出る前にサイバー脅威を阻止します。ANYRUNのサンドボックスをSOCに統合。

Audit Security

翻訳元: https://gbhackers.com/ruby-gem-discovered/

本記事は gbhackers.com の記事を翻訳・要約したものです。