PHP2Shell (CVE-2026-109618/109619): 1.75M Sites Run End-of-Life PHP

PHP2Shell is two critical PHP RCE flaws patched Oct 21, 2026. Our crawl finds 1.75M sites on end-of-life PHP with no official fixed release.

Published •Data through October 2026•22 min read

PHP2Shell (CVE-2026-109618/109619): 1.75M Sites Run End-of-Life PHP
Share:

PHP2Shell is the nickname for CVE-2026-109618 and CVE-2026-109619, two critical (CVSS 9.2) bugs in the PHP engine that allow unauthenticated remote code execution. PHP fixed them on October 21, 2026 in 8.5.12, 8.4.27, 8.3.36 and 8.2.35. TechnologyChecker's crawl finds 1.75 million sites (45.55% of PHP domains that announce a version) on end-of-life branches with no official fixed release.

Network of elephant-shaped PHP server nodes, one cracked open, others flashing warning alerts
📅
Status as of 22 October 2026: The fixed releases are 8.5.12, 8.4.27, 8.3.36 and 8.2.35, and exploitation in the wild is confirmed. PHP2Shell is not yet in CISA's Known Exploited Vulnerabilities catalog. Palo Alto Networks says every PAN-OS and Panorama version is affected, with no fixed releases so far.

I oversee the crawlers behind these numbers: PHP version strings that sites send in their X-Powered-By and Server headers. Most PHP2Shell coverage explains the bug. This post counts who's exposed, which PHP branches can get a fix at all, and how fast sites started announcing patched builds.

Key findings from TechnologyChecker's crawl (30 days to October 20, 2026):

  • 4,643,562 domains announced PHP; 17.32% hid the version.
  • 54.45% of version-announcing domains run a branch with an official fix; 33.38% run branches that got source patches but no release; 12.17% got nothing.
  • 780,934 domains on PHP 8.2 reach end of life on 31 December 2026.
  • LiteSpeed sites were the slowest to announce fixed builds after the release.

What Is PHP2Shell (CVE-2026-109618 and CVE-2026-109619)?

PHP2Shell is a pair of memory-safety bugs in the PHP engine's request handling, both rated 9.2 on CVSS v4.0, that let an attacker run code on a server without logging in. The bugs sit underneath WordPress, Laravel and every other PHP application, so clean application code doesn't protect you. php.net's October 21 security release advisory is blunt: "There are no complete mitigations, updating is the only safe choice."

CVE-2026-109618 CVE-2026-109619
Advisory title RCE via OOM corruption RCE via stale global state
What goes wrong Out-of-memory aborts use longjmp(), so request shutdown can act on memory that was never fully set up Request-owned state outlives its freed memory; a later request on the same worker can use it
GitHub advisory GHSA-w8hw-w9fx-j79w GHSA-6wmf-4rv5-p3rp
Fixed in 8.5.12, 8.4.27, 8.3.36, 8.2.35 Same releases

The nickname comes from researchers and the press; php.net doesn't use it. Wiz's research says every PHP version back to 5.4 is affected.

Which PHP setups are in scope?

A SAPI (server API) is the layer that hands web requests to PHP, and the bugs matter wherever a SAPI serves web traffic.

SAPI What advisories and researchers report
Apache mod_php Highest risk, per php.net: "a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs"
PHP-FPM Susceptible to CVE-2026-109618 by source analysis, no complete exploit shown; CVE-2026-109619 RCE validated under suitable application conditions
php-cgi, FrankenPHP In scope; FrankenPHP likely susceptible
LiteSpeed (LSAPI) Modelled on FPM; app-specific exploits likely but unvalidated
CLI Not listed by any source

According to Qualys, researchers also showed unauthenticated disclosure of worker memory, which "can contain passwords, authentication tokens, and API keys." Exploitation is rated high-complexity because it depends on allocator layout, the build and worker scheduling.

PHP2Shell Timeline: What Happened From October 17 to 22, 2026?

PHP2Shell went from the first recorded exploitation attempt to a public exposure scanner in five days. Amazon's honeypots logged attempts on October 17, details leaked on October 20, the fix shipped on October 21, and exploitation in the wild was confirmed the same day.

