PHP2Shell の修正 · 更新ガイド
PHP2Shell の修正方法
修正方法は PHP の更新と再起動です。設定変更、プラグインの更新、WAF ルールでは代わりになりません。主要なプラットフォームごとのコマンドと、パッチが実際に適用されたことを確認する方法をまとめました。
最終確認 2026-10-22
対象バージョン
8.5.12、8.4.27、8.3.36、8.2.35 以降——または changelog に CVE-2026-109618 と CVE-2026-109619 が記載された OS ベンダーのパッケージ。PHP 8.1 以前には新しいリリースは出ません——下記を参照してください。
| ブランチ | 脆弱 | 修正版 |
|---|---|---|
| 8.5 | < 8.5.12 | 8.5.12 |
| 8.4 | < 8.4.27 | 8.4.27 |
| 8.3 | < 8.3.36 | 8.3.36 |
| 8.2 | < 8.2.35 | 8.2.35 |
| 8.1 · 8.0 · 7.4 | すべて | ソースのバックポートのみ |
| 5.4 – 7.3 | すべて | 修正なし |
1. すべての PHP 実行環境を洗い出す
見落とされた実行環境は、サーバー群が脆弱なまま残る最大の原因です。各ホストで次を実行してください。
# PHP processes running right now, and when they started
ps -eo pid,lstart,cmd | grep -E '[p]hp-fpm|[h]ttpd|[a]pache2|[f]rankenphp|[l]sphp'
# CLI and FPM can be different builds — check both
php -v
ls /usr/sbin/php-fpm* 2>/dev/null && for f in /usr/sbin/php-fpm*; do "$f" -v | head -1; done
# Is Apache running PHP in-process (mod_php)? That is the highest-risk setup.
apachectl -M 2>/dev/null | grep -i php
# PHP version inside every running container
docker ps --format '{{.Names}}' | while read c; do
printf '%s: ' "$c"; docker exec "$c" php -r 'echo PHP_VERSION, PHP_EOL;' 2>/dev/null || echo 'no php'
doneレジストリ内のベースイメージ、CI ランナー、ステージング・プレビュー環境、PHP を内蔵したアプライアンス、管理者のいない古いサーバーも確認してください。外部からは curl -sI https://site | grep -i x-powered-by でバージョンがわかることもありますが、多くのサイトは隠しています。 PHP 内蔵製品は NCSC-NL の製品一覧で調べ、各ベンダーに修正状況を確認してください。
2. 修正版をインストールする
OS 標準パッケージと、Ondřej Surý の PPA / packages.sury.org が対象です。Debian/Ubuntu 標準パッケージは上流の古い番号のまま修正をバックポートするため、changelog での確認が決め手になります。
sudo apt update
# Upgrade only the PHP packages that are installed
sudo apt install --only-upgrade $(dpkg-query -W -f='${db:Status-Abbrev} ${binary:Package}\n' 'php*' | awk '$1=="ii"{print $2}')
# Proof the fix is in: the changelog should mention the CVE
# (replace 8.3 with your version)
apt changelog php8.3-common 2>/dev/null | grep -m1 -E 'CVE-2026-10961[89]' || echo 'NOT FIXED in this package yet'3. PHP を動かすものをすべて再起動する
パッケージのインストールはディスク上のファイルを置き換えるだけです。実行中のプロセスは、再起動するまで古い脆弱なコードを実行し続けます。
# Debian / Ubuntu (adjust the version)
sudo systemctl restart php8.3-fpm
sudo systemctl restart apache2 # if using mod_php
# RHEL family
sudo systemctl restart php-fpm httpd
# Anything still mapped to the old, deleted PHP binary needs a restart
sudo grep -l -E '(php|libphp)[^ ]* \(deleted\)' /proc/[0-9]*/maps 2>/dev/null
sudo needrestart -r l # Debian/Ubuntu helper, if installed
# Long-running PHP workers
php artisan queue:restart # Laravel queues
php artisan octane:reload # Octane (Swoole / RoadRunner / FrankenPHP)
sudo supervisorctl restart all # supervisor-managed workers4. Web サーバーの視点で確認する
# Version of the FPM binary that actually serves traffic
php-fpm8.3 -v 2>/dev/null || php-fpm -v
# Compare process start times with when you upgraded
ps -o pid,lstart,cmd -C php-fpm8.3,php-fpm,apache2,httpd
# Ask the web server itself (use a random name, delete straight after)
F="v-$(openssl rand -hex 8).php"
echo '<?php echo PHP_VERSION;' | sudo tee /var/www/html/$F >/dev/null
curl -s https://your-site.example/$F; echo
sudo rm /var/www/html/$Fパッチ適用後の新しい挙動
修正により、OOM 時の中断は安全なポイントで確認されるソフトリミットに置き換えられ、さらにその上に、到達すると _exit() で即座にプロセスを終了させるハードメモリリミットが追加されます。ハードリミットに達すると、シャットダウン関数やデストラクタは実行されません。アプリが register_shutdown_function で処理(ログ記録、後片付け)をしている場合は、更新後にメモリを多く使う処理をテストしてください。
PHP 8.1、8.0、7.4 以前を使っている場合
これらのブランチはサポートが終了しています。PHP プロジェクトは新しいリリースを出しませんが、深刻度を考慮して最小限のソースバックポートを公開しました。
- 最善策:PHP 8.4 または 8.5 へ移行。急ぐ場合は、8.1 からなら 8.3 のほうが移行の幅が小さくて済みます(8.2 は 2026 年末にサポート終了)。
- OS パッケージ:Ubuntu(Ubuntu Pro / ESM を含む)、Debian LTS、RHEL などの長期サポートベンダーは事前にパッチを受け取っています。上記の方法で、パッケージの changelog に CVE があるか確認してください。
- ソースからビルドする場合:PHP チームのバックポートブランチ——PHP 8.1, PHP 8.0, PHP 7.4。この 2 つの CVE だけを修正するもので、ブランチ自体はサポート対象外のままです。
- さらに古いブランチ:上記の範囲より古い PHP プロジェクトのソースバックポートは掲載されていません。ただしディストリビューションは修正を提供する場合があります。Ubuntu は修正済みパッケージを確認しています。Pro / ESM による古いブランチも含まれます。両 CVE の修正を確認し、ワーカーを再起動してください。修正済みビルドがなければホストを隔離して移行してください。
5. その後
関連ページ
- バージョンチェッカーphp -v の出力やバージョン一覧を貼り付けるだけで、各 PHP ビルドが PHP2Shell に脆弱か、修正済みか、サポート終了か、ディストリのバックポートかをすぐ判定します。
- 暫定対策まだアップデートできない場合の PHP2Shell 暫定対策:memory_limit、post_max_size、アップロード進捗、fatal_error_backtraces、cgroup 制限——それぞれ何を防ぎ、何が犠牲になるか。
- ホスティング会社共有ホスティングやマネージドホスティングでは PHP を自分で更新できません。cPanel や Plesk などでの PHP バージョンの確認・切り替え方法、各社の公表内容、問い合わせるべきこと。
- 検知PHP2Shell 悪用の兆候、今すぐ実行できるログ検索、セキュリティベンダーの検知ルール、侵害の痕跡を見つけたときの対応。
- Cloudflare WAFFree/有料プラン向けの Cloudflare PHP2Shell WAF ルール ID、ルールが有効でブロックしているかの確認方法、そして Cloudflare の背後でも PHP の更新が必要な理由。
- session.upload_progresssession.upload_progress の無効化が PHP2Shell を部分的にしか防げない理由、確実に効く設定場所(.user.ini や ini_set では不可)、確認方法、再起動すべきもの。