
2026/10/21 23:00
PyPI の LiteLLM バージョン 1.107.0 で、資格情報窃取プログラムとバックドアがインストールされる脆弱性情報
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
元々のサマリーは、可読性と一般的な精度の点で高品質ですが、キーポイントリストに提供されていたいくつかの具体的な技術的詳細が欠けています。以下に、それら不足している要素を取り入れつつ明確さを保ちながら改訂されたバージョンを示します。
サマリー:
PyPI リリース
litellm==1.07.0 で重大なセキュリティ侵害が発生したことが確認されました。このリリースは、資格情報窃取ツール(cook.py)とリモートコード実行(RCE)用のバックドア(sitecustomize.py)が仕込まれた状態で PyPI から削除されるまでの間、侵害されました。攻撃は 2026 年 10 月 21 日に展開されました:UTC 時間 06:59 にタグ作成が行われた後、UTC 時間 11:20–11:37 の間に BerriAI の内部パイプライン内で maturin 1.9.4 を使用して悪意のあるホイールが構築され、UTC 時間 11:39 にアップロードされました。特筆すべきは、このリリースを公開するパブリックな GitHub Actions ランが存在しなかったことと、SafeDep がプロヴェナンスの検証証明(provenance attestations)を検出できなかったことです。
感染範囲は深刻です:Linux、macOS、Windows の 7 つすべてのホイールが、
litellm ライブラリが一度もインポートされない場合でも、Python の起動時に自動的に悪意のあるファイルを実行します。この侵害は、pyproject.toml の特定のエンティリ maturin data = "cook" を通じて隠された cook/ フォルダを注入し、パブリックな GitHub コミットとプロヴェナンスチェックを回避しました。リリースタグ v1.107.0(コミット 66c8f5b)は、sdist ソースと一致しておらず、これはより後のコミットおよび攻撃者による改変に対応しています。
窃取ツール(
cook.py)は、機密データ(SSH キー、クラウドトークン、ブラウザのパスワード、Git シークレットを含む)を収集し、AES-256-CBC + RSA-OAEP で暗号化して、www.litellm[.]dev/healthcheck に流出させます。バックグラウンドで動作するデーモンは、時ごとの間隔で窃取ツールを再実行し、攻撃者による制御サーバーから任意のコードをダウンロードして実行します。しかし、攻撃者の制御サーバーは今やアクセス不可になっています(GitHub アカウントは UTC 時間 13:40 に削除済み)、現在のバックドアはコードを実行するためのサーバーアドレスを見つけることができていません。
幸運なことに、前バージョン(
1.106.2、1.107.0rc1、1.107.0rc2)とコンパニオンパッケージは侵害されていないことを確認しました。検出は、site-packages 内の cook.pth、cook.py、および sitecustomize.py、環境変数 PRIVCOLLECT_ACTIVE=1、あるいは独立したデーモンプロセスといったインジケーターをスキャンすることで可能です。組織は、継続的なデータ窃取を防ぐために、Python 3.10+ を動作させるすべてのシステムからこれら感染ファイルを能動的に検出して削除する必要があります。利用可能な SHA-256 ハッシュを使用して悪意のあるホイールファイルを特定します。本文
LiteLLM 1.107.0 リリースにおけるマルウェア混入事象
2026 年 10 月 21 日発行 • 約 6 分読み
PyPI で公開された
litellm パッケージ バージョン 1.107.0 は、**認証情報窃取(クレディビリティ・ハーベスト)および遠隔コード実行(RCE)**を可能にするバックドアを含むマルウェアが混入していました。
この攻撃により、Python プロセス全体(litellm をインポートしていないプロセスも含まれます)が起動する際に、即座にマルウェアの実行が誘発されます。
被害概要
- 被害ファイル: Linux、macOS、Windows 向けに用意された7 つのホイール(wheel)パッケージすべてに、認証情報窃取器とバックドアが含まれていました。システム上の
ディレクトリ内に 3 つのファイルとして展開されます。site-packages - 影響範囲: PyPI よりもファイルを削除していますが、既にこのバージョンをインストールしているすべてのシステムは現在も危険な状態にあり、継続的な脅威にさらされています。
- 安全なバージョン:以下のバージョンおよび対応するコンパニオンパッケージはマルウェアから無事に守られています。
litellm==1.106.2litellm==1.107.0rc1litellm==1.107.0rc2litellm-proxy-extras==0.4.110litellm-enterprise==0.1.78
攻撃の実行メカニズム (What the attack does)
litellm==1.107.0 をインストールすると、以下の 3 つのファイルが site-packages に配置され、Python インターpreter が起動するたびにそのうち 2 つが自動的に読み込まれます。
1. cook.pth(認証情報窃取器)
- 動作: このファイルは
をインポートします。cook.py - 機能: SSH キー、クラウド認証情報、CI/CD シークレット、AI ツールのトークン、ブラウザのパスワード、LLM プロバイダーキーなどの機密情報を収集し、LiteLLM Proxy のデータベースに保存(暗号化)した後、
へ送信します。www.litellm[.]dev- 影響: すべての Python プロセス(アプリケーション、
、IDE ランタイムサーバー、CI ジョブなど)が実行対象となります。pip
- 影響: すべての Python プロセス(アプリケーション、
2. sitecustomize.py(バックドア)
- 動作: バックグラウンドでデーモンプロセスを起動します。
- 機能: 1 時間ごとに攻撃者の GitHub リポジトリからサーバーアドレスを読み取り、再び窃取器を実行して、そこから遠隔コードをダウンロードして実行します(RCE)。
マルウェア混入の経緯 (How the implant got into the release)
ビルドプロセスにおける改ざん
バージョン 1.107.0 のソースディストリビューション(sdist)に含まれる
pyproject.toml ファイルに、正当なコミット履歴には含まれていない以下の行が追加されていました。
- 変更箇所:
(pyproject.toml
) のlitellm-1.107.0.tar.gz
セクションに[tool.maturin]
が追加されました。data = "cook" - 結果: マチュリン(Maturin)のビルドプロセスにより、本来は含まれていない**
フォルダ**がホイールパッケージ内にコピーされます。cook/
時にこれがpip install
に展開され、マルウェアとして動作を開始します。site-packages
タグとの不一致 (The release does not match its tag)
- タグ v1.107.0: このタグはコミット
を指していますが、66c8f5b
内で設定されているバージョン番号はpyproject.toml
とされていました。"1.108.0" - 実際のソースコード: SafeDep はすべての sdist ファイルと Git ツリーをブロッブ(blob)ハッシュで照合しました。結果として確認されたのは、より後のメインブランチのコミット
および 5 つの修正ファイル、そして攻撃用のフォルダa8113b0
を含んだものでした。cook/ - 変更内容の詳細:
- 4 つの変更点は
でCargo.toml
の行を追加するものであり、これは正当な 1.106.2 や rc2 リリースでも同様に含まれています。readme = "README.md" - 5 つ目の変更点は
です。バージョンをpyproject.toml
に修正し、コンパニオンパッケージの依存関係を rc2 バージョンに固定する変更を含んでいました。このため、rc2 に対する依存関係の差分が異常に見えないようになり、改ざんが見逃されました。1.107.0
- 4 つの変更点は
ホイールの構築と公開 (How the wheels were built)
攻撃ホイールの特徴
- ビルドパイプライン: 悪意のあるホイールは、通常の BerriAI のリリースパイプラインから出力されたものと同様です(
ファイルに maturin 1.9.4 が指定されている)。インプラントファイルの RECORD エントリーも正常であり、ビルド後の編集痕跡はありませんでした。WHEEL - タイムスタンプ: 圧縮ファイルのタイムスタンプは、macOS で UTC 11:20、Linux で 11:21、Windows で 11:37 と異なる時刻を示しており、各プラットフォームで独立して構築されたことを示唆しています。
- 改ざんの痕跡: Windows ホイール内のすべての
ファイル(インプラントファイルを含む)にCRLFの行終端記号が含まれていますが、Linux ホイールにはありません。これは Git チェックアウト後に行終端を Windows 形式に変換した結果であることを示します。.py
公開プロセスの異常
- GitHub Actions の実行記録: 公衆向けの GitHub Actions ログを確認したところ、このリリースをビルドまたは公開する動作は確認できませんでした(09:30 〜 12:30 UTC の間に行われたすべての実行をチェック済み)。
- 公開までの遅延: PyPI へのアップロードは約 11:39 UTC に行われましたが、GitHub リリースの公開(
)は 11:50 UTC(約 10 分後)でした。litellm-dispatcher[bot] - プロベナンス(追跡可能性)の欠如: PyPI に登録されている 1.107.0、1.106.2、rc2 のいずれにも、ビルダーの情報やソースコードのハッシュ値などを示すプロベナンスアテステーションが存在しません。
推定される原因
SafeDep は、BerriAI のプライベートリリースパイプラインが、攻撃者が改ざんした Git ソースコードからホイールを構築したと、中程度の確信度で評価しています。
- 可能性: 侵害されたメンテナまたはボットの認証情報、あるいは攻撃者が所有するプライベートブランチやミラー、ビルドの参照先などが悪用された可能性があります。
- 結論: 攻撃者のマシンから流出した PyPI トークンが原因である可能性は低いです。確定するためには、BerriAI の内部パイプラインログの確認が必要です。
ペイロード詳細
ペイロード 1: 認証情報窃取器 (cook.py
)
cook.pyPython が起動すると、
site-packages 内の .pth ファイルで始まる行が自動的に実行されます。cook.pth は import cook を含んでおり、あらゆる Python プロセスに対して窃取器を実行させます。
収集対象データ
コードは約 61 KB の Python スクリプトを、
exec(zlib.decompress(base64.b64decode('...'))) でラップしています。デコードされたコードが収集するのは以下の情報です:
- システム情報: ホスト名、ユーザー、OS、IP アドレス、ネットワーク設定 (
,sysinfo
)netinfo - ブラウザデータ: クロム保存パスワード(Windows DPAPI で復号化)、Firefox ログイン、ブラウザ履歴
- SSH キー:
内の全てのキー~/.ssh/* - シェル履歴: Bash/zsh の履歴、PowerShell PSReadLine、cmd 履歴
- クラウド認証: AWS credentials/config、Azure profile/tokens、gcloud、kubernetes config、docker config、gh hosts.yml、rclone.conf、.netrc、pem/pfx/keystore ファイル
- 開発者シークレット: Kubernetes SA トークン、GitLab Runner 設定、Jenkins master.key/.vault-token、Terraform/Packer/CircleCI 設定
- AI ツールトークン: Claude Code/Desktop/Cursor/Windsurf/Copilot/VS Code mcp.json/Gemini CLI/Codex/Continue/Aider/Goose/opencode/Qwen/Crush/Kiro/Zed/HF token など
- 環境変数: 自身および他のプロセスの環境変数
- データベース:
の読み取り、LLM プロバイダー API キーを保持するテーブルのダンプDATABASE_URL - メタデータ: AWS IMDSv2/v1(インスタンスアイデンティティ/ロール)、GPG キー、TLS 秘密鍵
データ送信方法
- 収集した JSON データはランダムに生成されたAES-256-CBC キーで暗号化されます。
- そのキーは埋め込まれたRSA-OAEP パブリックキーで再暗号化されます。
- 結果は
(tar.gz
,hdr.json
,data.bin
) に圧縮され、ヘッダーkey.bin
を追加して、X-Token: XWiA8gZNa7NcX2XRoAEb
へ POST リクエストで送信されます。www.litellm[.]dev/healthcheck - 成功後は
というファイルを書き出して、そのホストでは1 回ずつのみ収集を行うように制御します(環境変数/tmp/.pc_once_...
も設定)。PRIVCOLLECT_ACTIVE=1
ペイロード 2: バックドア (sitecustomize.py
)
sitecustomize.pyPython が起動すると
sitecustomize モジュールがインポートされるため、このファイルもすべての Python プロセスで実行されます。
- ロック処理:
ファイルに対して排他ロックを取得し、ホストごとに 1 つだけのデーモンを実行します。/tmp/remote_code_loader.lock - プロセス分離:
とfork()
を呼び出し、標準入出力をsetid()
に送って作業ディレクトリを/dev/null
に変更することで、親プロセスから独立して動作(ダッチ)します。/
毎時の動作 (バックドアループ)
- 攻撃者の GitHub リポジトリ (
) からドメイン名を読み取ります。domain.txt - 読み取ったアドレスから窃取器のコピー(ホスト単一制御マーカーなし)を実行します。
をダウンロードして実行 (http://<domain>/codepy
) し、遠隔コードをインストール・実行します。exec()
攻撃者は
domain.txt ファイルを編集することで、新しいサーバーへの接続先を変更できます。インフェクトされたホストは、そのサーバーが返すすべてのコードを実行します。
- 現在の状況: GitHub アカウント
のリポジトリ(letters9813
)はリリースから約 2 時間後(13:40 UTC)に 404 エラーを返し、アカウントも削除されました。バックドアは現在サーバーアドレスを特定できず不活化していますが、以前実行されたホストでは二次的なコードが実行された可能性があります。pythonclient-test
タイムライン (Timeline)
すべては 2026 年 10 月 21 日 UTC です。
| 時刻 | イベント |
|---|---|
| 06:59 | タグ v1.107.0 のコミット が作成 |
| 08:50 | メインブランチへのコミット (リリースソースのベース) |
| 10:44 | 正当なバージョン 1.106.2 が PyPI にアップロード |
| 11:20 ~ 11:37 | マルウェア混入ホイール 1.107.0 の構築 (macOS, Linux, Windows) |
| 11:39 ~ 11:40 | ホイール 1.107.0 の全ファイルが PyPI にアップロード |
| 11:50 | による GitHub リリース v1.107.0 の公開 |
| 13:40 | 観測: PyPI から 1.107.0 が消滅、アカウント が削除された事実確認 |
侵害指示子 (Indicators of compromise)
ネットワーク関連
- www.litellm[.]dev: 盗まれたデータを格納するサーバー。
- URL:
http://www.litellm[.]dev/healthcheck - ヘッダー:
X-Token: XWiA8gZNa7NcX2XRoAEb
- URL:
- raw.githubusercontent[.]com/letters9813/pythonclient-test/main/domain.txt: バックドアがサーバーアドレスを読み取る場所(アカウント削除済み)。
- hxxp:///codepy: 第二段階の悪意あるコードのダウンロード先。
- 169.254.169.254: Python プロセスからの AWS インスタンス認証情報の窃取対象(メタデータサービス)。
ホスト関連
- cook.pth, cook.py, sitecustomize.py (
): インプラント(マルウェア)ファイル。site-packages - /tmp/.pc_once_72129118c59f5636c0bb: データをアップロード済みであることを示すフラグファイル。
- /tmp/remote_code_loader.lock: バックドアデーモンが実行された証拠。
- PRIVCOLLECT_ACTIVE=1: インフェクトされたプロセスの環境変数。
- 親 PID 1、独自のセッション、作業ディレクトリ / の Python デーモン: バックドアループの動作パターンを示す特徴。
ファイルハッシュ (SHA-256)
マチュリンで構築された攻撃ホイールのハッシュ値です(Windows ホイールは CRLF ラインエンドのため異なるハッシュ値を持ちます)。
| ファイル名 | システム | SHA-256 ハッシュ |
|---|---|---|
| (全プラットフォーム) | |
| Linux (x86_64) | |
| Linux (aarch64) | |
| Linux (musl) | |
| Linux (musl aarch64) | |
| macOS (x86_64) | |
| macOS (arm64) | |
| Windows (x86_64) | |
インプラントファイルのハッシュ値 (Linux/macOS vs Windows) 注:Windows 版では CRLF ラインエンドによりハッシュ値が異なります。
| ファイル | Linux / macOS ハッシュ | Windows ハッシュ |
|---|---|---|
| | |
| | |
| | |
本レポートは SafeDep による調査結果に基づいています。