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.128.5.12
8.4< 8.4.278.4.27
8.3< 8.3.368.3.36
8.2< 8.2.358.2.35
8.1 · 8.0 · 7.4すべてソースのバックポートのみ
5.4 – 7.3すべて修正なし

1. すべての PHP 実行環境を洗い出す

見落とされた実行環境は、サーバー群が脆弱なまま残る最大の原因です。各ホストで次を実行してください。

shell
# 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 での確認が決め手になります。

shell
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 を動かすものをすべて再起動する

パッケージのインストールはディスク上のファイルを置き換えるだけです。実行中のプロセスは、再起動するまで古い脆弱なコードを実行し続けます。

shell
# 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 workers

4. Web サーバーの視点で確認する

shell
# 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 プロジェクトは新しいリリースを出しませんが、深刻度を考慮して最小限のソースバックポートを公開しました。

  1. 最善策:PHP 8.4 または 8.5 へ移行。急ぐ場合は、8.1 からなら 8.3 のほうが移行の幅が小さくて済みます(8.2 は 2026 年末にサポート終了)。
  2. OS パッケージ:Ubuntu(Ubuntu Pro / ESM を含む)、Debian LTS、RHEL などの長期サポートベンダーは事前にパッチを受け取っています。上記の方法で、パッケージの changelog に CVE があるか確認してください。
  3. ソースからビルドする場合:PHP チームのバックポートブランチ——PHP 8.1, PHP 8.0, PHP 7.4。この 2 つの CVE だけを修正するもので、ブランチ自体はサポート対象外のままです。
  4. さらに古いブランチ:上記の範囲より古い PHP プロジェクトのソースバックポートは掲載されていません。ただしディストリビューションは修正を提供する場合があります。Ubuntu は修正済みパッケージを確認しています。Pro / ESM による古いブランチも含まれます。両 CVE の修正を確認し、ワーカーを再起動してください。修正済みビルドがなければホストを隔離して移行してください。

5. その後

  • pm.max_requests = 1 や memory_limit = -1 など、性能を落とす 暫定対策 を外し、適切な制限値に戻してください。
  • 過去に悪用された形跡がないか確認:検知ガイド。パッチを当てても、すでに起きた侵害は元に戻りません。
  • PHP 8.2 を使っている場合、セキュリティサポートは 2026-12-31 に終了します。更新手順を覚えているうちに、8.4 か 8.5 への移行を計画しましょう。

関連ページ