Date (UTC) Event Source
Oct 17 Amazon's MadPot honeypot records exploitation attempts, four days before disclosure Help Net Security; Datadog Security Labs, citing AWS
Oct 20 php.net pre-announces a security release for October 21, 14:00 UTC php.net pre-announcement
Oct 20 Details leak on social media before the planned disclosure watchTowr
Oct 21 Cloudflare WAF rules start blocking exploit traffic, hours before the release ppc.land
Oct 21 GitHub advisories go public; PHP ships four fixed releases plus source backports for 7.4, 8.0 and 8.1 php.net; CERT-EU
Oct 21 Exploitation observed in the wild watchTowr
Oct 21 Fixed builds start appearing in TechnologyChecker's crawl TechnologyChecker
Oct 22 Searchlight Cyber releases php2shell-scanner, an open-source exposure checker Help Net Security
Oct 22 Palo Alto Networks: all PAN-OS and Panorama versions affected, no fixes yet; Fortinet (12 products) and Cisco (31) still checking, none confirmed vulnerable Help Net Security
Oct 22 Still not in CISA's KEV catalog watchTowr

Sources disagree on the exact minute of the release and of Cloudflare's first blocks, and Sansec's timeline places the first attack reports later than ppc.land does. That's why the table says "hours before the release."

Is mass exploitation of PHP2Shell likely?

Mass exploitation looks less likely than the first headlines suggested, but the attacks are real. A researcher quoted by Sansec found that "the public exploits do not work against a default PHP installation," and most need a separate local-file-inclusion bug in the target application. CrowdStrike's demonstrated path needs memory_limit below roughly four times post_max_size, which PHP's shipped defaults don't meet but common upload-friendly pairings such as 64M with 128M do, and Datadog's lab used mod_php prefork with memory_limit=16M and post_max_size=64M.

The reality check isn't a reason to wait. watchTowr has seen exploitation in the wild since October 21, and Datadog reports broad untargeted scanning and cites Patchstack reports of active exploitation. A setting that's non-default on one server is the default on someone else's, so I read the reality check as a guide to patching order, not permission to skip it.

How Many Websites Are Exposed to PHP2Shell?

Isometric city of server blocks, a cluster glowing amber and red among blue ones

TechnologyChecker's crawl counted 4,643,562 domains announcing PHP in the 30 days to October 20, 2026, the eve of the fix. Of the 3,839,276 that named a recognisable branch, 1,748,886 (45.55%) run an end-of-life version with no official PHP2Shell release. The other 2,090,390 (54.45%) can install a fixed release from php.net today, and every one of them needs to.

I split the domains by the fix each branch can get. The middle tier needs a definition: for 7.4, 8.0 and 8.1, php.net published minimal source backports on GitHub branches such as PHP-7.4-CVE-2026-109618-109619, meant for source builds and users without a long-term-support vendor. There's no release and no new version number.

PHP2Shell fix tier Branches Domains Share of version-announcing PHP domains
Official fixed release 8.2 to 8.5 2,090,390 54.45%
Source backport only 7.4, 8.0, 8.1 1,281,669 33.38%
Nothing from upstream 7.3 and older 467,217 12.17%
End of life (both tiers above) 8.1 and older 1,748,886 45.55%

PHP2Shell Fixes in 2026: 1.75M PHP Sites Get No Official Release

Of 4,643,562 PHP domains in TechnologyChecker's crawl (30 days to 20 October 2026), 2,090,390 run a branch with an official fixed release (8.2 to 8.5), 1,281,669 run a branch that received only a source backport (7.4, 8.0, 8.1), 467,217 run PHP 7.3 or older with no upstream fix, and 804,132 hide their version.

Source: TechnologyChecker crawl (X-Powered-By and Server headers) · 21 Sep to 20 Oct 2026

PHP2Shell Fixes in 2026: 1.75M PHP Sites Get No Official Release
Fix availableDomains
Official fixed release (8.2 to 8.5)2090390
Source backport only (7.4, 8.0, 8.1)1281669
No upstream fix (7.3 and older)467217
Version hidden804132
  • Only 2,090,390 PHP domains (54.45% of versioned) can install an official PHP2Shell release
  • 1,281,669 domains depend on a source backport or a distribution package
  • 467,217 domains run PHP 7.3 or older, which gets no fix at all

