php2shell (CVE-2026-109618 / 109619) can't be assessed with php -v: where version numbers diverge across FPM, Docker and distros
CLI vs. FPM versions, Docker tags, distro backports, and what to check on shared hosting

This page was translated by AI from the Japanese original. If anything differs, the Japanese version is authoritative: 日本語
If the PHP that handles web requests (PHP-FPM, Apache's mod_php, php-cgi, FrankenPHP, LiteSpeed) is older than 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12, it is affected by CVE-2026-109618 and CVE-2026-109619, known as php2shell. The fix is to upgrade to one of these versions (or, for distro packages, to the fixed package) and restart the processes. What you need to check is not your local php -v, but “the PHP actually serving the web” and “the installed package version.”
This article focuses on four places where judging by the version number alone leads to the wrong conclusion. All figures and status information are as of 2026-10-22, and sources for each item are listed at the end.
What is known as of 2026-10-22
| Item | Details |
|---|---|
| CVE | CVE-2026-109618 (GHSA-w8hw-w9fx-j79w) / CVE-2026-109619 (GHSA-6wmf-4rv5-p3rp) |
| Severity | Both rated CVSS v4.0 9.2 (Critical) in the PHP advisory |
| Fixed versions | 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 (released 2026-10-21) |
| Affected versions | Versions before the fixed versions above (per the GitHub advisories) |
| Scope | Any PHP that handles web requests. The advisory names PHP-FPM, mod_php, php-cgi, FrankenPHP and LiteSpeed, with mod_php described as the highest risk. In the GitHub advisories, exploitation has been demonstrated for mod_php, while FPM and FrankenPHP are listed as “not demonstrated” or “conditional.” Not demonstrated does not mean safe, so upgrade to a fixed version whichever way you run PHP |
| 8.1 and earlier | No updates from the PHP project. Minimal source backports have been published for 7.4 / 8.0 / 8.1, and some distros and LTS vendors may ship fixes |
| 8.2 | End of support on 2026-12-31 (per the 8.2.35 release notes) |
The PHP advisory states that “the only complete fix is to update.” Mitigations for the period before you can update are covered later in this article.
Pitfall 1: php -v and the web-facing PHP may be different
php -v typed over SSH reports the version of the CLI PHP. Web requests are handled by PHP-FPM processes or by mod_php loaded into Apache, which are separate binaries and separate packages. If you installed a newer PHP only for the CLI, run several versions side by side, or have an FPM pool pointing to a different version, the web side can remain old even when php -v shows a fixed version.
There are several ways to see the real version on the web side.
# FPM on Debian / Ubuntu (named per version)
php-fpm8.3 -v
# FPM on RHEL-family systems
php-fpm -v
# Check whether mod_php is loaded in Apache
apachectl -M | grep -i php
The most reliable method is to have the PHP that actually runs via the web report its own version. Place a temporary file with a hard-to-guess name, and delete it as soon as you have checked.
<?php echo PHP_VERSION, ' ', PHP_SAPI;
If PHP_SAPI is fpm-fcgi, PHP is running under FPM; apache2handler means mod_php; cgi-fcgi means CGI. Avoid leaving phpinfo() exposed, as that in itself leaks information.
Restarting is another step that is easy to miss. Even after the package is replaced, php-fpm or Apache processes that are already running may keep running the old code. Some setups restart automatically on package updates; others do not. After updating, restart FPM / Apache and check the web-side version again using the methods above.
Pitfall 2: With Docker, you can't judge by the tag name
The official php image has “moving tags” such as 8.3 and 8.3-fpm, whose contents get replaced, and pinned tags such as 8.3.30, which fix the version.
- Even after a moving tag is switched to a fixed version on Docker Hub, your local copy remains the old image until you pull again. Running containers also keep using the old image until they are recreated. A
DockerfilewithFROM php:8.3-fpmwill still build on the old base if it remains in the build cache. - A pinned tag stays old forever until you bump the number yourself.
You can check whether fixed-version tags have been published using the Docker Hub API.
curl -s "https://hub.docker.com/v2/repositories/library/php/tags?name=8.3.36&page_size=100"
Here are the results of querying four release lines on 2026-10-22 (times in UTC).
| Fixed version | Tags found | When Debian-based tags (-fpm, -apache, etc.) appeared | Alpine-based tags |
|---|---|---|---|
| 8.5.12 | 54 (including RC1) | 2026-10-21 18:59–22:13 | 2026-10-21 22:12–10-22 01:05 |
| 8.4.27 | 54 (including RC1) | 2026-10-21 22:09–22:11 | 2026-10-21 22:09–10-22 03:58 |
| 8.3.36 | 27 | 2026-10-21 22:04–22:06 | 2026-10-21 22:04–10-22 03:56 |
| 8.2.35 | 27 | 2026-10-21 21:59–22:01 | 2026-10-21 22:00–10-22 00:58 |
Checking this turned up three points where judging by numbers can mislead you.
- “Recently updated” does not mean “fixed.” The pinned tag
8.3.35was rebuilt during 2026-10-21, but thePHP_VERSIONinside was still 8.3.35. Look at the version inside, not the update timestamp. - Different digests can have the same contents.
8.3and8.3.36had different tag digests (the value of the multi-architecture index), but the amd64 image was identical and both hadPHP_VERSION=8.3.36. Likewise, for8.3-fpm/8.3.36-fpm,8.4-apache/8.4.27-apache,latest/8.5.12,8.5-fpmand8.2-fpm, thePHP_VERSIONof the amd64 image was a fixed version. - There are no fixed official images for 8.1 and earlier.
8.1-fpmwas last updated on 2025-12-31.
To check your local images and running containers:
# PHP version of a locally pulled image
docker image inspect php:8.3-fpm --format '{{range .Config.Env}}{{println .}}{{end}}' | grep PHP_VERSION
# Pull again and recreate the containers
docker compose pull
docker compose up -d
# If you build your own image, re-pull the base and then build
docker compose build --pull
# Version inside a running container
docker compose exec app php -r 'echo PHP_VERSION, PHP_EOL;'
Replace app in the last command with your own service name. Each official image is built with a single PHP_VERSION, so the CLI version inside a container matches that container's FPM / Apache version (Pitfall 1 applies when PHP is installed directly on the host).
FrankenPHP embeds PHP, so the FrankenPHP version and the embedded PHP version are different numbers. The release notes for FrankenPHP 1.13.2, released on 2026-10-21, state that the Docker images were built with PHP 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 and the static binaries with PHP 8.5.12.
Pitfall 3: Distro packages are “fixed with old numbers”
Ubuntu and RHEL port only the fixes to older versions (backporting). The number shown by php -v stays old, so a numeric check such as “lower than 8.3.36, therefore vulnerable” will flag a fixed system as vulnerable. Conversely, you cannot rely on the number for reassurance either. Make the call based on the package version and each distro's security tracker.
Fixed packages listed in each tracker as of 2026-10-22 (the same for both CVEs):
| Distro | Package | Fixed version | Source |
|---|---|---|---|
| Ubuntu 22.04 (jammy) | php8.1 | 8.1.2-1ubuntu2.28 | USN-8948-1 |
| Ubuntu 24.04 (noble) | php8.3 | 8.3.6-0ubuntu0.24.04.13 | USN-8948-1 |
| Ubuntu 26.04 (resolute) | php8.5 | 8.5.4-0ubuntu1.5 | USN-8948-1 |
| Ubuntu (stonking) | php8.5 | 8.5.9-0ubuntu2.1 | USN-8948-1 |
| Ubuntu 14.04 / 16.04 / 18.04 / 20.04 | php5 / php7.0 / php7.2 / php7.4 | Available through Ubuntu Pro (including Legacy Support) | USN-8948-2 |
| Debian 12 (bookworm) | php8.2 | 8.2.35-1~deb12u1 | DLA-4848-1 |
| Debian 13 (trixie) | php8.4 | 8.4.27-1~deb13u1 | DSA-6574-1 |
| RHEL 10 | php / php8.4 | 8.3.36-1.el10_2 / 8.4.27-1.el10_2 | Red Hat |
| RHEL 9 | php (default) | 8.0.30-8.el9_8.1 | Red Hat |
| RHEL 9 | php module 8.2 / 8.3 | 8.2.35-1.module+el9.8.0… / 8.3.36-1.module+el9.8.0… | Red Hat |
| RHEL 8 | php module 7.4 / 8.2 | 7.4.33-8.module+el8.10.0… / 8.2.35-1.module+el8.10.0… | Red Hat |
This table shows directly why numbers alone are not enough. Ubuntu 24.04's fixed PHP is a version starting with 8.3.6, far lower than upstream's 8.3.36. RHEL 9's default PHP is fixed while remaining at 8.0.30, even though upstream no longer issues fixes for 8.0. Debian has moved to the same numbers as upstream (8.2.35 / 8.4.27).
Some packages are not fixed yet (as of 2026-10-22).
- The RHEL 9 php module 8.4 is listed as “affected, no fix.”
- Debian forky (testing) has php8.4 8.4.26-1, marked “vulnerable.” The php8.4 in sid (unstable) is 8.4.27-1 and fixed.
Example commands to check your own server:
# Debian / Ubuntu: installed version and available version
apt-cache policy php8.3-fpm libapache2-mod-php8.3
# Ubuntu: whether this CVE is fixed on this server
pro fix CVE-2026-109618
pro fix CVE-2026-109619
# RHEL family: whether an update fixing this CVE exists, and the installed version
dnf updateinfo list --cve CVE-2026-109618
rpm -q php-fpm php-cli
Adjust the package name (php8.3-fpm, etc.) to your environment. Compare the version shown with the “fixed version” in the table above or in the tracker; if it is the same or higher, the fix is in. Then complete the restart and web-side check described in Pitfall 1.
If you install PHP from a third-party repository rather than the distro's own packages, you need to follow that repository's updates. The PHP advisory notes that the volunteer-run rpms.remirepo.net would not have updates on the day of disclosure, and recommends switching to distro packages or your own builds.
Pitfall 4: On shared hosting and managed environments, you can't upgrade PHP yourself
On shared hosting and managed PHP environments, the provider replaces the PHP runtime. Here too, the number alone is not enough: if the provider builds PHP itself or backports fixes, the version number may stay old.
There are three things you can do yourself.
- Check the web-side version. Use the temporary file from Pitfall 1 to print
PHP_VERSIONandPHP_SAPI, then delete it right away. If the control panel has a PHP version selector, also note which version you have selected. - Read the provider's notice, and ask if there is none. Ask: “For which PHP versions on my plan will the fixes for CVE-2026-109618 and CVE-2026-109619 be applied, and when (or have they been applied)?” Asking by CVE number rather than version number gets you an answer that covers backports as well.
- If you have selected an unsupported version, upgrade. The PHP project issues no fixes for 8.1 and earlier, and support for 8.2 ends on 2026-12-31. Unless the provider has backported the fixes, switching versions is the reliable path.
Status by hosting provider (as of 2026-10-22)
On shared hosting, the provider normally updates the PHP runtime, and many providers' notices say that “no action is required from users.” Users have two things to do: check the official notice from their provider, and, if they have selected an old PHP version in the control panel, decide whether to switch to the version the notice recommends (one with a fixed release).
The table below summarizes only what is written on each provider's official pages (announcements and maintenance information), paraphrasing the wording of their notices. Notices are updated as things progress, so always confirm the actual status on the official page cited.
| Provider / service | Key points of the official notice | Notice date/time | Source |
|---|---|---|---|
| エックスサーバー | “For PHP 8.2–8.5, application of the fix patch to all affected servers has been completed.” For older versions, the notice says “fix patches are ready for some versions and will be applied in sequence as verification is completed,” and that other old versions are also being worked on | As stated at 10/22 6:45 (the page was updated through 13:15) | メンテナンスの進捗状況 |
| シン・レンタルサーバー | The announcements page carries the same “maintenance progress” as Xserver, but I could not find any statement specifically addressing the PHP status of Shin Rental Server (check with support) | - | お知らせ |
| ConoHa WING | “We are applying security patches while keeping the PHP version you currently use.” The notice says users generally do not need to change versions, but a change may be needed for PHP 5.x and 7.x. The file manager and webmail are temporarily suspended as a precaution; website display and email sending/receiving continue as normal | 10/22 | 【重要】PHPの脆弱性への弊社対応について |
| さくらのレンタルサーバ | “We have completed our response to the vulnerability for all PHP versions selectable from our control panel.” States that “there is no urgent action required from customers,” and recommends moving to the latest supported version going forward. The notice says webmail was addressed at 10/22 13:45 and phpMyAdmin is still being worked on | 10/22 (updated 13:45) | PHPの脆弱性(CVE-2026-109618、CVE-2026-109619)への対応状況について |
| ロリポップ! | A notice of precautionary maintenance ahead of the release of the fixed versions (service site, user pages, etc. to be suspended in turn; sites may be suspended or restricted without prior notice). As of 10/22, I could not find a notice announcing completion of the PHP fix (check with support) | 10/21 | 【重要】PHPの脆弱性への予防措置に伴うメンテナンス実施のお知らせ |
| ヘテムル | “For PHP 8.x and PHP 7.4, we have applied the official fixed versions”; for other versions, “we have made our own fixes based on the official fix.” Because “some functionality (session.upload_progress) has been disabled in all versions,” users are asked to check that their sites work. Since old versions may receive no further fixes, the notice recommends switching to a newer version | Posted 10/21 19:44; updated 10/22 12:18 and 13:20 | 【一部完了】【重要】PHPの脆弱性への予防措置に伴うメンテナンス実施のお知らせ |
| mixhost | “Application of the PHP fix packages was completed at approximately 10:18 on October 22, 2026.” “Applied without changing the PHP version number”; “no action is required from customers.” The notice recommends that users on versions below PHP 8.2 use a supported version (8.2 or later) | 10/22 | 【完了】PHPの重大な脆弱性への対応について |
| KAGOYA | For the rental server service, PHP 8.2–8.5 will be updated in sequence after the fixed versions are verified (target versions still being finalized). For managed dedicated, shared and WordPress-specific servers, a permanent fix is still being planned; as interim measures, the notice suggests considering taking sites offline or restricting access | Posted 10/21 18:20; updated 10/22 10:35 | PHPの脆弱性に関する当社サービスへの影響について |
| Zenlogic(IDCフロンティア) | Fixes applied during emergency maintenance (10/21 22:00–10/22 18:00; end time may vary). PHP 5.3 will be updated to the latest version and cannot be reverted; 7.4 and 8.1 may be updated. The notice says that if display or behavior problems occur after the update, the application side must be fixed | 10/21 | 【ホスティング】緊急メンテナンス作業のお知らせ |
| ColorfulBox | “We have completed the update to patched versions on the server side while keeping the PHP version you currently use.” The notice states that “there is no need for customers to change or switch PHP versions themselves” | 10/22 | 【重要】PHPの脆弱性に対するセキュリティアップデート完了のお知らせ |
| お名前.com レンタルサーバー | “We are applying security patches while keeping the PHP version you currently use.” The notice says a version change is generally not needed, but may be needed for PHP 5.x and 7.x. The file manager and webmail are temporarily suspended as a precaution | 10/22 | 【重要】PHPの脆弱性への弊社対応について |
| CORESERVER(V2) | “We have completed our response to the vulnerability for all PHP versions we offer”; “no action such as changing the PHP version is required on the customer's side.” Maintenance ran 10/22 0:00–11:13 and is stated as completed | Posted 10/21 (completed 10/22) | PHP脆弱性の対応(CORESERVER V2)【完了】 |
| XREA | “We have completed our response to the vulnerability for PHP 7.4 and later (7.4 / 8.0 / 8.1 / 8.2 / 8.3 / 8.4 / 8.5).” Users on these versions do not need to change versions. The notice says nothing about versions below 7.4 | Posted 10/21 (completed 10/22 0:50) | PHP脆弱性の対応(XREA)【完了】 |
| バリューサーバー | “We have completed our response to the vulnerability for PHP 7.4 and later.” The notice says users on these versions do not need to change versions | Posted 10/21 (completed 10/22 0:50) | PHP脆弱性の対応(VALUESERVER)【完了】 |
| ABLENET | “Regarding the two vulnerabilities identified in PHP, we have carried out initial security updates for our rental server environment.” The notice does not state which versions are covered or whether users need to take action | 10/22 13:04 | PHPの脆弱性に関するセキュリティアップデートの対応について |
| WebARENA(レンタルサーバー) | As of 10/22, I could not find an official notice (check with support) | - | WebARENA お知らせ(2026年) |
Where I could not find or open an official notice, the table says “could not confirm” or “could not find.” The absence of information there does not mean the provider has not responded. Check directly with your provider's announcements and support.
Mitigations while you cannot update right away
The PHP advisory lists settings that reduce the attack surface until you can update. However, the advisory itself explicitly states that they “do not make you safe.” The main ones are:
- For CVE-2026-109619: set
session.upload_progress.enabled=0in php.ini, the FPM pool, or the server configuration, and restart all workers (ini_set()and FPM's.user.inido not work for this). On PHP 8.5, also setfatal_error_backtraces=0. - For CVE-2026-109618: set
memory_limit=-1in a way the application cannot override, and reducepost_max_size(8M if there are no uploads, 32M if there are). Do not useRLIMIT_AS/RLIMIT_DATAas a substitute.
The UK NCSC recommends considering taking offline any system that cannot be updated or mitigated right away, and checking for signs of compromise before updating or applying mitigations.
Sources (checked on 2026-10-22)
- php.net: Security advisory: Critical remote code execution vulnerabilities, update now (2026-10-21)
- php.net: Upcoming Critical PHP Security Release (2026-10-20)
- php.net: Release announcements for PHP 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35
- GitHub: GHSA-w8hw-w9fx-j79w (CVE-2026-109618)
- GitHub: GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)
- Docker Hub: official php image
- FrankenPHP 1.13.2 release notes
- Debian Security Tracker: CVE-2026-109618 / CVE-2026-109619
- Ubuntu: CVE-2026-109618 / CVE-2026-109619 / USN-8948-1 / USN-8948-2
- Red Hat: CVE-2026-109618 / CVE-2026-109619 (fixed package versions from Red Hat's VEX data)
- NCSC: Critical security issue affecting PHP
Frequently asked questions
If php -v shows a fixed version, am I protected against php2shell (CVE-2026-109618 / 109619)?
Not necessarily. php -v only reports the version of the CLI PHP. PHP-FPM or Apache's mod_php, which handle web requests, may be a separate binary and a separate package. Check the FPM version with php-fpm8.3 -v (php-fpm -v on RHEL-family systems). Alternatively, open a temporary file from the web that prints PHP_VERSION and PHP_SAPI, and delete it as soon as you have checked. If you have not restarted FPM or Apache after updating, they may keep running the old code.
If I use Docker's php:8.3-fpm, is php2shell fixed?
As of 2026-10-22, php:8.3-fpm on Docker Hub has been switched to PHP 8.3.36. However, your local image stays old until you pull it again, and running containers keep using the old image until they are recreated. Run docker compose pull and docker compose up -d (or docker compose build --pull if you build your own image). Then run php -r 'echo PHP_VERSION;' inside the container and confirm it is 8.3.36 or later. Pinned tags such as 8.3.30 stay old until you bump the number yourself.
Ubuntu and RHEL still show PHP 8.3.6 or 8.0.30. Are they affected by php2shell?
You can't tell from the version number alone. Ubuntu and RHEL backport fixes to older versions, so a package can be fixed while its number stays old. As of 2026-10-22, the fix is in php8.3 8.3.6-0ubuntu0.24.04.13 on Ubuntu 24.04 and php 8.0.30-8.el9_8.1 on RHEL 9. Compare your installed package version (apt-cache policy or rpm -q) with the fixed version in your distro's security tracker. You can also check with pro fix CVE-2026-109618 on Ubuntu, or dnf updateinfo list --cve CVE-2026-109618 on RHEL-family systems.