
2026/05/01 1:09
PyTorch Lightning の AI トレーニングライブラリに、神話上の風化獣「シャイ・フールード」をテーマにしたマルウェアが検出された
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
人気の PyPI パッケージ「lightning」の脆弱なバージョン 2(2.6.2 および 2.6.3)が、2026 年 4 月 30 日に公開されたことが、"Shai-Hulud"というテーマのオブフスクエードされた JavaScript 負荷を含むサプライチェーン攻撃で利用されました。マルウェアはモジュールをインポートするだけで自動的に実行され、認証情報、認証トークン、環境変数、クラウドシークレット(AWS、Azure Key Vault、GCP Secret Manager)、およびローカルファイルシステムの認証情報ファイルを盗みます。また、「EveryBoiWeBuildIsaWormBoi」という特定の命名規則と、"EveryBoiWeBuildIsAWormyBoi"で始まるコミットメッセージを用いて、公開の GitHub リポジトリを毒付けようとし、さらに C2 サーバーへの HTTPS POST、二重 base64 符号化されたトークンを伴う GitHub コミット検索デッドドロップ、攻撃者による公開リポジトリの利用、および
ghs_ トークンを用いて被害者のリポジトリに直接プッシュする、4 つの並列データ流出チャネルを利用しています。
この攻撃は、悪用された npm 認証情報を使用して公開されるあらゆるパッケージに対して、14.8 MB の
setup.mjs ドロッパー(Bun ランタイム v1.3.13 をブートストアップする)と router_runtime.js ファイルを注入することで、PyPI から npm へと感染を広げます。永続性を確保するために、マルウェアは人気のある開発ツール設定ファイルにフックを注入します:Claude Code の .claude/settings.json への "SessionStart"フックと、VS Code の .vscode/tasks.json への runOn: folderOpen タスクです。攻撃者が書込みアクセス権を持っている場合、「Formatter」という名前の悪意のある GitHub Actions ワークフローがプッシュされ、「format-results」というダウンロード可能なアーティファクトとしてシークレットがダンプされます。さらに、_runtime/ディレクトリや start.pyのようなファイルに隠れたフックも注入されます。
セキュリティ企業 Semgrep は、特定の検出規則を含む緊急のアドバースを発表しており、詳細は https://semgrep.dev/orgs/-/advisories で入手できます。影響を受けたユーザーは、直ちにすべての盗まれた認証情報(GitHub トークン、クラウドキー、API キー)の再発行を行い、
.claude/、.vscode/、_runtime/ディレクトリなどに注入された悪意のあるスクリプトを含むプロジェクトを監査し、将来のサプライチェーン侵害を防ぐために厳格な依存関係フィルタを実装する必要があります。本文
Lightning PyPI パッケージ「lightning」は、広く利用されているディープラーニングフレームワークですが、2026 年 4 月 30 日に公開されたバージョン 2.6.2 および 2.6.3 がサプライチェーン攻撃の影響を受けました。画像分類器の構築、LLM のファインチューニング、拡散モデルの実行、時系列予測モデルの開発を行うチームにとって、「lightning」は依存ツリーに必ず存在するはずです。「pip install lightning」という一行の実行だけで、悪意あるコードが活性化します。
攻撃バージョンには、モジュールのインポート時に自動的に実行される暗号化された JavaScript パイロードを含む隠蔽された「_runtime」ディレクトリが含まれています。この攻撃では、認証クレデンシャル、トークン、環境変数、クラウド上の機密情報を窃取すると同時に、GitHub リポジトリへの感染(ポイズニング)を試みています。また、「シャイ・フリュッド」というテーマに基づき、
EveryBoiWeBuildIsaWormBoi という名の公開リポジトリを作成するなど、その特徴も確認されています。当機構は、この攻撃を「Mini Shai-Hulud」キャンペーン背後にいた同じ Threat Actor の所为であると考えます。IOC(感染指標)の構造もその作戦と一致しており、悪意のあるコミットメッセージが「ダンジョン」という作品を意識した命名規則に従っており、今回使用する前辞頭 EveryBoiWeBuildIsAWormyBoi は、元の Mini Shai-Hulud 攻撃との区別のために設けられたものです。
影響を受けるパッケージ
- lightning バージョン 2.6.2
- lightning バージョン 2.6.3
Semgrep ユーザー向け
Semgrep は、この脆弱性をカバーするアドバイザリーとルールを提供していますので、以下の手順でプロジェクトを確認してください:
-
リストを最近スキャンしていない場合は、新しいスキャンを起動してください。
-
advisories ページを確認し、最近これらのパッケージバージョンをインストールしたプロジェクトがあるか確認してください。
-
依存関係フィルタで一致するか確認してください。
- 「No matching dependencies」(一致する依存関係なし)が表示された場合:貴社が保有するどのプロジェクトも、現在悪意ある依存関係をアクティブに使用していないことを意味します。
- もし「Match」が出た場合は:
- 以下の補足情報により、是正措置と感染指標に関する追加のアドバイスが続きます。
- さらに、下記 IOCs に記載された注入ファイル(
および.claude/
ディレクトリ内の予期せぬコンテンツ)を含むリポジトリを確認してください。.vscode/ - 影響を受けた環境で保管されていた可能性のあるすべての GitHub トークン、クラウドクレデンシャル、API キーを回転化(再発行)してください。
サプライチェーン攻撃への対処に関する一般的なアドバイス(「クールダウン期間」の対策など)については、「"$foo compromised in $package"」および「manager. Attackers are Still Coming for Security Companies」という投稿で当社の標準的なガイドラインが記されています。
複数エコシステムへの拡大:PyPI から npm へ
Mini Shai-Hulud が直接 npm を標的とにしたのに対し、今回の攻撃ではエントリポイントとなったのは PyPI です。マルウェアのパイロード自体は引き続き JavaScript で構成されており、蠕虫の伝播経路は npm を通じて行われています。
- 実行後、マルウェアが npm publish クレデンシャルを発見すると、トークンで公開可能なすべてのパッケージに
ドロッパーとsetup.mjs
を注入します。router_runtime.js - これにより、スクリプト
がドロッパーの実行を実装し、マイナーバージョン番号を上げ、再度パブリッシュされます。scripts.preinstall - したがって、これらのパッケージのいずれかをインストールした下流の開発者にとって、彼らのマシン上での完全なマルウェア実行、トークンの窃取、およびパッケージの蠕虫化(感染)が発生します。
動作原理
抽出コンポーネントは、前回のキャンペーンで導入された「Mini Shai-Hulud」メカニズムをデザイン面で共有しており、個々のパスがブロックされても盗まれたデータを外部に出すために 4 つの並列チャネルを使用しています。
- C2 への HTTPS POST: 盗まれたデータは、即時にポート 443 を介して攻撃者制御サーバーへ POST されます。ドメインとパスは、静的分析を困難にするため、パイロード内で暗号化文字列として格納されています。
- GitHub コミット検索によるデッドドロップ: マルウェアは、
で始まるコミットメッセージを持つ GitHub のコミット検索 API をポーリングします。これらは二重に base64 符号化されたトークンをEveryBoiWeBuildIsAWormyBoi
の形式で運搬しています。一度復号化されると、このトークンは Octokit クライアントの認証に使用され、さらなる操作が可能になります。EveryBoiWeBuildIsAWormyBoi:<base64(base64(token))> - 攻撃者制御の公開 GitHub リポジトリ: 新しい公開リポジトリが作成され、ランダムに選定された「ダンジョン」関連の名前と、「A Mini Shai-Hulud has Appeared」という説明文が設定されます(GitHub で直接検索可能です)。盗まれたクレデンシャルは
としてコミットされます(API を介した base64 符号化済みで、中身はプレーン JSON)、ファイルサイズが 30 MB 以上の場合は番号付きチャンクに分割されます。コミットメッセージには、「chore: update dependencies」というカバー用の文言が使われます。results/results-<timestamp>-<n>.json - 被害者のリポジトリへのプッシュ: もしマルウェアが GitHub Server Token (
) を入手した場合、盗まれたデータは直接、被害者自身のghs_
のすべてのブランチにプッシュされます。GITHUB_REPOSITORY
何が窃取されるのか
マルウェアは、ローカルファイル、環境変数、CI/CD パイプライン、クラウドプロバイダにまたがるクレデンシャルを標的とします:
- ファイルシステム:
,ghp_
, およびgho_
トークン(各ファイル最大 5 MB)を検出できる 80 個以上のクレデンシャルファイルパスをスキャンします。npm_ - シェル/環境:
を実行し、gh auth token
からすべての環境変数をダンプします。process.env - GitHub Actions: Linux ランナー上では、埋め込まれた Python を使用して
プロセスのメモリをダンプし、「isSecret':true」とマークされたすべてのシークレット、およびRunner.Worker
,GITHUB_REPOSITORY
を抽出します。GITHUB_WORKFLOW - GitHub オーガ: トークンのスコープ(repo, workflow)をチェックし、GitHub Actions のオーガシークレットを反復処理して確認します。
- AWS: 環境変数、
プロフィール、IMDSv2 (169.254.169.254)、ECS (169.254.170.2) を試行して~/.aws/credentials
を呼び出し、さらにすべての Secrets Manager 値と SSM パラメータを列挙して取得します。sts:GetCallerIdentity - Azure: DefaultAzureCredential を使用してサブスクリプションを列挙し、Key Vault のシークレットにアクセスします。
- GCP: GoogleAuth を介して認証し、すべての Secret Manager シークレットを列挙して取得します。
ターゲットには、ローカル開発環境、CI ランナー、および三大クラウドプロバイダのすべてが含まれています。影響を受けた期間中に悪意あるパッケージを取り込んだあらゆるマシンは、完全に侵害されたものとみなす必要があります。
開発者ツールによる永続化
リポジトリに入っただけでなく、マルウェアは二大一般的な開発者ツールのうち 2 つに対する永続性フックを植え付けます。これは、実世界の攻撃において Claude Code のフックシステムを悪用したドキュメント化された最初の実例の可能性があります。
- Claude Code:
.claude/settings.json- マルウェアは、リポジトリの Claude Code セットアップに
を持つmatcher: "*"
フックを書き込み、それをSessionStart
へ指し示します。node .vscode/setup.mjs - 感染されたリポジトリで開発者が Claude Code を起動するたびに発火します。ツールを使用したりユーザーが追加のアクションをとったりする必要はありません。
- マルウェアは、リポジトリの Claude Code セットアップに
- VS Code:
.vscode/tasks.json- 別のフックが、プロジェクトフォルダを開くたびに
を実行するnode .claude/setup.mjs
タスクを通じて、VS Code ユーザーを対象とします。runOn: folderOpen
- 別のフックが、プロジェクトフォルダを開くたびに
ドロッパー:setup.mjs 両方のフックは、自律的な Bun ランタイムブートストッパーである
setup.mjs を呼び出します。Bun がインストールされていない場合、それは静かに GitHub リリースから bun-v1.3.13 をダウンロードします(Linux x64/arm64/musl、macOS x64/arm64、Windows x64/arm64に対応)。その後、.claude/router_runtime.js(完全な 14.8 MB のパイロード)を実行し、/tmp からクリーンアップします。
ボーナス・パイロード:悪意ある GitHub Actions ワークフロー マルウェアが書き込みアクセスを持つ GitHub トークンを保有している場合、被害者のリポジトリに
Formatter という名前のワークフローをプッシュします。すべてのプッシュ時に、${{ toJSON(secrets) }} を使用してすべてのリポジトリシークレットをダンプし、ダウンロード可能な Actions アーティファクト「format-results」としてアップロードします。アクションは特定のコミット SHA にピン留めされており、見かけ上正当性を与えています。
- CI 中に感染した lightning パッケージを受け取った、かつ書き込みアクセスを持つトークンを保持していたすべてのリポジトリで、これらのファイルを監査してください。
感染指標 (IOCs)
以下の指標を探してください:
で始まるコミットメッセージ(デッドドロップトークン運搬手段、GitHub コミット検索で検索可能)。EveryBoiWeBuildIsAWormyBoi- 説明文が「A Mini Shai-Hulud has Appeared」の GitHub リポジトリ(攻撃者によるデータ抽出用リポジトリ、直接検索可能)。
影響を受けるパッケージ:
lightning@2.6.2lightning@2.6.3
ファイル/システムアーティファクト:
: インポート時に変数初期化を行い、パイルードを実行する Python ロoader。_runtime/start.py
: 14.8 MB の暗号化された JavaScript パイロード(Bun ランタイム)。_runtime/router.js
: 悪意あるパッケージバージョンに追加されたディレクトリ。_runtime/
: 被害者リポジトリに注入されたマルウェアコピー。.claude/router_runtime.js
: 被害者リポジトリに注入された Claude Code フック設定。.claude/settings.json
: 被害者リポジトリに注入されたドロッパー。.claude/setup.mjs
: 被害者リポジトリに注入された VS Code 自動実行タスク。.vscode/tasks.json
: 被害者リポジトリに注入されたドロッパー。.vscode/setup.mjs