Which PHP branches do websites run?

PHP Versions by Branch, October 2026: 45.6% Run End-of-Life PHP

TechnologyChecker's crawl found PHP on 4,643,562 domains in the 30 days to 20 October 2026, and 3,839,276 of them announced a recognised PHP branch in the X-Powered-By or Server header. PHP 8.3 (818,635 domains), 8.2 (780,934) and 7.4 (719,622) are the three largest branches. Branches 8.2 to 8.5 received an official PHP2Shell fix on 21 October 2026; 7.4, 8.0 and 8.1 received only source backports, and 7.3 and older received nothing. In total 1,748,886 domains (45.55% of versioned domains) announce an end-of-life branch.

Source: TechnologyChecker crawl (X-Powered-By and Server headers) · 21 Sep to 20 Oct 2026

PHP Versions by Branch, October 2026: 45.6% Run End-of-Life PHP
PHP branchDomains announcing the branch
PHP 8.5145863
PHP 8.4344958
PHP 8.3818635
PHP 8.2780934
PHP 8.1397071
PHP 8.0164976
PHP 7.4719622
PHP 7.3100956
PHP 7.288199
PHP 7.130142
PHP 7.043355
PHP 5.6125612
PHP 5.5 and older78953
  • 1,748,886 domains (45.55%) announce an end-of-life PHP branch
  • PHP 7.4 alone runs on 719,622 domains, ended support in November 2022 and gets no PHP2Shell release
  • PHP 8.2 (780,934 domains) reaches end of life on 31 December 2026
PHP branch Domains Share of versioned PHP2Shell fix from php.net
8.5 145,863 3.80% Release 8.5.12
8.4 344,958 8.98% Release 8.4.27
8.3 818,635 21.32% Release 8.3.36
8.2 780,934 20.34% Release 8.2.35
8.1 397,071 10.34% Source backport only
8.0 164,976 4.30% Source backport only
7.4 719,622 18.74% Source backport only
7.3 100,956 2.63% None
7.2 88,199 2.30% None
7.1 30,142 0.79% None
7.0 43,355 1.13% None
5.6 125,612 3.27% None
5.5 17,199 0.45% None
5.4 28,489 0.74% None
5.3 23,914 0.62% None
5.2 8,179 0.21% None
5.1 and older (incl. 4.x) 1,172 0.03% None

Source: TechnologyChecker crawl, latest PHP version per domain from X-Powered-By and Server headers, 21 September to 20 October 2026. Shares are of 3,839,276 domains announcing a recognised branch; 154 blank or impossible version strings (8.6, 9.x, 114.5 and similar) are excluded. Sources name 5.4 as the oldest affected version; the 33,265 domains on 5.3 and older sit in the no-fix tier because nothing comes from upstream, not because anyone has confirmed them vulnerable.

The real backlog is the backport-only tier. A source patch nobody compiles isn't a fix, and most of those 1,281,669 domains don't build PHP from source: they run a distribution package, a control-panel build or whatever their host installed. Branch 7.4 alone covers 719,622 domains, the third-largest branch in our crawl and the biggest end-of-life one. The no-fix tier is simpler: there's nothing to wait for, so the choice is upgrade, isolate or accept the risk.

As an outside check, W3Techs puts 65.3% of PHP sites on version 8, 26.9% on 7 and 7.7% on 5. Our snapshot reads 69.09%, 25.58% and 5.31% with a different method, so the shape holds. PHP also leads TechnologyChecker's programming languages category by a wide margin.

What happens to PHP 8.2 on 31 December 2026?

PHP 8.2 reaches end of life on 31 December 2026, about 70 days after the fix shipped, and 780,934 domains move into the end-of-life tier with it. If none upgrade first, the end-of-life share of version-announcing PHP sites rises from 45.55% to 65.89%.

How many sites have patched since October 21?

A quarter of the supported-branch domains we re-scanned after the release already announce a fixed build. Between 14:00 UTC on October 21 and about 20:10 UTC on October 22, our crawlers revisited 19,196 domains on 8.2 to 8.5, and 4,901 of them (25.5%) reported a fixed release.

