2026年10月21日、PHPに深刻度「Critical」の脆弱性が公表されました。
通称「php2shell」。認証なしで任意のコード実行(RCE)につながる可能性がある、極めて危険度の高い脆弱性です。
PHPはWordPress・Laravel・Symfonyなど、多くのWebアプリケーションで使われているため、影響範囲は非常に広いです。
そんな中で悩むことは、
・何をすればいいのか、優先順位が分からない
・すぐにアップデートできないが、放置していいのか不安
ですね。
今回はそんなお悩みを解決する、
・影響を受ける構成とバージョン
・自分の環境を確認する方法(コマンドつき)
・修正バージョンへのアップデート手順
・すぐ更新できない場合の暫定対策
・IPAが示す「修正困難な場合」の判断ステップ
についてIPA・PHP.net・JVNの一次情報をもとに、脆弱性の内容と対策を具体的な手順つきでまとめます。
ゴール
この記事のゴールは、「影響を確認し、修正版にアップデートして、暫定策も押さえた状態」になることです。
| 項目 | 対策前 | 対策後 |
|---|---|---|
| PHPのバージョン | 8.4.26(影響あり) | 8.4.27(修正済み) |
| SAPI構成 | mod_php(最も危険) | PHP-FPM へ移行を検討 |
| 暫定策 | 未設定 | memory_limit / post_max_size を設定 |
| 侵害の兆候 | 未確認 | アクセスログを確認済み |
| 8.1以前の環境 | EOLで放置 | サポート版へ移行計画あり |
・認証不要のリクエストで攻撃が成立し、アプリのコードが動く前に発動します
・mod_php が最も危険。PHP-FPM・php-cgi・FrankenPHP・LiteSpeed も対象です
・修正版は 8.5.12/8.4.27/8.3.36/8.2.35。直ちに更新してください
もくじ
30秒でわかるまとめ
| 項目 | 内容 |
|---|---|
| 名称 | php2shell(PHP2Shell) |
| CVE | CVE-2026-109618/CVE-2026-109619 |
| 深刻度 | Critical(CVSS 4.0 基本値 9.2) |
| 影響 | 認証されていない第三者が任意のコードを実行できる可能性 |
| 公表日 | 2026年10月21日(PHP.net アドバイザリ)/10月22日(IPA注意喚起) |
| 修正版 | 8.5.12/8.4.27/8.3.36/8.2.35 |
| 対象 | Webリクエストを処理するすべてのPHP(mod_php/PHP-FPM/php-cgi/FrankenPHP/LiteSpeed) |
| 対応の結論 | 直ちに修正版へアップデート。難しい場合は暫定策+侵害確認 |
何が起きたのか(時系列)
| 日付 | 出来事 |
|---|---|
| 2026年10月21日 | IPAが「【事前準備のお願い】PHPのセキュリティリリース公開予定について」を公表 |
| 2026年10月21日 | PHP.net がセキュリティアドバイザリを公開(8.5.12/8.4.27/8.3.36/8.2.35) |
| 2026年10月22日 | IPAが「PHPの脆弱性対策について(CVE-2026-109618、CVE-2026-109619:PHP2shell)」を公表 |
| 2026年10月22日 14:20 | JVNがJVNVU#99905564として掲載・更新 |
IPAは「追記すべき情報がある場合には、その都度このページを更新する予定」としており、最新情報の確認が欠かせません。
脆弱性の正体:2つの問題が組み合わさっている
php2shellは、2つの脆弱性の組み合わせです。
| CVE | 種類 | GHSA |
|---|---|---|
| CVE-2026-109618 | メモリ不足(OOM)処理の不整合による RCE | GHSA-w8hw-w9fx-j79w |
| CVE-2026-109619 | 古い内部状態の残存(stale global state)による RCE | GHSA-6wmf-4rv5-p3rp |
① CVE-2026-109618:OOM時の「中途半端な状態」が悪用される
PHPはリクエストを処理するとき、内部のデータを少しずつ初期化します。
メモリ不足(OOM)が起きると、その初期化が途中で中断されることがあります。
ところが後片付けの処理が、中途半端なデータを「正しいデータ」として扱ってしまうことがあります。
| 段階 | 本来の動き | 脆弱な動き |
|---|---|---|
| ① リクエスト受信 | 内部データを初期化 | OOMで初期化が中断 |
| ② クリーンアップ | 初期化済みのデータを解放 | 未初期化データを有効と誤認 |
| ③ 結果 | 正常終了 | 任意コード実行につながる |
② CVE-2026-109619:前のリクエストの状態が残ってしまう
PHP-FPMなどのワーカー(プロセス)は、複数のリクエストを使い回します。
本来はリクエストごとに内部状態がリセットされますが、解放済みメモリの状態が残ってしまうことがあります。
その結果、次のリクエストが古い状態を使ってしまう可能性があります。
| リクエスト | 本来 | 脆弱な状態 |
|---|---|---|
| 1回目 | 処理後に完全リセット | 状態が残る |
| 2回目 | 新規に初期化 | 残った状態を参照 |
なぜ「危険度が高い」のか
| 理由 | 内容 |
|---|---|
| 認証不要 | ログインしていない第三者がリクエストを送るだけで攻撃が成立します |
| アプリのコードより前 | PHP本体の処理段階で発動するため、アプリ側の入力チェックでは防げません |
| mod_phpが最も危険 | 認証なしのリクエストで発動する実証例が示されています |
| 影響範囲が広い | WordPress・Laravel・Symfony など、PHP製アプリ全般が該当します |
影響を受ける構成(SAPI)
| 構成 | リスク | 備考 |
|---|---|---|
| Apache + mod_php | 最も高い | 認証なしのリクエストで発動する実証例あり |
| PHP-FPM | 高い | ワーカーが状態を持ち越す問題(109619)と相性が悪い |
| php-cgi | 高い | — |
| FrankenPHP | 高い | — |
| LiteSpeed | 高い | — |
PHP.netは「Webリクエストを処理するすべてのPHP」が対象と明言しています。
CLIでしか使っていない場合はWeb経由の攻撃は受けませんが、Webサーバと同居している場合は注意が必要です。
影響を受けるバージョン
| 系列 | 影響あり | 修正版 |
|---|---|---|
| PHP 8.5 | 8.5.12 より前 | 8.5.12 |
| PHP 8.4 | 8.4.27 より前 | 8.4.27 |
| PHP 8.3 | 8.3.36 より前 | 8.3.36 |
| PHP 8.2 | 8.2.35 より前 | 8.2.35 |
| PHP 8.1以前 | サポート終了(ただし影響は受ける) | —(下記参照) |
IPAの注意喚起では、調査に関与したWiz社の見解として「PHP 5.4以降のバージョンは、これらの脆弱性のいずれかの影響を少なくとも受ける」と紹介されています。
まず自分の環境を確認する(チェックリスト)
| # | 確認すること | 確認方法 |
|---|---|---|
| 1 | PHPのバージョン | php -v |
| 2 | Webサーバの構成(SAPI) | php -i | grep "Server API" |
| 3 | 設定ファイルの場所 | php --ini |
| 4 | FPMの稼働 | ps aux | grep php-fpm |
| 5 | OSパッケージの状態 | apt list --installed | grep php(Debian系) |
| 6 | Dockerイメージ | docker image ls | grep php |
| 7 | アプリ側の要件 | WordPress・Laravel・Symfony のバージョン |
バージョンとSAPIを確認する
コマンド1つで分かるのでカンタンですね。
# PHPのバージョン
php -v
# SAPI(php-fpm / apache2handler / cgi-fcgi など)
php -i | grep -i "Server API"
# 設定ファイルの場所
php --ini
# 読み込まれているモジュール(Apacheの場合)
apache2ctl -M | grep php
Dockerを使っている場合
# 稼働中コンテナのPHPバージョン
docker exec -it コンテナ名 php -v
# イメージのタグ確認
docker image ls | grep php
# docker-compose の定義確認
grep -n "image:.*php" docker-compose.yml
ディストリビューションのパッケージかソースビルドへ切り替えるよう強く勧められています。
「upgradeしたのに古いまま」という場合は、どのリポジトリから取得しているかを確認してください。
対策①:修正版へアップデートする(最優先)
これが唯一の完全な解決策です。
Debian / Ubuntu 系
sudo apt update
sudo apt upgrade -y
# バージョン確認
php -v
RHEL / Rocky / AlmaLinux 系
sudo dnf update -y
# 特定パッケージのみ更新する場合
sudo dnf update php\* -y
php -v
Docker の場合
# Dockerfile のタグを修正版に変更
# FROM php:8.4.27-fpm ← 8.4.26 などから変更
docker compose build --pull
docker compose up -d
docker exec -it コンテナ名 php -v
ソースからビルドしている場合
PHP.net のダウンロードページから 8.5.12/8.4.27/8.3.36/8.2.35 を取得して再ビルドします。
WordPress・Laravel・Symfony の場合
| 環境 | やること |
|---|---|
| WordPress | PHP本体の更新(レンタルサーバなら管理画面のPHPバージョン切り替え) |
| Laravel | PHP本体を更新し、composer update は不要(フレームワーク側の修正ではないため) |
| Symfony | 同じくPHP本体の更新が対象 |
| レンタルサーバ | 提供元の対応状況を確認し、切り替え可能なら最新版へ |
アプリのコードを直すのではなく、PHP本体(実行環境)を更新するのがポイントです。
対策②:すぐ更新できない場合の暫定策
重要:暫定策は攻撃経路を減らすだけで、安全にはなりません。あくまで更新までの時間稼ぎです。
CVE-2026-109618(OOM)への暫定策
| 設定 | 内容 |
|---|---|
| memory_limit=-1 | アプリが上書きできない形で設定(FPMプールの php_admin_value など) |
| post_max_size を小さく | アップロード不要なら 8M、必要なら 32M |
| upload_max_filesize | post_max_size より小さくする |
| Webサーバ側の制限 | リクエストサイズ・入力フィールド数・マルチパート数・ヘッダ数・ネスト深さ |
| コンテナ/cgroup | メモリ上限で可用性を守る(影響ワーカーだけを終了させる方針が望ましい) |
これらを使うと、かえって脆弱なメモリ確保失敗を誘発するおそれがあります。
また、Content-Length が無いリクエストも制限の対象にしてください。
CVE-2026-109619(状態の残存)への暫定策
| 設定 | 内容 |
|---|---|
| session.upload_progress.enabled=0 | 設定後、すべてのワーカーを再起動 |
| 設定の置き場所 | php.ini/FPMプール/サーバ設定(リクエスト解析より前に効くもの) |
| PHP 8.5 の場合 | fatal_error_backtraces=0 を設定し、全ワーカーを再起動 |
| 診断設定の整理 | リクエストごとに診断を出す無効・非推奨の設定を削除する |
ini_set() や FPMの .user.ini での設定 → リクエスト解析に間に合いません・
error_reporting/display_errors/@ でエラーを隠す → 診断自体は発生するため回避になりません・ワーカーの再起動をしない → 古い状態が残ったままになります
対策③:侵害の兆候を確認する
更新とあわせて、不審なアクセスがなかったかを確認しておきましょう。
| 見るもの | 確認ポイント |
|---|---|
| Webサーバのアクセスログ | 通常と違うパス・異様に大きいリクエスト・大量のエラー |
| PHPのエラーログ | OOM(Allowed memory size exhausted)の多発 |
| FPMのログ | ワーカーの異常終了・再起動の繰り返し |
| 不審なファイル | アップロード先や公開ディレクトリの見覚えのないファイル |
| 不審なプロセス | Webサーバ権限で動く見覚えのないプロセス |
| アウトバウンド通信 | サーバから外部への不自然な通信 |
不審な兆候があった場合は、証拠(ログ)を保存したうえで、IPAや専門機関への相談を検討してください。
PHP 8.1以前を使っている場合
PHP 8.1以前はサポート終了(EOL)のため、PHPプロジェクトからは更新が提供されません。
ただし、今回の事態を受けてPHP 7.4/8.0/8.1 向けに最小限のソースバックポートが提供されています。
| 状況 | 推奨される対応 |
|---|---|
| ソースからビルドしている | バックポートを適用して再ビルド |
| LTSベンダーのサポートがある | ベンダーの修正版を適用 |
| どちらも無い | サポート対象バージョンへ移行(8.2以降) |
IPAが示す「修正が難しい場合」の6ステップ
IPAは、すぐに修正できない組織向けに判断の手順を示しています。
| # | ステップ | 内容 |
|---|---|---|
| 1 | サポート状況を確認 | EOLのバージョンなら、サポート版への更新や対策済みサービスへの移行を検討 |
| 2 | 暫定対策を講じる | 脆弱な状態で放置せず、アクセス制限などを実施 |
| 3 | システムの状況を把握 | そのシステムの役割・代替可否を確認し、必要性を見直す |
| 4 | 組織として実現性を検討 | 人員・予算・保守体制を経営層も含めて検討 |
| 5 | 今後の方針を決める | 移行/機能縮小/公開終了・廃止も選択肢に入れる |
| 6 | 利用者・業務への影響を考慮 | データ移行・代替手段の案内を計画する |
「対策できないから放置」が最も危険です。外部からのアクセス遮断や一時停止も、IPAは選択肢として示しています。
よくある質問(FAQ)
| 質問 | 回答 |
|---|---|
| WordPressを使っています。プラグイン更新で直りますか? | 直りません。PHP本体(サーバ側)の更新が必要です |
| CLIでしかPHPを使いません | Web経由の攻撃は受けませんが、同じサーバでWeb公開している場合は対象です |
| レンタルサーバです | 提供元の対応状況を確認し、PHPバージョンの切り替えができれば最新へ |
| アップデートでサイトが壊れませんか? | マイナー更新ですが、事前にステージングで確認し、バックアップを取ってから実施してください |
| 暫定策だけでも大丈夫ですか? | 不十分です。攻撃経路を減らすだけで、安全にはなりません |
| WAFで防げますか? | 補助にはなりますが、PHP本体の処理段階で発動するため根本対策になりません |
用語集
| 用語 | 意味 |
|---|---|
| RCE | Remote Code Execution。遠隔から任意のコードを実行される脆弱性 |
| SAPI | Server API。PHPがWebサーバとやり取りする方式(mod_php/FPM/CGIなど) |
| PHP-FPM | FastCGIでPHPを動かす仕組み。ワーカー(プロセス)を使い回す |
| mod_php | ApacheのモジュールとしてPHPを組み込む方式 |
| OOM | Out Of Memory。メモリ不足で処理が中断されること |
| CVSS | 脆弱性の深刻度を表す共通指標。9.0以上が「Critical」 |
| GHSA | GitHub Security Advisory の識別子 |
PHP本体の処理で発動するので、アプリ側では防げません。まずは php -v で自分のバージョンを確認するところから始めましょう。
さいごに
今回は、PHPの脆弱性「php2shell」の内容と対策をまとめました。
・影響を受ける構成とバージョン
・自分の環境を確認する方法(コマンドつき)
・修正バージョンへのアップデート手順
・すぐ更新できない場合の暫定対策
・IPAが示す「修正困難な場合」の判断ステップ
php -v でバージョンを確認する(8.5.12/8.4.27/8.3.36/8.2.35が修正版)2. mod_php は特に危険。SAPIの構成も確認する
3. 直ちに修正版へアップデートする(これが唯一の完全な解決策)
4. すぐ無理なら暫定策+アクセス制限+侵害確認を行う
5. 8.1以前はバックポート適用かサポート版へ移行する
6. IPA・PHP.netの最新情報を継続して確認する
脆弱性対応は「知ったときが一番早い」と言われます。
まずは php -v でのバージョン確認から、ぜひ試してみてください。
当てはまる場合は今日中にアップデートを済ませましょう。


コメントを残す