フォーク爆弾が私たちを救った
LiteLLM 1.82.8に含まれていたマルウェアは、あらゆるPython起動時に実行される.pthファイルでした。SSHキー、クラウド認証情報、暗号通貨ウォレット、CI/CDシークレットを収集し、4096ビットのRSAキーで暗号化した上で、攻撃者が管理するドメインへアーカイブを送信していました。ペイロードの設計は巧みで、暗号化は堅牢、データ送信は痕跡を残しませんでした。1 この事例は、自動化システムにおける信頼構築を形作る実際の障害事例を扱うエージェントセキュリティシリーズの一部です。
この.pthファイルは、処理を実行するために子Pythonプロセスも生成していました。その子プロセスが.pthファイルを再度トリガーし、さらに別の子プロセスを生成。それがまたトリガーを引き起こす——指数関数的なフォーク爆弾が発生し、数秒でCPU使用率100%、RAM 5GB以上を消費しました。2
フォーク爆弾はバグでした。攻撃者はマルウェアが目に見える形で動作することを意図していませんでした。正しく実装されていれば、感染したすべてのシステムでPythonが呼び出されるたびに静かに実行され、数週間にわたって検知を逃れていた可能性があります。しかし実際には、開発者たちがマシンの異常な動作停止に気づき、調査した結果、認証情報窃取ツールが発見されました。PyPIは公開から46分後に両バージョンを隔離しました。1
46分間で46,000件のインストール。検知のきっかけは、マルウェアの実装エラーでした。
TL;DR
- バグ: LiteLLM 1.82.8の認証情報窃取ツールにはフォーク爆弾のバグがあり、感染マシンが動作停止に陥りました。このバグがなければ、窃取ツールは数週間にわたり静かに動作し続けていたでしょう。
- 検知の空白: 静的解析、振る舞い監視、コードレビューのすべてが攻撃を見逃しました。各検知レイヤーが他のレイヤーが問題を捕捉すると想定し、結果として誰も捕捉できませんでした。3
- 攻撃者の進化曲線: 攻撃者の技術は反復により向上します。
.pthテクニックは現在公開文書として記録されています。次の攻撃者はバグなしでこの手法を継承するでしょう。 - 運に頼らない対策: 送信先ドメインの登録日チェック、パッケージインストール時の振る舞いベースライン、ファイルシステムカナリア、インストール環境の分離。いずれもペイロードの品質に関係なく機能します。
- 非対称性: 防御側が環境を選択できます。インストール環境に窃取すべき認証情報がなければ、完璧なペイロードでも何も得られません。
私たちは運が良かっただけだ
フォーク爆弾をペイロードから取り除けば、攻撃は静かに成功していました。.pthファイルはあらゆるインポートの前、アプリケーションコードの前、Pythonレベルのサンドボックスの前に実行されます。フックポイントは存在せず、ログエントリも残りません。認証情報窃取ツールが実行され、暗号化し、データを送信し、Pythonプロセスは通常通り続行します。開発者は何も気づかず、CIパイプラインも何も検知せず、セキュリティスキャナーも何も見つけません——なぜなら、そのセキュリティスキャナーこそが攻撃ベクターだったからです。3
LiteLLM 1.82.8の検知ストーリーは「監視体制が捕捉した」ではありません。「攻撃者がバグを出荷した」というのが実態です。
これはサプライチェーンセキュリティの基盤としては心もとないものです。エージェントサンドボックスは提案にすぎないで論じたように、信頼されたコードと信頼されていないコードの間に存在すると想定される境界は、多くのチームが認識しているよりもはるかに浸透性が高いのです。
攻撃者の品質曲線
ソフトウェアの品質は反復によって向上します。これは攻撃者にも防御者にも等しく当てはまります。TeamPCPのキャンペーンは1週間で5つのエコシステムを攻撃しました:GitHub Actions、Docker Hub、npm、Open VSX、PyPI。4 各エコシステムの侵害には、前の侵害で窃取した認証情報が使用されていました。このキャンペーンは高度な作戦能力を示していました:ペイロード配信の24時間前にドメインを登録し、可変参照に対するタグハイジャックを行い、Aqua Securityの不完全なキー変更を利用した認証情報ローテーション回避を実行しています。
フォーク爆弾は、全体として巧妙な作戦における唯一のミスでした。次のキャンペーンではこのミスは繰り返されないでしょう。.pthファイルの手法はすでにCrowdStrike、Microsoft、Wiz、Palo Altoによって公開・分析されています。3 次の攻撃者はバグなしでこの手法を継承します。
攻撃能力は防御能力と同じ改善曲線をたどります。手法は公開され、分析も公開されています。次の攻撃者はTeamPCPが到達した地点からスタートするのです。この曲線が自律システムにとって何を意味するかについては、無監視で実際に壊れるもので詳しく考察しています。
検知を攻撃者のミスに依存してはならない
現在のサプライチェーン検知モデルは3つのレイヤーで構成されていますが、LiteLLMではそのすべてが失敗しました:
静的解析は見逃しました。.pthファイルは正規のPython機能です。ペイロードは二重にbase64エンコードされ、実行時にデコードされていました。既知の悪意あるパターンを探す静的スキャナーでは、パターンが新しいため何も検出できません。
振る舞い監視は見逃しました。認証情報窃取ツールは、正規のサービスに見えるドメイン(models.litellm.cloud)への単一のHTTPS POSTリクエストを送信しただけでした。送信先ドメインを検査する送信監視には、この特定のドメインが24時間前に登録されたものだという情報が必要ですが、ほとんどの送信監視はドメインの登録日をチェックしていません。
コードレビューは見逃しました。悪意あるバージョンはGitHubのCI/CDパイプラインを完全にバイパスし、PyPIに直接公開されていました。レビューすべきプルリクエストも、検査すべき差分もありませんでした。攻撃者は窃取した公開用認証情報を使用して、ビルド済みパッケージをアップロードしたのです。
すべての検知レイヤーが、攻撃チェーンの別の部分が問題を捕捉すると想定していました。どれも捕捉できませんでした。フォーク爆弾が問題を捕捉したのです。
サイレントマルウェアを実際に検知する方法
攻撃者のミスに頼れないのであれば、実装の品質に関係なく機能する検知メカニズムが必要です。
送信リクエストに対するドメイン登録日チェック。 データ送信先ドメインは攻撃の24時間前に登録されていました。登録から7日未満のドメインへの送信リクエストをフラグ付けするファイアウォールルールがあれば、捕捉できたでしょう。ルールはシンプルで、誤検知率は管理可能な範囲であり、最も一般的なデータ送信パターンを捕捉できます。
Pythonプロセスの振る舞いベースライン。 pip installが突然、未知のドメインへHTTPS POSTリクエストを送信するのは異常な動作です。パッケージインストール中のネットワークアクティビティを追跡するプロセスレベルの振る舞い監視によって、これをフラグ付けできます。
ファイルシステムカナリア。 カナリアパスに偽のSSHキーを、別のカナリアパスに偽のAWS認証情報を配置します。これらのファイルを読み取るプロセスを監視しましょう。標準パスを走査する認証情報窃取ツールはカナリアを読み取りますが、正規のプロセスは読み取りません。カナリアはデータ送信が完了する前にアラートをトリガーします。
インストール環境の分離。 pip installを実際の認証情報にアクセスできない環境で実行し、インストール済みパッケージを本番環境にコピーします。.pthファイルはpip自体のPythonプロセス中に発火するため、認証情報窃取ツールはインストール時に実行されます。インストール環境に窃取すべき認証情報がなければ、攻撃は何も得られません。
これらのメカニズムはいずれも、攻撃者のミスを必要としません。ペイロードの品質に関係なく機能します。完璧な攻撃でも何も得られない環境を設計するというアーキテクチャパターンは、デプロイと防御:エージェント信頼のパラドックスで述べた原則と同じものです。
非対称性
防御側には1つの構造的優位性があります:環境を選択できるということです。攻撃者は、パッケージがインストールされる環境の中で活動せざるを得ません。その環境に認証情報がなく、ネットワークアクセスがなく、ファイルシステムカナリアが設置されていれば、ペイロードは技術的には成功しても運用上は失敗します。
LiteLLMの攻撃が成功したのは、インストール環境が公開用認証情報、SSHキー、クラウドトークンを保持する環境と同一だったためです。フォーク爆弾はセキュリティアーキテクチャにとって無関係でした。関係があったのはタイムラインに対してです。
次回、フォーク爆弾は存在しないでしょう。しかし認証情報はパッケージマネージャーと同じ環境に残ったままでしょう。問題は、次の攻撃者がクリーンなペイロードを出荷する前に、環境を変更できるかどうかです。Ralphエージェントアーキテクチャの分析では、侵害されたコンポーネントが分離境界を超えてエスカレーションできないよう、エージェントシステムを構築する方法を示しています。
FAQ
なぜ攻撃者はフォーク爆弾をテストしなかったのか?
.pthファイルが子プロセスを生成するのは、親プロセスをブロックせずにペイロードを実行するための合理的な実装選択です。再帰的なトリガーは.pthとPythonのsite.py初期化の間の微妙な相互作用であり、結合テストでは現れてもユニットテストでは現れない類のバグです。マルウェア作者が現実的な環境で結合テストを行える機会は限られています。
フォーク爆弾は意図的だった可能性はあるか?
その可能性は低いでしょう。フォーク爆弾はマルウェアを即座に目立たせてしまい、攻撃者の目的とは正反対です。数週間にわたり静かに動作する認証情報窃取ツールは、46分で検知されるものと比べて桁違いに多くの認証情報を収集できます。
ドメイン登録日チェックは大規模運用で実用的か?
はい。ドメインの登録日はWHOISまたはDNS登録日APIsから取得可能です。チェックはリクエストあたりミリ秒単位のレイテンシを追加するのみです。既知の新規ドメインはほとんどの組織でホワイトリスト化できます。
Sources
-
FutureSearch (Daniel Hnyk), “LiteLLM Hack: Were You One of the 47,000?” March 2026. ↩↩
-
isfinne et al., “LiteLLM Supply Chain Attack,” GitHub Issue #24512, March 2026. ↩
-
Blake Crosley, “The Supply Chain Is the Attack Surface,” blakecrosley.com, March 2026. ↩↩↩
-
Kaspersky, “Trojanization of Trivy, Checkmarx, and LiteLLM Solutions,” March 2026. ↩
-
Blake Crosley, “When Your Agent Becomes the Researcher,” blakecrosley.com, March 2026. ↩