Branch Domains re-scanned On the fixed release Share patched
8.5 1,680 584 34.8%
8.4 3,266 1,106 33.9%
8.3 8,018 2,108 26.3%
8.2 6,232 1,103 17.7%
📊
By the Numbers: In TechnologyChecker's post-release re-scan, PHP 8.5 sites were twice as quick to patch as PHP 8.2 sites: 34.8% versus 17.7% announced a fixed build within about 30 hours of the October 21 release.

Two caveats before anyone quotes 25.5%. The sample is small and not random, just the domains our crawl revisited in about 30 hours. And distribution builds that carry the fix keep their old version strings, so the true patched share is higher than the headers show.

The first fixed builds appeared within the hour. Four domains announced 8.3.36 in the 13:00 UTC hour on October 21, ahead of the scheduled 14:00 release, which is consistent with distributions receiving patches early; four domains don't prove more than that. In the 14:00 hour, 237 domains announced 8.3.36, alongside the first 8.2.35, 8.4.27 and 8.5.12 builds.

For contrast, Qualys counted only 199,000 patched installs in the first 12 hours across its enterprise customers, and about 70% of the installs it could version sat on end-of-life 5.4 to 8.1. Those are package installs inside companies, a different population from public websites, so I wouldn't compare the two directly.

Why Do Version Strings Overstate and Understate PHP2Shell Exposure?

Modern server with a blank brass nameplate half hidden behind a translucent mask

A PHP version header is evidence, not a verdict. It overstates exposure where Linux distributions backport fixes without changing the version number, and it understates exposure because 17.32% of PHP domains in our crawl hide their version and millions of PHP sites never announce PHP at all. Our guide to how header-based technology detection works covers the general method; the limits below are the ones that matter here.

Where version headers overstate exposure

A PHP 7.4 version string does NOT prove a site is vulnerable: Debian and Ubuntu backport security fixes into their packages without changing the upstream version number. For PHP2Shell, watchTowr reports that distributions and long-term-support vendors received patches before the public release. Qualys notes distro packages may keep older version numbers while carrying the fix, and Ubuntu's USN-8948-1 updated its php8.1, php8.3 and php8.5 packages.

That php8.1 update matters for reading our tiers. PHP 8.1 is end-of-life upstream and sits in our backport-only tier, yet an Ubuntu server with USN-8948-1 installed is patched while still announcing 8.1. AlmaLinux published its own PHP2Shell notice on release day too. So I treat 1,748,886 as an upper bound for unpatched end-of-life sites among those that announce a version.

Where version headers understate exposure

804,132 PHP domains send no version at all, and a hidden version isn't a patched one; it's an unknown one. The bigger gap is sites that never mention PHP. WordPress can't run without PHP, yet our WordPress profile counts 9,555,391 live domains (August 2026 rollup), roughly twice the 4,643,562 announcing PHP in the October window. Only 3,414,525 PHP-announcing domains also show WordPress. The windows differ, but the direction is clear: header-based PHP counts are a floor, ours included.

⚠️
Common Mistake: Turning off the version header and calling it a mitigation. Setting expose_php = Off stops scanners reading your version; it doesn't change the PHP engine that parses the request, and that's where the bug fires.

Which Web Servers and Platforms Put PHP2Shell on the Front Line?

Apache leads where PHP2Shell has no fix: 47.4% of no-fix-tier domains in our crawl show an Apache HTTP Server header, against 27.6% of domains on branches with an official release. The gap matters because mod_php, the setup php.net rates highest-risk, is an Apache module, so Apache is the only server where it can run.

Server header seen Official fix (8.2 to 8.5) Backport only (7.4 to 8.1) No fix (5.2 to 7.3)
Apache 27.6% 33.9% 47.4%
nginx 22.9% 16.9% 22.0%
LiteSpeed 24.4% 25.8% 14.5%
Cloudflare 13.7% 12.7% 11.8%
No named server 25.0% 22.8% 16.0%

Source: TechnologyChecker crawl, same snapshot. A domain can show more than one server header, so columns don't sum to 100%.

Apache Fronts 47.4% of PHP Sites With No PHP2Shell Fix (2026)

