この記事について
本記事は、aeon 公式ブログに掲載された英語記事 Black October: what one week of PHP2Shell, LiteLLM and eMudhra says about who scans your code(2026年10月25日)を日本語にしたものです。
私たちは記事後半で紹介する aeonfun/aeon を開発しており、利害関係があるため明記しておきます。CVE 番号・バージョン・日時・数値はすべて原文どおりです。記事内のリンクは 2026-10-26 時点で到達確認済みです(NSA と Investing.com はボット対策で自動確認できなかったため、ブラウザでの確認を推奨します)。
2026年10月17日(金)から24日(金)までの1週間で、PHP インタプリタは frontier AI モデルによって発見された認証前 RCE 2件の緊急パッチを出しました。修正日は embargo の漏洩によって前倒しになりました。人気の AI プロキシは PyPI と Docker Hub にバックドア入りのリリースを公開し、インドの認証局は公開証明書から誰でも導出できる中間鍵を8本抱えていたことが判明しました。Node.js は PHP と同じ日にセキュリティ修正を10件出しました。ヨーロッパの複数の国では、運用者がパッチを当てるあいだ政府サイトが意図的に停止されました。
どれも特殊な攻撃ではありません。2件はモデルが探しに行くまで目の前に放置されていた古いバグです。1件は136日間誰も失効させなかった漏洩クレデンシャルです。すべてに共通するのは、脆弱性を「見つける」コストは安くなったのに、「直す」のは今も人間が気づくのを待っている、という構図です。
- PHP2Shell: 10年もののバグが1週間で見つかり、1日早く漏れた
何が起きたか。 CVE-2026-109618 と CVE-2026-109619。どちらも CVSS v4.0 で 9.2 です。前者は PHP の out-of-memory 処理におけるメモリ破壊で、細工した multipart リクエストで到達できます。後者は、再利用されるワーカー上でリクエストをまたいで残る状態に起因する use-after-free です。どちらも Web ワーカー権限での認証なしコード実行につながります。Web リクエストを処理するすべての SAPI — PHP-FPM、Apache mod_php、php-cgi、FrankenPHP、LiteSpeed — が対象です。Rapid7 は mod_php を最悪のケースとしており、理由は「アプリケーションのコードが一切実行される前に exploit が成功しうる」からです。Wiz によれば、5.4 以降のすべての PHP バージョンが少なくともどちらか一方の影響を受けます。
修正版は 8.5.12、8.4.27、8.3.36、8.2.35。7.4〜8.1 のブランチには限定的なソースのバックポートのみが提供されます。Rapid7 は「両方の完全な修正を含むアップデートだけが、唯一の完全な対処である」としています。
どう見つかったか。 3つのグループが同じ根本原因にたどり着きました。Calif の研究者 Ryan Austin は、OpenAI の "Patch the Planet" プログラムで PHP を監査している最中に発見しました。OpenAI も8月11日、Calif と同じ日に独立して同じ根本原因を報告しています。Wiz の研究者は Gemini 4 Argon、Wiz Atlas、GPT-5.6 Sol を使い、かつては強力なチームが数か月かけていた作業を研究者1人が1週間でこなしたと述べています。
騒動。 協調公開日は10月22日(木)に設定されていました。ところが Hacker News の "Tell HN" 投稿(現在は削除済み)が「信頼できる情報筋」を名乗り、CVSS 10.0 の PHP RCE が2件あると告知しました。スクリーンショットは X と Mastodon で拡散しました。10月20日、watchTowr は embargo が破られたことを認め("Information has leaked wrt zero-day embargoed RCE vulns in PHP")、同時に自分たちがバグを発見したわけではないと付け加えました。PHP のセキュリティチームは同日に事前告知を出し、リリースを10月21日(水)14:00 UTC に前倒しし、詳細が公になればさらに早める権利を留保するとしました。最終スコアは、漏れた 10.0 ではなく 9.2 でした。
影響。 NSA は PHP の運用者に対し、アップデートするか、できるまでシステムをオフラインにするよう求めました。Reuters は水曜日にヨーロッパ各地の政府サイトが停止したと報じています。フランスの県庁サイトは修正待ちのあいだ取り下げられ、ドイツ連邦の IT プロバイダ ITZBund も予防措置としていくつかのサイトを停止しました。Reuters は Censys のデータを引き、観測された 260 万ホストのうち約 150 万が、修正がまったく提供されていない PHP バージョンを動かしていたと報じました。Palo Alto Networks は PAN-OS と Panorama が影響を受けることを確認しています。
冷静に見ると。 CVSS v4 のベクトルは AC:H/AT:P、つまり攻撃の複雑さが高く、前提条件があるということです。Rapid7 によれば、公開されている PoC はそれぞれ OS・PHP バージョン・Web サーバーの特定の組み合わせ1つでしか動かず、広く信頼できるものはありません。また最終更新の時点では、exploit の試行は観測しているものの、実環境での侵害は確認されていません。Cloudflare と watchTowr のハニーポットも試行を記録しています。見出しが示すより窓は狭いのですが、多くの人がこの研究を再現しているため、その窓は急速に閉じつつあります。
まだ終わっていない。 10月23日、PHP Foundation は3つ目の問題 CVE-2026-115560 を公開しました。緩和策はあるもののパッチはまだなく、exploit には非標準の設定が必要です。 - LiteLLM 1.107.0: 失効されなかった鍵1本、136日後
10月21日、litellm==1.107.0 が3つの余分なファイル(cook.pth、cook.py、sitecustomize.py)とともに PyPI に公開されました。.pth ファイルは Python インタプリタが起動するたびに実行されるため、wheel をインストールしたホストでは、LiteLLM を import しているかどうかに関係なくペイロードが実行されました。Datadog と StepSecurity は、クレデンシャルスティーラーとリモートローダーの組み合わせだと説明しています。不正な wheel が PyPI 上にあったのはおおよそ 11:39〜13:23 UTC。Docker Hub と GHCR のイメージ(latest を含む)は 14:20 UTC 頃まで不正ビルドを配信していました。LiteLLM にとっては、3月の 1.82.7 と 1.82.8 に続く今年2度目のサプライチェーン侵害です。
LiteLLM 自身の攻撃チェーンの解説は、根本原因があまりにありふれているという意味で、この週でもっとも役に立つ文書です。
2026年5月27日。 公開リポジトリ LiteLLM-Labs/lite-harness にコミットされたファイルに、社内の LiteLLM Agent Platform デプロイのマスターキーが含まれていた。そのコミットはのちに force-push で上書きされた。解説によれば "key revocation did not occur for the master key"(マスターキーの失効は行われなかった)。
10月10日。 攻撃者がその鍵を使用。ある API レスポンスに、organization オーナーの GitHub CLI OAuth トークンが含まれていた。
10月10日〜12日。 オーナートークンを使い、攻撃者は使い捨ての CI ブランチを push。そのワークフローがリポジトリの secrets(さらに2人のメンテナのトークンを含む)を webhook エンドポイントに送信し、その後実行履歴を削除した。
10月21日。 リリースワークフローがよく似た名前の Berri-AI/litellm fork に向けられ、オーナートークンでブランチ保護が上書きされ、盗んだメンテナトークンで本番ゲートが承認され、wheel が出荷され、実行ログと main の履歴が消された。
検知のきっかけになった issue は、12:06 UTC にコミュニティメンバーが立てたものです。公式の v1.107.0 git タグはクリーンです。対処は 1.106.2 に固定し、1.107.0 をインストールした、またはイメージを pull したホスト上のすべてのクレデンシャルをローテーションすることです。
教訓は5月から10月までの空白にあります。git の履歴を書き換えても鍵の漏洩はなかったことになりません。そして公開リポジトリにある有効なクレデンシャルこそ、verified-secret スキャナが検出するために存在するものです。 - eMudhra: 誰でも計算できた CA 鍵8本
10月17日、ある研究者が、2025年4月30日に生成されたバッチに属する eMudhra の中間 CA 鍵8本が、公開証明書から導出できるほど弱いと報告しました。うち6本はブラウザが受け入れる任意の Web サイトの TLS 証明書を発行でき、2本はコード署名用でした。eMudhra によれば、欠陥のある鍵生成セレモニーによって弱い鍵がもう1セット作られ、そのセットがルートストアに入ってしまったとのことです。
Chrome、Mozilla、Apple、Microsoft は10月17日から20日にかけてこれらの証明書をブロックしました。Mozilla は emSign ECC Root CA - G3 を削除しています。10月21日時点で悪用は確認されておらず、Chrome によるブロック以前に、6本の TLS 中間証明書にチェーンする Web サイト証明書は Certificate Transparency に現れていませんでした。問題はブラウザ以外のロングテールです。失効確認や CT 確認をしない API クライアント、コンテナ、ビルドパイプライン、組み込み機器などです。Go の crypto/x509 には CVE-2026-111943 が割り当てられ、Node.js は10月21日のリリースで CA ストアを更新しました。このリリースでは脆弱性10件(うち4件が high)も修正されています。
3つをつなぐもの
固有名詞を取り払うと、この1週間は3つの要素に分けられます。
発見は安くなった。 PHP コアに10年以上潜んでいたバグクラスが、frontier モデルを使う研究者1人によって1週間で見つかった。同じモデルは誰でも使えるし、PHP のリリースが前倒しされたのは、漏洩をもとにすでに再現を進める人たちがいたからだ。
今も実害を出すのは、もっとも古い失敗だ。 公開コミット内の鍵。インストール時にコードを実行する依存関係。誰も更新しないトラストストア。
対応は人間のペースだ。 LiteLLM の鍵は136日間有効なままだった。150万のホストが、上流の修正がない PHP ブランチの上にある。各国政府は、確信を得るよりも速いという理由で Web サイトを止めることを選んだ。
攻撃者が好きなときにモデルをあなたのコードに向けられるなら、四半期に一度、あるいは誰かが思い出したときにだけチェックするやり方では、主導権は相手に残ったままです。
自律エージェントの出番
私たちは Aeon を開発しています。Aeon はオープンソースのエージェント harness で、あなた自身のリポジトリの GitHub Actions 上で skill をスケジュール実行します。その skill のひとつが vuln-scanner です。スキャン1回ごとに次のことを行います。
Semgrep を security-audit、owasp-top-ten、secrets の ruleset で実行する
TruffleHog を --only-verified 付きで、作業ツリーと git 履歴の両方に対して実行する。鍵っぽく見える文字列すべてではなく、実際に認証が通るクレデンシャルだけを報告する
見つかったすべての lockfile に osv-scanner をかける。npm、PyPI、Go、Cargo、Composer など、OSV データベースにあるエコシステムをカバーする
生の出力をモデルがトリアージし、実際に exploit 可能な finding だけに絞り込んだうえで、開示チャネルごとに振り分ける。コードの欠陥は private vulnerability reporting へ、依存関係を上げる public な PR は CVE がすでに公開されている場合のみ
姉妹 skill の vuln-tracker は、スキャナが起票したものを毎日ポーリングします。PR と advisory のステータス、非公開報告のトリアージ状況、そして返答のないまま日数が経っている開示などです。
デフォルトでは、スキャナはトレンドのリポジトリを1つ選んで監査し、責任ある開示のプロセスに従います。var を自分の owner/repo に向ければ、同じパイプラインがあなたのコードに対して、設定した cron で動きます。出荷時のデフォルトは毎週土曜 16:00 UTC で、毎晩実行にすることもできます。
今週の出来事に当てはめると:
LiteLLM。 organization が公開しているすべてのリポジトリに対し、git 履歴の verified-secret スキャンをスケジュール実行することは、公開コミット内の有効なマスターキーを捕まえるための仕組みそのものです。継続実行が重要なのは、履歴が force-push されると新しい clone にはもうそのコミットが含まれないかもしれない一方で、鍵は誰かが失効させるまで有効なままだからです。
悪意ある依存関係。 既知の悪意あるパッケージバージョンには OSV エントリが作られます。lockfile に対する osv-scanner の定期実行は、先月出荷した固定バージョンがその後フラグを立てられたことに気づくための手段です。
PHP2Shell。 ここが限界です。バグはあなたのコードではなくインタプリタにあります。osv-scanner が読むのは lockfile であって、サーバーで動いている PHP バイナリではないため、このスキャンでは検出できませんでした。その穴を埋めるのはランタイムのインベントリとパッチ適用です。ここでの継続スキャンの意義は間接的なものです。モデルが次に見つけるバグはあなた自身のアプリケーションコードにあるかもしれず、そのコードを毎週チェックするスキャナがあれば、先に気づくチャンスが生まれます。
スキャナはパッチ適用、鍵のローテーション、インシデントの責任者の代わりにはなりません。エージェントが変えるのは頻度です。その週に誰かが注意を払っているかどうかに関係なくスキャンは予定どおり実行され、結果は生のツール出力ではなく、トリアージ済みの finding として届きます。
今週のチェックリスト
PHP: 8.5.12、8.4.27、8.3.36、8.2.35 のいずれかに上げる。それまでは PHP advisory の一時的な緩和策(session.upload_progress.enabled=0、管理者側で強制する memory_limit、8.5 では fatal_error_backtraces=0)を適用し、すべてのワーカーを再起動する。CVE-2026-115560 の動向も追う。
LiteLLM: 10月21日 11:39〜14:20 UTC のあいだに 1.107.0 をインストールした、またはイメージを pull したものがあれば、そのホストは侵害されたものとして扱い、そこから到達できるものをすべてローテーションする。
eMudhra: ブラウザだけでなく、コンテナ、ビルドイメージ、言語ランタイムの CA バンドルを更新する。Node.js と Go も更新する。
一度でもコミットに含まれたことのあるクレデンシャル: 失効させる。履歴を書き換えても何も失効しない。
出典(英語)
Rapid7
Threat Landscape
Fortune
CNN
NSA
Reuters via Investing.com
LiteLLM
Help Net Security
Cloudflare
TechCrunch
コードを読みたい方へ
まずは skills/vuln-scanner/SKILL.md を。aeon では 1 skill = 1 SKILL.md なので、上で紹介したスキャンの手順・トリアージ・開示ルールはこのファイル1枚に書かれています。
リポジトリ: aeonfun/aeon(MIT License)
原文(英語): Black October: what one week of PHP2Shell, LiteLLM and eMudhra says about who scans your code
誤訳や不正確な表現があれば、コメントで教えてください。
