セキュリティ勧告 · 2026年10月21日公開
PHP リモートコード実行の脆弱性php2shell チェック
CVE-2026-109618 と CVE-2026-109619 は、認証なしで PHP の Web サーバー上でコードを実行できる脆弱性です。サイトのアドレスで影響を確認し、環境に合った対策をすぐに見つけられます。
- CVSS v4.0
- 9.2 Critical(早急な対応が必要)
- 攻撃条件
- リモート · 認証不要
2026年10月22日 時点の公開情報に基づく
チェック結果
サーバーで正確に確認する
レスポンスヘッダーでわかるのは一部だけです。サーバー内のすべての PHP のバージョンと設定を確認するには、点検スクリプトを実行してください。スクリプトは読み取りのみで、設定の変更や外部との通信は行いません。
- root 権限で実行してください。
WEB_ROOTには実際の Web ルートのパスを指定してください。- 例:
/var/www/html
- 例:
- 以下のコマンドでは、結果が日本語で表示されます。
WEB_ROOT=/var/www/html
sudo bash php2shell-check.sh --lang ja "$WEB_ROOT"- コンテナの場合は、コンテナの中で実行してください。Alpine など bash がない環境では、bash パッケージをインストールするか(apk add bash)、インストールせずに php -v の出力を下の貼り付け欄に入れて判定してください。
docker cp php2shell-check.sh <container>:/tmp/
docker exec -it <container> bash /tmp/php2shell-check.sh --lang ja- 管理者権限の PowerShell で実行してください。IIS サイトのパスは自動で確認します。
- 以下のコマンドでは、結果が日本語で表示されます。
powershell -NoProfile -ExecutionPolicy Bypass -File .\php2shell-check.ps1 -Lang ja- PHP をインストールしたアカウントから
sudoで実行してください。Homebrew・MAMP など、そのアカウントにインストールされた PHP は root ではなくそのアカウントの権限で実行して点検します。 WEB_ROOTには実際の Web ルートのパスを指定してください。- 標準の Apache:
/Library/WebServer/Documents - Homebrew:
$(brew --prefix)/var/www - MAMP:
/Applications/MAMP/htdocs
- 標準の Apache:
- 以下のコマンドでは、結果が日本語で表示されます。
WEB_ROOT=/Library/WebServer/Documents
sudo bash php2shell-check.sh --lang ja "$WEB_ROOT"- Homebrew、MacPorts、MAMP、XAMPP、Laravel Herd でインストールした PHP は自動で見つけます。結果に出ない PHP があれば
--phpでパスを指定してください。
sudo bash php2shell-check.sh --lang ja --php /path/to/phpスクリプト結果の読み方
- 脆弱
- 修正版より古いバージョンです。更新が必要です。
- サポート終了
- 公式サポートが終了したブランチです。新しいバージョンへ移行してください。
- 要確認
- 自動で判定できません。表示された理由を見て確認してください。
- 修正済み
- 修正版以降のバージョンです。
終了コード:0 すべて修正済み、1 脆弱・要確認・設定読み取り失敗、2 PHP なし、3 サポート終了のみ
影響を受けるバージョンと修正バージョン
以下の範囲に該当する PHP は更新が必要です。Web リクエストを処理するすべての PHP(PHP-FPM、Apache mod_php、CGI/FastCGI)が対象です。
| PHP バージョン | 脆弱なバージョン | 修正バージョン |
|---|---|---|
| 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 以前 | すべて | 修正リリースなし(サポート終了) |
- PHP 8.6.0 は RC4 から修正が含まれています。開発版のため、本番環境では使わないでください。
- PHP 8.2 は 2026年12月31日にサポートが終了します。8.2.35 に更新する場合も、上位バージョンへの移行を早めに計画してください。
ディストリビューションのバックポートに注意
- Ubuntu、Debian、RHEL 系のディストリビューションや cPanel、マネージドホスティングでは、バージョン番号を変えずにセキュリティ修正だけを適用(バックポート)することがあります。たとえば Ubuntu 24.04 の PHP は
8.3.6と表示されますが、修正が適用されている場合があります。 - そのため、上の表のバージョン番号だけで判断すると誤ることがあります。最終確認は パッケージのリビジョンとディストリビューションのセキュリティ情報(Ubuntu USN、Debian DSA、Red Hat RHSA)で行ってください。
- パッケージの変更履歴から CVE 番号を探すコマンドは、下の対応ガイドの「1. 確認」タブにあります。サーバー点検スクリプトも、バックポートの痕跡を見つけると参考メモを表示します。
対応ガイド
段階とサーバー環境を選ぶと、必要なコマンドと設定だけを表示します。
レスポンスヘッダーでわかるのは一部だけです。バージョンを隠しているサーバー、社内ネットワークのサーバー、複数の PHP が入ったサーバーは、サーバー上で直接確認する必要があります。
Cloudbric サーバー点検スクリプト
インストールされたすべての PHP(PHP-FPM、CGI、CLI、Apache mod_php)を探し、バージョン、関連する設定、設定の上書き、更新後に再起動されていないプロセスまで確認します。読み取り専用で、外部とは通信しません。サイトチェックを実行すると結果画面からダウンロードできます。
コマンドで直接確認
例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
php -v
php-fpm8.3 -v # FPM binary name differs per version
dpkg -l | grep -E '^ii\s+(php|libapache2-mod-php)'
apt changelog php8.3-common | grep -iE 'CVE-2026-10961[89]'例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
php -v
php-fpm -v
rpm -qa 'php*'
rpm -q --changelog php-common | grep -iE 'CVE-2026-10961[89]'例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
/opt/cpanel/ea-php83/root/usr/bin/php -v
rpm -qa 'ea-php*' | sort例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
docker exec <container> php -v
docker image ls --format '{{.Repository}}:{{.Tag}}' | grep php例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
php -v
php --ini
Get-ChildItem C:\ -Recurse -Filter php-cgi.exe -ErrorAction SilentlyContinue | Select-Object FullName例は PHP 8.3 を前提としています。バージョン番号はサーバーに合わせて変更してください。CLI と Web(PHP-FPM、mod_php)では設定が異なる場合があります。
php -v
"$(brew --prefix php)/sbin/php-fpm" -v # versioned formula: brew --prefix php@8.3
brew list --versions | grep -E "^php(@| )"
brew services list | grep php共用ホスティングやマネージドサービスでは、PHP や設定を直接変更できない場合が多くあります。修正バージョン(8.5.12、8.4.27、8.3.36、8.2.35 以降、またはバックポート)の適用状況と予定をホスティング事業者に問い合わせてください。
完了の目安
チェック状態は保存されません。
完全な対策は更新のみです。 修正バージョン以降に更新し、すべてのワーカーを再起動して初めて反映されます。
変更前に設定ファイルをバックアップし(仮想サーバーならスナップショット)、可能であればテストサーバーで先に適用してください。再起動は利用者の少ない時間帯に行ってください。
sudo apt update
sudo apt install --only-upgrade 'php*'
# restart every worker (required)
sudo systemctl restart apache2 # mod_php
sudo systemctl restart php8.3-fpm # each FPM version in use
php -vsudo dnf upgrade 'php*'
# Remi multi-version: sudo dnf upgrade 'php83-php*'
# restart every worker (required)
sudo systemctl restart php-fpm httpd
php -v# WHM > Software > EasyApache 4, or:
sudo dnf upgrade 'ea-php*' # CentOS 7: yum
# restart PHP-FPM and Apache (required)
sudo /scripts/restartsrv_apache_php_fpm
sudo /scripts/restartsrv_httpd# Dockerfile: use a fixed tag at or above the fixed version
# FROM php:8.3.36-fpm
docker build --pull -t my-app:patched .
docker compose up -d --force-recreate
docker exec <container> php -v# 1. Download the fixed build from https://windows.php.net/download/
# (same thread safety and architecture as the current one)
# 2. Replace the PHP folder, keep your php.ini
iisreset # IIS
Restart-Service Apache2.4 # Apache (XAMPP: restart from the control panel)
php -vbrew update
brew upgrade php # versioned formula: brew upgrade php@8.3
# restart every worker (required)
brew services restart php # php@8.3: brew services restart php@8.3
brew services restart httpd # Homebrew Apache (built-in Apache: sudo apachectl -k restart)
php -v
# MAMP / XAMPP: update the app, then restart its servers共用ホスティングやマネージドサービスでは、PHP や設定を直接変更できない場合が多くあります。修正バージョン(8.5.12、8.4.27、8.3.36、8.2.35 以降、またはバックポート)の適用状況と予定をホスティング事業者に問い合わせてください。
8.1 以前には公式の修正版がありません。ディストリビューションや LTS ベンダーのバックポートパッケージを使うか、8.2 以降へ移行してください。ブランチが変わるアップグレードでは、フレームワーク、CMS のプラグイン、拡張モジュールの互換性を先に確認してください。
完了の目安
チェック状態は保存されません。
更新までの間に影響を減らす 部分的な対策 です。PHP 公式の発表は、これらの設定だけでは安全にならないとしています。
PHP の設定ファイル
; /etc/php/8.3/fpm/conf.d/99-php2shell.ini
; /etc/php/8.3/apache2/conf.d/99-php2shell.ini
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP-FPM のプール設定(値を固定)
プール設定では必ず php_admin_value/php_admin_flag の形式を使ってください。php.ini の形式のまま書くと PHP-FPM が起動しなくなります。fatal_error_backtraces の行は PHP 8.5 でのみ追加してください。
; /etc/php/8.3/fpm/pool.d/www.conf
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_flag[session.upload_progress.enabled] = off
; PHP 8.5 のみ
php_admin_flag[fatal_error_backtraces] = off再起動前の構文チェック
sudo php-fpm8.3 -t && sudo apachectl configtestPHP の設定ファイル
; /etc/php.d/99-php2shell.ini
; /etc/opt/remi/php83/php.d/99-php2shell.ini
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP-FPM のプール設定(値を固定)
プール設定では必ず php_admin_value/php_admin_flag の形式を使ってください。php.ini の形式のまま書くと PHP-FPM が起動しなくなります。fatal_error_backtraces の行は PHP 8.5 でのみ追加してください。
; /etc/php-fpm.d/www.conf
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_flag[session.upload_progress.enabled] = off
; PHP 8.5 のみ
php_admin_flag[fatal_error_backtraces] = off再起動前の構文チェック
sudo php-fpm -t && sudo apachectl configtestPHP の設定ファイル
; /opt/cpanel/ea-php83/root/etc/php.d/99-php2shell.ini
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP-FPM のプール設定(値を固定)
プール設定では必ず php_admin_value/php_admin_flag の形式を使ってください。php.ini の形式のまま書くと PHP-FPM が起動しなくなります。fatal_error_backtraces の行は PHP 8.5 でのみ追加してください。
WHM > MultiPHP Manager > PHP-FPM settings
PHP の設定ファイル
; /usr/local/etc/php/conf.d/99-php2shell.ini
; COPY 99-php2shell.ini /usr/local/etc/php/conf.d/
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP-FPM のプール設定(値を固定)
プール設定では必ず php_admin_value/php_admin_flag の形式を使ってください。php.ini の形式のまま書くと PHP-FPM が起動しなくなります。fatal_error_backtraces の行は PHP 8.5 でのみ追加してください。
; /usr/local/etc/php-fpm.d/zz-php2shell.conf
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_flag[session.upload_progress.enabled] = off
; PHP 8.5 のみ
php_admin_flag[fatal_error_backtraces] = off再起動前の構文チェック
docker exec <container> php-fpm -tPHP の設定ファイル
; php.ini shown by: php --ini
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP の設定ファイル
; /opt/homebrew/etc/php/8.3/conf.d/99-php2shell.ini
; /usr/local/etc/php/8.3/conf.d/99-php2shell.ini (Intel Mac)
; CVE-2026-109618: アプリケーションが変更できないように固定
memory_limit = -1
post_max_size = 8M ; ファイルアップロードが必要な場合は 32M
; upload_max_filesize は post_max_size より小さく
; CVE-2026-109619
session.upload_progress.enabled = 0
; PHP 8.5 のみ
fatal_error_backtraces = 0PHP-FPM のプール設定(値を固定)
プール設定では必ず php_admin_value/php_admin_flag の形式を使ってください。php.ini の形式のまま書くと PHP-FPM が起動しなくなります。fatal_error_backtraces の行は PHP 8.5 でのみ追加してください。
; /opt/homebrew/etc/php/8.3/php-fpm.d/www.conf
php_admin_value[memory_limit] = -1
php_admin_value[post_max_size] = 8M
php_admin_flag[session.upload_progress.enabled] = off
; PHP 8.5 のみ
php_admin_flag[fatal_error_backtraces] = off再起動前の構文チェック
"$(brew --prefix php)/sbin/php-fpm" -t共用ホスティングやマネージドサービスでは、PHP や設定を直接変更できない場合が多くあります。修正バージョン(8.5.12、8.4.27、8.3.36、8.2.35 以降、またはバックポート)の適用状況と予定をホスティング事業者に問い合わせてください。
- 設定は すべてのワーカーを再起動 して初めて反映されます。
.htaccess、.user.ini、アプリケーションのini_set()が値を戻していないか確認してください。- Apache の
RLimitMEMなどRLIMIT_AS/RLIMIT_DATAによるメモリ制限は使わないでください。脆弱な経路を引き起こすおそれがあります。 memory_limit = -1はメモリ上限をなくします。コンテナや cgroup のメモリ制限、FPM ワーカー数の調整とあわせて行ってください。- アップロードサイズを下げると大きなファイルのアップロードが失敗することがあり、
session.upload_progressを無効にするとアップロード進捗表示だけが動かなくなります。
さらにリスクを減らす
- Web サーバーや WAF でリクエストサイズを制限し、不要であれば multipart リクエストを遮断してください。
max_input_nesting_level、max_input_vars、max_file_uploadsなどの入力上限を下げてください。- 性能に余裕があれば、PHP-FPM の
pm.max_requests = 1でリクエストごとにワーカーを新しく起動してください。 - 管理画面や社内向けの PHP アプリは、VPN または IP 許可リストの内側に移してください。
完了の目安
チェック状態は保存されません。
レスポンスヘッダーやエラー画面に PHP/8.3.6 のようなバージョンが表示されると、攻撃者は脆弱なサーバーを簡単に見つけられます。バージョンを隠してもパッチの代わりにはなりませんが、標的になる可能性を下げられます。
Apache
# Ubuntu/Debian: /etc/apache2/conf-available/security.conf
# RHEL 系: /etc/httpd/conf.d/ の下に新しい .conf ファイル
# Server ヘッダーのバージョン・OS を隠す
ServerTokens Prod
# エラーページ下部のサーバー情報を削除
ServerSignature Off
# mod_headers が必要(a2enmod headers)
Header always unset X-Powered-ByNginx
# http または server ブロック
server_tokens off;
fastcgi_hide_header X-Powered-By;
proxy_hide_header X-Powered-By;PHP
expose_php = Off ; X-Powered-By: PHP/x.y.z を削除
display_errors = Off ; エラーメッセージにパスやコードを出さない
log_errors = On ; エラーは画面ではなくログへ- バージョンを隠すと、このページの結果は「バージョン非公開」になります。以降の確認はサーバー点検スクリプトで行ってください。
Server: nginxのように製品名が残るのは正常です。バージョンだけが消えたかをcurl -I https://自分のサイト/で確認してください。- 本番サーバーに
phpinfo()のページを置かないでください。バージョンとすべての設定が公開されます。
Web ルートで phpinfo() の呼び出しを探す
sudo grep -rlE --include='*.php' 'phpinfo[[:space:]]*\(' /var/www完了の目安
チェック状態は保存されません。
更新が終わるまでは攻撃の試みを監視してください。ログに痕跡がなくても安全とは限りません(公式の推奨)。
- 異常に大きな POST・multipart リクエスト、特に
PHP_SESSION_UPLOAD_PROGRESSフィールドを含むリクエスト - PHP ワーカーの繰り返される異常終了(segfault)とメモリ不足(
Allowed memory size ... exhausted)エラー - Web ルートに新しく作られた PHP ファイル、予期しない cron ジョブ、Web サーバーのアカウントによる外部への接続
ログで探す
# PHP-FPM worker crashes and out-of-memory errors
sudo grep -iE 'SIGSEGV|segfault' /var/log/php*-fpm.log
sudo journalctl -k | grep -i segfault
sudo grep -rh 'Allowed memory size' /var/log/apache2/ /var/log/nginx/ 2>/dev/null | tail
# PHP files created in the web root in the last 14 days
sudo find /var/www -name '*.php' -mtime -14 -ls完了の目安
チェック状態は保存されません。
脆弱性の概要
PHP プロジェクトは 2026年10月21日に 2件の脆弱性を公開し、セキュリティアップデートを配布しました。2件をあわせて php2shell と呼びます。
CVE-2026-109618メモリ不足処理中の状態破損- リクエストデータの初期化途中でメモリ不足(OOM)処理が PHP を中断すると、リクエストの後処理が不完全なデータを正常なデータとして扱い、リモートコード実行につながる可能性があります。
CVE-2026-109619ワーカーに残ったグローバル状態の再利用- リクエストが使っていた内部状態がメモリ解放後も残り、同じワーカーが処理する次のリクエストがそれを使います(use-after-free)。
session.upload_progress機能が関連する経路です。
影響範囲
- PHP-FPM、Apache mod_php、CGI/FastCGI など Web リクエストを処理するすべての PHP
- アプリケーションのコードが実行される前の段階で成立するため、ログイン機能のないサイトも対象
- PHP を内蔵したネットワーク機器、アプライアンス、管理コンソール(メーカーのパッチが必要)
- CLI 専用の PHP は Web 経由では露出しませんが、あわせて更新を推奨
更新までの空白期間を Cloudbric WAF+ で埋めましょう
稼働中のサービスはすぐに更新できないことが少なくありません。Cloudbric WAF+ は php2shell(CVE-2026-109618、CVE-2026-109619)の攻撃の試みを検知・遮断するセキュリティルールを適用しており、更新を準備する間の Web サービスの露出を減らせます。
WAF はパッチの代わりにはなりません。オリジンサーバーに直接アクセスできる場合は保護されないため、オリジンへのアクセス制限と更新をあわせて進めてください。
よくある質問
「バージョン非公開」は安全という意味ですか?
いいえ。レスポンスヘッダーに PHP バージョンが表示されていないという意味です。バージョンを隠しているサーバーも脆弱な可能性があるため、サーバー点検スクリプトで確認してください。
インターネットで公開されている攻撃コード(PoC)で確認してもよいですか?
推奨しません。PHP 公式の発表とセキュリティアドバイザリーには攻撃コードは含まれていません。「php2shell PoC」として出回っているコードは出所の確認が難しく、マルウェアが含まれている可能性があるため、本番サーバーや業務用 PC で実行しないでください。影響の有無は、このページのような非侵入型のチェックで確認してください。
phpinfo の公開確認では何をしますか?
チェックフォームでこのオプションを有効にすると、レスポンスヘッダーの確認に加えて、Web ルートの既知の phpinfo パス(/phpinfo.php, /info.php, /test.php, /i.php, /php_info.php)に順番に GET リクエストを送ります。phpinfo ページが見つかれば、ヘッダーでバージョンを隠しているサーバーでも、実際の PHP バージョンと Web に適用されている設定を確認できます。phpinfo ページの公開自体が情報漏えいにあたるため、見つかった場合は削除を推奨します。公開されていないパスを要求するため、サイトのセキュリティ機器やログにパス探索として記録される場合があります。自身が管理するサイトでのみ有効にしてください。
ディストリビューションのパッケージのバージョンが修正版より古く表示されます。
Ubuntu、Debian、RHEL 系では、バージョン番号を変えずにセキュリティ修正だけを適用(バックポート)することがあります。ディストリビューションのセキュリティ情報で、この CVE が修正されたパッケージのバージョンを確認してください。スクリプトは点検した PHP ごとに、その PHP が属するパッケージの変更履歴から CVE 番号を探して参考メモを表示し、パッケージでインストールされていない PHP にはディストリビューションのバックポートが適用されないことを知らせます。
スクリプトで CLI だけが脆弱と表示されます。
CLI は Web リクエストを処理しないため、Web 経由で露出する経路ではありません。それでも、同じサーバーの PHP はまとめて更新するほうが安全です。
社内ネットワークのサーバーやコンテナはどう確認しますか?
外部から接続できないアドレスでも、チェック後の結果画面からスクリプトをダウンロードできます。コンテナの場合は、コンテナの中でスクリプトを実行してください。
どのような情報が保存されますか?
入力したアドレス、対象サーバーの応答情報(IP、ステータスコード、ヘッダー)、判定結果、ページの言語、アクセス元の国、スクリプトのダウンロードとお問い合わせのクリック有無を、内部統計のため1年間保管します。チェックを依頼した方の IP アドレスとブラウザー情報は、チェック記録には保存しません。Web サーバーのアクセスログには IP アドレスとブラウザー情報が90日間残りますが、結果リンクや記録番号は残らないため、チェック記録とは結び付きません。お問い合わせを押すと、判定の種類(例:脆弱)のみが Cloudbric のウェブサイトに渡されます。このページは Cookie を使用しません。 phpinfo の確認を有効にした場合は、見つかったパス、PHP バージョン、実行方式、関連する設定値もあわせて保管し、ページの内容は保存しません。
チェックのリクエストはどこから送られますか?
チェックのリクエストは User-Agent「Cloudbric-php2shell-check/1.0 (+https://php2shell.cloudbric.com)」で送信します。HEAD リクエストを1回だけ送り、拒否された場合は GET リクエストを1回送ります。レスポンス本文は読み取りません。 phpinfo の確認を有効にすると、既知のパス 5か所に GET リクエストを追加で送り、レスポンスは先頭の 512KB までしか読みません。