In TechnologyChecker's crawl (30 days to 20 October 2026), 47.4% of domains on PHP 7.3 or older also showed an Apache header, against 33.9% on the backport-only branches (7.4 to 8.1) and 27.6% on branches with an official PHP2Shell release (8.2 to 8.5). mod_php, the configuration PHP rates highest risk, only runs on Apache, but an Apache header does not prove mod_php because Apache often proxies to PHP-FPM.

Source: TechnologyChecker crawl (X-Powered-By and Server headers) · 21 Sep to 20 Oct 2026

Apache Fronts 47.4% of PHP Sites With No PHP2Shell Fix (2026)
PHP2Shell fix tierDomains in the tier showing an Apache header (%)
Official fix (8.2 to 8.5)27.6%
Backport only (7.4 to 8.1)33.9%
No fix (7.3 and older)47.4%
  • Apache share rises from 27.6% to 47.4% as PHP branches get older
  • mod_php, the setup php.net rates highest risk, can only run on Apache
  • Nginx shows on 22.9%, 16.9% and 22.0% of the three tiers; LiteSpeed on 24.4%, 25.8% and 14.5%

An Apache header does NOT prove mod_php: Apache often proxies PHP requests to PHP-FPM, so the header marks where mod_php is possible, not where it runs. Nginx and LiteSpeed sites use FPM or LSAPI, both still in scope. Those three lead TechnologyChecker's web servers category. My takeaway: the oldest PHP branches cluster on the one server where the highest-risk configuration can exist, and that overlap is where I'd audit first.

Which servers patched fastest?

In the same re-scan sample, grouped by primary server, nginx sites patched fastest and LiteSpeed sites slowest:

Primary server Domains re-scanned On the fixed release Share patched
nginx 5,176 2,259 43.6%
Apache 4,703 1,764 37.5%
Other or unknown 4,701 701 14.9%
LiteSpeed 4,619 180 3.9%

PHP2Shell Patch Rate by Web Server: Nginx 43.6%, LiteSpeed 3.9%

Between 14:00 UTC on 21 October 2026 and about 20:10 UTC on 22 October 2026, TechnologyChecker re-scanned 19,196 domains on supported PHP branches; 4,901 (25.5%) already announced a fixed build (8.5.12, 8.4.27, 8.3.36 or 8.2.35). By primary server header: Nginx 43.6% (2,259 of 5,176), Apache 37.5% (1,764 of 4,703), other or unknown 14.9% (701 of 4,701), LiteSpeed 3.9% (180 of 4,619).

Source: TechnologyChecker crawl (X-Powered-By and Server headers) · 21 to 22 Oct 2026

PHP2Shell Patch Rate by Web Server: Nginx 43.6%, LiteSpeed 3.9%
Primary web serverRe-scanned domains on a fixed build (%)
Nginx43.6%
Apache37.5%
Other / unknown14.9%
LiteSpeed3.9%
  • 25.5% of re-scanned supported-branch domains announced a fixed build within ~30 hours
  • LiteSpeed-served domains lagged at 3.9%, an eleventh of the Nginx rate
  • PHP 8.5 domains patched fastest (34.8%), PHP 8.2 slowest (17.7%)

We don't know the cause of the LiteSpeed gap yet. One plausible reason, which I'm treating as a hypothesis to check rather than a finding: LiteSpeed sites usually run their host's own PHP builds, so the fix arrives when the host ships it, not when php.net does.

💡
Quick Insight: If your site sits on LiteSpeed hosting, the fix is probably in your host's hands. Ask which PHP build serves your site and when it will carry the October 21 fixes.

Which PHP platforms are in the blast radius?

Every PHP application inherits PHP2Shell from the engine underneath. Per Sansec, Calif demonstrated unauthenticated RCE against Magento 2.4.9, WordPress 7.1.2, Drupal 11.4.3, Joomla 6.1.4, MediaWiki 1.46.2, Nextcloud 35.0.1 and Laravel 13.11, plus Roundcube, phpMyAdmin, Symfony and WHMCS.

