21 Oct 2026 Two critical RCE bugs in PHP core (CVE-2026-109618, CVE-2026-109619). Fixed in 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12. Is my PHP patched? →
Checklamp
Fixed builds · 21 October 2026

PHP2Shell fixed versions: apt, dnf, cPanel, containers

Published · updated

One table answers the most-asked question of this month: which build closes CVE-2026-109618 and CVE-2026-109619. Below it — how to read the version your package manager actually installed, because “updated” and “patched” are not the same thing.

Passive. Public responses only, nothing is attacked. No account. The result is on the page. Honest: if a value is hidden, we say so instead of guessing.
Reading public responses — usually 5–20 seconds

The fixed builds

BranchVulnerableFixed build
PHP 8.5below 8.5.128.5.12
PHP 8.4below 8.4.278.4.27
PHP 8.3below 8.3.368.3.36
PHP 8.2below 8.2.358.2.35
PHP 8.1 and olderall buildssource backports only

The build numbers are per branch, not per release: 8.3.36 is the patched build of the 8.3 line, not a new major version. 8.2 is still in security support — until 31 December 2026 — and gets 8.2.35. Anything on 8.1 or older has no package: the branch is closed and only a source backport exists.

Read your package manager, not the website

Distribution packages carry a suffix that is easy to misread: 8.2.35-0+deb12u1, 8.3.36-1.el9, 8.3.36-1ubuntu1. The PHP version is the first three numbers; the rest is the packager's own revision. Compare only that part.

# Debian / Ubuntu — what is installed and what is available
dpkg -l | grep -E 'php[0-9.]*-(fpm|cli)'
apt-cache policy php8.3-fpm

# RHEL / Alma / Rocky
rpm -q php-fpm
dnf info php-fpm

# Alpine / containers
apk info -v | grep php

If apt-cache policy shows the installed version below the candidate, the update exists and has not been applied. If both are old, the repository you use has not published the fix yet — check the vendor's own advisory rather than waiting: distributions and LTS vendors received these patches in advance, but a stale mirror or a pinned version can hold you back.

Panels, containers and Homebrew

  • cPanel / WHM ships its own EA-PHP packages (/opt/cpanel/ea-php83). They are updated through the panel's own updater, not through the system package manager. Where to see the version →
  • Plesk keeps PHP handlers per domain and updates them with its own package set; the version a domain uses is in “PHP Settings”, not in the panel default.
  • Docker images are immutable: pulling a new tag does nothing until you rebuild and redeploy the container. docker exec app php -v shows what the running container has.
  • Homebrew and other build-from-source setups need a formula update plus a service restart; the old binary stays in the keg until you switch.

Prove that the patched build is the one serving traffic

  1. Rebuild or update. Whatever installs the package — apt, dnf, the panel updater, the image build.
  2. Restart the workers. systemctl reload php8.3-fpm (or the panel's restart). A reloaded binary means nothing while the old master keeps its children.
  3. Check the running process, not just the CLI. ls -l /proc/$(pgrep -o -f 'php-fpm: master')/exe and the start time of the pool's children.
  4. Check the branch the site uses. A server can hold four branches; the site runs one. grep -r fastcgi_pass /etc/nginx or the panel's PHP selector answers which.
  5. Confirm from outside. If the site publishes its version, an external check now shows a fixed build; if the version is hidden, the check says “not disclosed” — expected, and not a failure.

Three ways this goes wrong

Updated the wrong branch. The server has 8.1, 8.2 and 8.3 installed; the site is on 8.2. Patching 8.3 changes nothing and looks like success in the terminal.

Rebuilt the image, did not redeploy. The new image sits in the registry while the old container keeps serving.

Read the header on the wrong page. Some applications embed their own PHP-FPM pool; a legacy section of the site can answer with a different build than the main page. Check the URL that handles logins and payments.

The patch itself is one update. The work is making sure the update reached the process that answers requests — which is why the checklist orders these steps rather than listing them.

Questions

Is 8.2.35 the last patch for the 8.2 branch?

No — 8.2 stays in security support until 31 December 2026, so critical fixes can still arrive. After that date the branch closes and there is no package at all.

Do I need to update PHP if I use a managed host?

Your host updates the branch it offers, but you should verify the build your site reports. Managed hosts sometimes delay a change for compatibility, and some keep a per-site version selector set by the customer.

The package version shows 8.3.36-1.el9 — is that patched?

Yes: the PHP part is 8.3.36. The suffix is the packager's revision. Compare the three numbers, ignore everything after the dash.

We run PHP in a container — what is our update path?

Rebuild the image on the fixed base (or the fixed distribution package inside it), push, redeploy, then confirm with docker exec … php -v that the running container has the new build.