PHP2Shell 点検(CVE-2026-109618・CVE-2026-109619)
自分が管理するPHPサイトがPHP2Shellに露出しているかを非破壊で確認する、無料のオープンソースツールです。
無料・MITPython 3.8+ 標準ライブラリのみ攻撃リクエストなし日本語・English・한국어 レポート
PHP2Shellとは
2026-10-21に公開されたPHPランタイムの脆弱性2件で、どちらもCVSS v4.0 9.2です。認証不要のリモートコード実行(RCE)につながり、Webリクエストを処理するPHP(Apache mod_php、PHP-FPMなど)は事実上すべて影響を受けます。公開PoCが存在し、公開4日前(10-17)から実際の攻撃試行が観測されています。
| PHPブランチ | 修正バージョン |
|---|---|
| 8.5 | 8.5.12 以上 |
| 8.4 | 8.4.27 以上 |
| 8.3 | 8.3.36 以上 |
| 8.2 | 8.2.35 以上 |
| 8.1 以下 | 公式の修正リリースなし — ディストリ・LTSベンダーのパッケージを使うかアップグレード |
ディストリビューションのパッケージ(例:8.2.7-1+deb12u5)はバージョン番号が低くてもバックポートで修正済みの場合があります。基準時点 2026-10-23。詳細:PHP脆弱性動向 §2
ステップ1 — サイトのURLで一次確認
サイトのアドレスを入力すると、自分のPCで実行するコマンドを作成します。点検ツールは対象にHTTP GETを1回だけ送り、応答ヘッダーに表れたPHPバージョンを修正バージョンと比較します。
結果の読み方
| 判定 | 意味 |
|---|---|
likely_vulnerable | 公開されているPHPバージョンが修正バージョン未満、または公式修正のないEOLブランチ(8.2未満)。ステップ2で確定してください。 |
not_vulnerable_by_version | 公開バージョンが修正基準以上。補助的な信号であり、安全の保証ではありません。 |
unknown | PHPの痕跡はあるがバージョン非公開(または8.3のように一部のみ公開)。 |
not_detected | 応答からPHPの痕跡を発見できず。PHPが存在しないという意味ではありません。 |
error / invalid | 接続・TLSエラー、またはURL形式エラー。 |
本番サーバーは多くの場合バージョンを隠すため、unknownはよくある結果です。バージョンだけでは実際の攻撃経路が成立するかはわからないため、サーバーにアクセスできるならステップ2を実行してください。
ステップ2 — サーバー内で確定点検
PHPが動作する(Linux)サーバーで実行します。設定ファイル・パッケージ情報・/proc・ログを読むだけで、コマンド実行0件・ネットワーク要求0件です。SAPI(mod_php/FPM)と実効設定(memory_limit、session.upload_progress.enabledなど)からCVEごとの到達可能性を判定し、直すべきファイルと行番号をレポートに残します。
curl -fsSLO https://raw.githubusercontent.com/neoqmin/php2shell/v0.1.0/php2shell_host.py echo '50a48c79c120774e9dccc27ee12672444b7730b31a32c2b833e650920ebf0925 php2shell_host.py' | sha256sum -c - sudo python3 php2shell_host.py --lang ja
結果は./php2shell_report_<ホスト>/にreport.json、report_ja.md、report_ja.html(A4印刷用)として保存されます。レポートにはサーバーの脆弱性情報が含まれるため、公開しないでください。
レポート例(ローカル検証環境、実在の対象ではありません):HTML · Markdown · JSON
| 判定 | 意味 |
|---|---|
| 到達可能 | このサーバーのSAPI・実効設定で攻撃経路の前提条件が成立 |
| 緩和済み(一時的) | 一時緩和策がリクエスト解析前の段階に適用されている。安全ではない — 設定だけでは完全には緩和されない |
| 判定保留 | 根拠不足・設定の読み取り失敗。到達不可という意味ではない |
| パッチ済み | 修正バージョン以上、またはパッケージのchangelogに両CVEのバックポート記録あり |
対応:Debian/Ubuntuパッケージ(Apache mod_php、nginx/Apache + PHP-FPM)、公式Docker php:*-apacheイメージ。RHEL系のパッケージバージョン、公式php:*-fpmイメージ、php-cgi・LiteSpeed・FrankenPHPはまだ判定できません。全オプションと制限はREADMEを参照してください。
すぐにパッチを当てられない場合
唯一の完全な解決策はPHPの更新です。パッチまでの一時緩和(session.upload_progress.enabled=0、memory_limit・post_max_sizeの調整、multipartの遮断など)は、php.ini・FPM poolのようにリクエスト解析前に適用される場所に設定しないと効果がありません。ini_set()とFPMの.user.iniは効果がありません。サーバーごとにどこを直すかはステップ2のレポートが示します。根拠:動向 §2.6
よくある質問
リモート点検で not_vulnerable_by_version なら安全ですか?
いいえ。ヘッダーに表れたバージョンが基準以上というだけで、プロキシ・ロードバランサーがバージョンを隠すことや、SAPI・設定のようにリモートでは見えない条件があります。最終判断はサーバーインベントリとステップ2で行ってください。
バージョンを隠しているサーバー(unknown)はどう確認しますか?
外部からは確認できません。サーバーでphp -vとパッケージのchangelogを確認するか、ステップ2の点検ツールを実行してください。
他社のサイトも点検できますか?
許可なく行わないでください。非破壊のGETでも、許可のない体系的な点検は不正アクセス禁止法などに抵触するおそれがあります。他組織のサーバーで問題に気づいた場合は自分で検証せず、運用主体またはIPA・JPCERT/CCに連絡してください。
ツールは何を収集・送信しますか?
何も送信しません。リモート点検ツールは入力した対象にGETを1回送るだけで、サーバー点検ツールはネットワーク要求を行いません。レポートの透明性付録に、読み取ったファイルの一覧が記録されます。
攻撃(PoC)コードは含まれていますか?
含まれていません。攻撃ペイロード、エクスプロイト、回避手法を含まず、エクスプロイトのリポジトリにもリンクしていません。