Platform Live domains (TechnologyChecker) Calif demonstrated unauthenticated RCE
WordPress 9,555,391 Yes
WooCommerce 1,463,627 Not listed
Joomla 223,100 Yes
Drupal 158,947 Yes
TYPO3 92,289 Not listed
Laravel 90,325 Yes
PrestaShop 70,082 Not listed
CodeIgniter 63,867 Not listed
Magento 58,347 Yes
Craft CMS 22,805 Not listed
Yii 21,481 Not listed
OpenCart 19,897 Not listed
Moodle 13,966 Not listed
phpBB 6,550 Not listed
MediaWiki 6,487 Yes
Nextcloud 3,903 Yes

Source: TechnologyChecker technology profiles, monthly rollups dated August to October 2026 (each profile has its own date); Calif column per Sansec. "Not listed" says nothing about safety: the flaw is in PHP, not the application.

For most of these sites, the PHP binary isn't the owner's to patch. In our PHP profile's co-occurrence data, 876,127 PHP domains also show Hostinger, 432,112 GoDaddy, 228,741 OVH and 150,357 IONOS. On shared hosting the host ships your PHP, so your patch date is your host's patch date.

What Does Cloudflare Radar Show Since PHP2Shell Leaked?

Cloudflare Radar shows attack categories moving in a way that's consistent with PHP2Shell but can't be attributed to it. From October 20 to 18:00 UTC on October 22, Command Injection made up 11.17% of the WAF requests Cloudflare mitigated, against 5.69% in the same window a week earlier, and the "CVE" category rose to 5.44% from 2.47%. Daily, Command Injection went from 5.13% on October 19 to 11.26% on October 20, 8.46% on October 21 and 14.12% on October 22, while Remote Code Execution climbed from 1.28% to 6.14%.

Source: Cloudflare Radar, radar/attacks/layer7 managed-rule categories (radar.cloudflare.com), share of mitigated requests; 20 to 22 October (to 18:00 UTC) versus 13 to 15 October 2026, daily series 24 September to 22 October 2026, pulled 22 October 2026.

The catch: Command Injection hit 28.78% on October 10 and 15.80% on October 8, before anything leaked, and Remote Code Execution reached 11.76% on October 10. Radar groups traffic by rule category, not CVE, so it can't separate PHP2Shell from other campaigns. It also sees only traffic that passes through Cloudflare: 816,260 PHP domains in our PHP profile's co-occurrence data show Cloudflare in front of them, and for every other PHP site a Radar trend says nothing about the origin.

🔑
Key Takeaway: Read the Radar shift as a reason to patch now, not as a count of sites hit. Category shares swing with every campaign; only your own logs show what reached your PHP workers.

How Do You Check Whether Your PHP Is Affected?

You're affected if the PHP runtime serving your web requests is older than 8.2.35, 8.3.36, 8.4.27 or 8.5.12 on its branch and doesn't carry a vendor backport. The trap: the PHP you check from a shell may not be the PHP serving requests.

  1. Find the runtime that serves requests. Put a temporary phpinfo() page behind access controls, read the "Server API" line ("Apache 2.0 Handler" means mod_php, "FPM/FastCGI" means PHP-FPM) and the version, then delete the page.

  2. Don't trust php -v alone. The command-line binary can report a different PHP from the one serving requests, so check the FPM binary for your pool (such as php-fpm8.3 -v) or the Apache module.

  3. Read the package changelog, not just the version. Distribution builds carry fixes under old version numbers, so search for the CVE IDs (package names vary):

    apt changelog php8.3-fpm | grep -E 'CVE-2026-10961[89]'
    rpm -q --changelog php-fpm | grep -E 'CVE-2026-10961[89]'
    
  4. Restart every worker. Updated packages don't help until every PHP-FPM pool and Apache process restarts.

  5. Run an exposure check. Searchlight Cyber's open-source php2shell-scanner checks from outside; point it only at hosts you own.

  6. Search your logs. Datadog's lab lists very long form-field names (around 3.5 MB), null bytes in an empty-named field, "Allowed memory size … exhausted … Unknown on line 0" lines, Apache AH00052 … Segmentation fault (11) errors and web workers spawning shells. None alone proves an attack, and Datadog's refined exploit returned HTTP 200 without a crash, so a quiet log isn't proof of safety.

📌
Pro Tip: If php -v and phpinfo() report different versions, you've found two PHP installs. Patch both, starting with the one that serves web requests.

