PHP2Shell とは
PHP 本体に見つかった2つの脆弱性の通称。2026年10月21日に修正版が公開された。
何が起きるか
- ログインなしで、外部からサーバー上のプログラムを実行される
- アプリのプログラムが動く前に攻撃が届く実例がある
- いちばん危ないのは mod_php(Apache に PHP を組み込む方式)
- 危険度は CVSS 4.0 で 9.2(10 点満点)
原因(2つの脆弱性)
- CVE-2026-109618:メモリ不足の処理の途中で、作りかけのデータを正しいものとして扱ってしまう
- CVE-2026-109619:解放したはずのデータを、同じワーカーの次のリクエストが使ってしまう
- 修正版の公開前に、内容が外に漏れた
すぐ更新できないときの応急処置
php.net 公式の一時しのぎ。完全に防げるのは更新だけ。
CVE-2026-109619 への応急処置
session.upload_progress.enabled=0にして、すべてのワーカーを再起動- 設定は php.ini・FPM のプール・サーバーの設定で行う(
ini_set()や.user.iniでは効かない) - PHP 8.5 は
fatal_error_backtraces=0も設定 - エラーを隠す(
display_errorsや@)だけでは効かない
CVE-2026-109618 への応急処置
memory_limit=-1(FPM のプールか Apache の設定で)- アップロード不要なら
post_max_size = 8M、必要なら32M - Web サーバーやプロキシで、リクエストの大きさ・項目数・ヘッダー数を制限
- メモリの上限はコンテナや cgroup でかける(
RLIMIT_ASは使わない)
レンタルサーバーでは、これらを利用者が変えられないことが多い。その場合はサーバー会社の対応を待つか、PHP のバージョンを切り替える。
PHP バージョン別の状況
2026年10月22日時点(php.net の Supported Versions・Unsupported Branches より)。
| バージョン | PHP2Shell | 修正版 | 公式の保守 |
|---|---|---|---|
| PHP 8.5 | 修正版あり | 8.5.12 以降 | 2029年12月31日まで |
| PHP 8.4 | 修正版あり | 8.4.27 以降 | 2028年12月31日まで |
| PHP 8.3 | 修正版あり | 8.3.36 以降 | 2027年12月31日まで |
| PHP 8.2 | 修正版あり・年内に保守終了 | 8.2.35 以降 | 2026年12月31日まで |
| PHP 8.1 | 修正版なし | なし(最終版 8.1.34) | 2025年12月31日に終了 |
| PHP 8.0 | 修正版なし | なし(最終版 8.0.30) | 2023年11月26日に終了 |
| PHP 7.4 | 修正版なし | なし(最終版 7.4.33) | 2022年11月28日に終了 |
| PHP 7.3 | 修正版なし | なし(最終版 7.3.33) | 2021年12月6日に終了 |
| PHP 7.2 | 修正版なし | なし(最終版 7.2.34) | 2020年11月30日に終了 |
| PHP 7.1 | 修正版なし | なし(最終版 7.1.33) | 2019年12月1日に終了 |
| PHP 7.0 | 修正版なし | なし(最終版 7.0.33) | 2019年1月10日に終了 |
| PHP 5.6 | 修正版なし | なし(最終版 5.6.40) | 2018年12月31日に終了 |
| PHP 5.4〜5.5 | 修正版なし | なし | 2016年までに終了 |
7.4・8.0・8.1 向けの修正の部品(バックポート)は公式の告知からリンクされているが、正式な版としては出ていない。自分で PHP を組み立てる人向け。
移行で動かなくなる主な原因
php.net の移行ガイドから、古いサイトや古いプラグインで問題になりやすいものだけを抜き出した。
7.4 → 8.0
create_function()・each()・money_format()などが削除0 == "foo"が false に(文字列と数値の比較が変わった)- 未定義の定数が警告ではなくエラーに
- クラス名と同じ名前のメソッドがコンストラクタにならない
- 非 static メソッドを
Class::method()で呼ぶとエラー implode()の逆順の引数が使えない
8.0 → 8.1
- 内部関数に null を渡すと非推奨の警告(
strlen(null)など) htmlspecialchars()の既定がENT_QUOTESに- MySQLi が既定でエラー時に例外を投げる
- PDO(MySQL・SQLite)が数値を文字列でなく int / float で返す
8.3 → 8.4
E_STRICTの定数が非推奨- DBA・ODBC・SOAP の一部で
is_resource()の判定が効かない round()に無効な mode を渡すと ValueError- OPcache の JIT の既定値が変わった
PHPCompatibility(PHP_CodeSniffer のルール)を使うと、移行の前にプログラムを機械的に調べられる。
よくある質問
どの PHP のバージョンが影響を受ける?
PHP 5.4〜8.5 の幅広い版。修正版は PHP 8.5.12・8.4.27・8.3.36・8.2.35。PHP 8.1 以前には公式の修正版が出ていない。
PHP 7.4 や 8.1 はどうすればいい?
公式の修正版がないため、PHP 8.4 か 8.5 への移行が必要。移行の前にバックアップを取り、WordPress ならプラグインとテーマを先に更新する。
PHP 8.2 なら安心?
修正版(8.2.35)は出ているが、PHP 8.2 は 2026年12月31日で公式の保守が終わる。年内に 8.4 か 8.5 へ移っておくのが安全。
レンタルサーバーなら何もしなくていい?
多くのサーバー会社が修正を順に入れている。ただし PHP 8.1 以前を選んでいるサイトは、PHP 自体の保守が終わっている。サーバー会社の告知と、自分の PHP のバージョンの両方を確認する。
PHP を新しくするとサイトが壊れない?
古いプラグインや古い書き方のプログラムは、新しい PHP で動かなくなることがある。バックアップを取り、テスト環境で試してから切り替えるのが安全。
URL を入れると、サイトに何かされる?
トップページを普通に1回読むだけ。負荷のかかる調査や、攻撃を試すことはしない。
参考にした情報
- php.net:2026年10月21日のセキュリティ告知と修正版
- php.net:Supported Versions:各版の保守期限
- php.net:Unsupported Branches:保守が終わった版と最終版
- php.net:付録(移行ガイド):版ごとの互換性のない変更
- GHSA-w8hw-w9fx-j79w(CVE-2026-109618)
- GHSA-6wmf-4rv5-p3rp(CVE-2026-109619)