PHP2Shell is the nickname for two critical remote code execution vulnerabilities in PHP itself: CVE-2026-109618 and CVE-2026-109619, each rated 9.2 on CVSS v4.0. Because the bugs live in the PHP runtime rather than in any single application, anything running on a vulnerable PHP build is potentially exposed. That includes WordPress, Drupal, Joomla, Magento, Laravel apps, and custom code.

PHP shipped fixes on October 21, 2026. Details had already leaked online before then, and security vendors report exploit attempts against honeypots. If you run PHP anywhere, this is a patch-now week.

🛑Editorial note: This write-up is for defenders. We don't publish proof-of-concept code, request payloads, or targeting details, and we've left out the specifics of how the bugs are triggered. Everything here is about finding exposed systems and fixing them.

The short version

Details
CVEsCVE-2026-109618, CVE-2026-109619
Severity9.2 Critical (CVSS v4.0), both
ImpactRemote code execution on the web server
Fixed in8.5.12, 8.4.27, 8.3.36, 8.2.35 (released Oct 21, 2026)
No official releasePHP 8.1 and older (source-only patches exist for 7.4–8.1; vendor backports vary)
Reported setupsPHP-FPM, mod_php, php-cgi, FrankenPHP, LiteSpeed
ExploitationAttempts seen on honeypots; extent of real compromises not yet established
CISA KEVNot listed at the time of the early reports

What actually broke (high level)

Both bugs sit in how PHP handles incoming request data before your application code ever runs. That's what makes them nasty: your app doesn't have to do anything wrong to be reachable.

Reporting on the exact split between the two CVEs has been messy. A leaked early write-up described the bugs differently from PHP's own advisories, and at least one researcher has said the leak got both bugs wrong. When in doubt, trust PHP's official advisories over secondhand descriptions. The fix is the same either way: upgrade.

The flaws were reportedly found independently by researchers at Calif (working with OpenAI's "Patch the Planet" project) and at Wiz.

Timeline

Am I affected?

Short answer: if you run PHP 8.5.11, 8.4.26, 8.3.35, 8.2.34, or anything older, assume yes until you've patched or confirmed a backport.

How to check:

  1. On a server you control: run php -v for the CLI, but remember the web server may use a different binary. Check your PHP-FPM or Apache module version too, or look at a phpinfo page you've restricted to yourself.
  2. On a distro package (Ubuntu, Debian, RHEL, Alma, etc.): the upstream version number may not change. Distributions often backport the fix into the same version string. Check your distro's security advisory for CVE-2026-109618 and CVE-2026-109619 and compare package release numbers.
  3. On managed or shared hosting: you probably can't patch PHP yourself. Check your host's status page or open a ticket and ask directly: "Is the PHP my site runs patched for CVE-2026-109618 and CVE-2026-109619?"
  4. On WordPress: Tools → Site Health → Info → Server shows the PHP version. Some hosts apply backported fixes without changing the displayed version, so confirm with the host if it shows an old number.
⚠️WordPress owners, read this twice: updating WordPress core, themes, or plugins does not fix PHP2Shell. The bug is in the PHP runtime on the server. Your host, or whoever runs the server, has to update PHP.

What to do now

1. Patch (the only complete fix)

Upgrade to the fixed release for your branch: 8.5.12, 8.4.27, 8.3.36, or 8.2.35, or your distribution's patched package. Then restart PHP-FPM, Apache, or whatever runs PHP. A package update that never reloads the running workers leaves the old code in memory.

If you're on PHP 8.1 or older, there's no official release. Your options are a vendor backport (some Linux distributions and commercial support providers offer them), building from the source-only patches, or moving to a supported branch. This is a good moment to move to 8.3 or newer. PHP 8.2 reaches end of life on December 31, 2026.

2. If you truly can't patch today: partial mitigation

Several vendors suggest disabling session upload progress (session.upload_progress.enabled = 0) as a stopgap. Be clear-eyed about what it does:

PHP has said no configuration change fully closes these vulnerabilities. Treat this as buying hours, not a fix. WAF rules from your CDN or security vendor can add another layer, but they aren't a substitute for patching either.

3. Look for signs of compromise

If a server was exposed while unpatched, especially from mid-October onward, check:

If you find any of the above, treat it as an incident: isolate the host, preserve logs, rotate secrets the web server could read (database passwords, API keys, session secrets), and rebuild from a known-good state rather than cleaning in place.

Why this one matters

Most "critical WordPress vulnerability" headlines are about a single plugin. PHP2Shell is different: it's the floor everything stands on. PHP still powers a huge share of the web, a lot of it on hosting where the site owner doesn't control the runtime. The pre-patch leak removed the usual head start defenders get.

The lesson is boring and important. Know what runtime versions you're on, know who's responsible for patching them, and stay on supported branches. The teams that had that inventory finished patching on October 21. Everyone else is still filing tickets.

🎓Want to get better at this kind of response? Vulnerability management, patching, and incident response are core skills in entry-level security roles. See our reviews of the Google Cybersecurity Certificate and TryHackMe SOC Level 1.

Sources

This write-up was compiled from vendor advisories and security research published October 20–23, 2026. Where sources disagree, we've said so.

This is a developing story. We'll update this page as PHP, CISA, and major hosts publish more.

← All Write-ups