On shared or managed hosting you can't run most of these checks, so ask your host four questions: which PHP build serves my site, does it include the fixes for CVE-2026-109618 and CVE-2026-109619, have all PHP workers restarted since, and is more than one PHP version active on my account?

How Do You Patch or Mitigate PHP2Shell, Branch by Branch?

Robotic arm swapping a cracked amber server module for a healthy blue one

Upgrading PHP is the only complete PHP2Shell fix. On 8.2 to 8.5, install your branch's fixed release; on 7.4, 8.0 and 8.1, use a vendor build that carries the fix or compile php.net's source backport; on 7.3 and older, upgrade to a supported branch.

Your PHP branch What to install Then
8.5, 8.4, 8.3 8.5.12, 8.4.27 or 8.3.36 Restart all workers
8.2 8.2.35 Move to 8.3 or newer before 31 December 2026
8.1, 8.0, 7.4 A distribution or LTS-vendor package with the fix, or a source build from php.net's backport branch Upgrade to a supported branch
7.3 and older Nothing from upstream Upgrade, or take the system offline
🚩
Red Flag: PHP 8.2.35 closes PHP2Shell but buys you about 70 days. Branch 8.2 reaches end of life on 31 December 2026, and after that the next engine bug gets no 8.2 release at all.

AWS calls upgrading "the only complete fix" and tells 5.4 to 8.1 users to migrate; its security bulletin says AWS services aren't impacted and lists updates for Amazon Linux, Elastic Beanstalk and Lightsail. The UK's NCSC has urged taking offline any system that can't be fixed, as Help Net Security reports. On the RHEL family, watch your package source: rpms.remirepo.net had no updates on release day, and php.net told its users to switch to distribution packages or source builds.

How you run PHP Who ships the patched build What you do
Shared hosting or managed WordPress Your host Ask the four questions above and get a date
Server with distribution packages Your distribution Update, check the changelog for both CVE IDs, restart PHP-FPM and Apache
Containers Whoever builds your base image Rebuild on a patched base and redeploy; running containers keep the old binary
Source builds You Rebuild from the fixed release or the backport branch

Which partial mitigations help while you patch?

The published mitigations are partial, and php.net is explicit that none is complete. For CVE-2026-109618:

  • Set memory_limit = -1 administratively (php_admin_value) so applications can't override it, then restore a finite limit after patching, since unlimited memory raises resource-exhaustion risk.
  • Set post_max_size = 8M (32M if you accept uploads), with upload_max_filesize below it.
  • Enforce request-size, field, multipart, header and nesting limits at the proxy, and block multipart where you don't use it.
  • Use cgroup memory limits, never RLIMIT_AS or RLIMIT_DATA.

For CVE-2026-109619:

  • Set session.upload_progress.enabled = 0 in php.ini or the FPM pool (not via ini_set() or .user.ini), then restart workers.
  • On 8.5, set fatal_error_backtraces = 0.
  • Remove invalid per-request settings and fix attacker-reachable fatal errors and timeouts. Hiding errors with display_errors or @ doesn't help.

Do WAF rules stop PHP2Shell?

WAF rules reduce exposure; they don't replace the patch. Cloudflare deployed rules for both CVEs on all plans including Free, Help Net Security reports, quoting Cloudflare's CTO. AWS WAF guidance points to SizeRestrictions_BODY in the Core rule set for CVE-2026-109618 and PHP Managed Rule Group v2.3 for CVE-2026-109619. Any WAF misses traffic that reaches the origin directly, and its rules can lag new variants.

For online stores, Sansec suggests blocking multipart/form-data at the web server as a stopgap. It breaks Magento admin image uploads and some cart and checkout forms, so place a test order after adding it. In Sansec's words: "You do not need to take your store offline."

Frequently Asked Questions

No. PHP2Shell is a memory-safety bug in the PHP engine's request handling, not a flaw in the shell_exec() function or exec(). Disabling those functions isn't on any advisory's mitigation list, because the bug triggers inside PHP's own request processing. Only a patched PHP build fixes it.

Is PHP 7.4 patched for PHP2Shell?

Not by an official release. PHP 7.4 is end-of-life, and php.net published only a minimal source backport for people who build PHP themselves or have no long-term-support vendor. A 7.4 site is patched only if its distribution, vendor or host shipped a build with that fix, and the version string won't tell you which.

Is WordPress affected by PHP2Shell?

Yes, through PHP. The flaw is in the engine that runs WordPress, and Calif demonstrated unauthenticated RCE against WordPress 7.1.2, per Sansec. Updating WordPress core or plugins doesn't fix PHP2Shell; updating PHP does, and on managed hosting that update comes from your host.

Does Cloudflare protect me from PHP2Shell?

Partly. Cloudflare's rules run on every plan, Free included, but they only filter traffic that passes through Cloudflare. Requests that reach your origin directly skip them, and rules can lag new exploit variants. Treat the WAF as cover while you patch.

Is the PHP CLI affected by PHP2Shell?

The CLI isn't listed by any source, because it doesn't serve web requests. "Not listed" is not the same as "safe," so update it with everything else. A patched CLI also tells you nothing about the PHP-FPM or mod_php runtime serving your site.

Is patching enough to stop PHP2Shell?

Installing the fixed release closes both CVEs. One unconfirmed claim is worth knowing: Abstract Security says it reproduced unauthenticated RCE on a fully patched 8.2.35 host by chaining session upload progress with an include-style application flaw. Nobody else has confirmed it. Its advice, keeping session.upload_progress.enabled = 0 at pool or php.ini level, costs little if you don't use upload progress.

Is PHP2Shell in CISA KEV?

Not as of October 22, 2026, according to watchTowr. A KEV listing isn't a precondition for acting: exploitation in the wild is already confirmed, and the fix has been out since October 21.

How many websites are affected by PHP2Shell?

TechnologyChecker's crawl counted 4,643,562 domains announcing PHP in the 30 days to October 20, 2026, and every unpatched version back to 5.4 is affected. Of those naming a version, 1,748,886 run end-of-life branches with no official release. Header counts are a floor, since many PHP sites never announce PHP.

How is PHP2Shell different from a PHP web shell?

A PHP web shell is a malicious script an attacker plants on a compromised site to run commands later. PHP2Shell is a pair of engine bugs that can give an attacker code execution in the first place. If you find a web shell, treat the server as compromised and rotate the secrets it held.

Methodology and Sources

  • Eve-of-disclosure snapshot: crawl dates 21 September to 20 October 2026, latest PHP version per domain; 4,643,562 PHP domains, 3,839,276 with a recognised branch.
  • Version method: X-Powered-By and Server response headers only, grouped by major.minor branch. 804,132 domains (17.32%) sent no version; 154 blank or impossible strings were excluded.
  • Server split: same snapshot. Domains can show more than one server header, the no-fix column covers 5.2 to 7.3, and an Apache header marks where mod_php is possible without proving it.
  • Patch-uptake sample: 19,196 domains on 8.2 to 8.5, re-scanned from 14:00 UTC on 21 October to about 20:10 UTC on 22 October 2026. The sample isn't random, and distribution backports keep old version strings, so the patched share is a floor.
  • Profile figures: platform, hosting and Cloudflare figures come from TechnologyChecker technology profiles with monthly rollups dated August to October 2026. The PHP profile shows 5,337,408 domains in its September rollup, a different window from this post's October snapshot.
  • Cloudflare Radar: radar/attacks/layer7 managed-rule categories, share of mitigated requests, pulled 22 October 2026.
  • External facts: vulnerability details come from php.net and the GitHub advisories; other claims are attributed inline and linked at first mention.
  • What we publish: aggregates only. TechnologyChecker doesn't publish lists of individual vulnerable sites.

If you look after PHP sites for clients or across a portfolio, TechnologyChecker's PHP profile has the full version table, and the same detection data shows which PHP branches, web servers and hosts your own sites run, so you know where to start patching.

Written by
David Thomson's profile
David Thomson

CTO

15+ years of experience

David is the CTO of TechnologyChecker, responsible for the engineering and architecture behind the platform's crawling infrastructure.

  • MEng Computer Science, University of Edinburgh
  • AWS Solutions Architect Professional
  • Contributor, Open Source Crawling Frameworks

Never miss our research