There Isn't an Easy Exploit for PHP2Shell. That Is Not a Reason to Wait.

PHP2Shell, CVE-2026-109618 and CVE-2026-109619, was fixed on October 21, 2026 and rated CVSS v4.0 9.2. Elias Taylor and Sansec report that public proof-of-concepts fail against default PHP and often depend on a separate file inclusion bug. Harder exploitation lowers the odds of a mass wave this week, not the need to patch.

Two claims that are both true

On October 21, 2026, the PHP project shipped emergency releases for two unauthenticated remote code execution flaws, CVE-2026-109618 and CVE-2026-109619, collectively nicknamed PHP2Shell. Both carry a CVSS v4.0 score of 9.2. CISA put out an alert the same day titled "Critical Vulnerabilities in PHP Require Immediate Patching".

The same day, Elias Taylor published the post that reached the Hacker News front page: "There isn't an easy exploit for this PHP vulnerability". His argument is narrow, and thinner on evidence than its confidence suggests. The bug is real, but he argues the circulating proof-of-concept exploits do not work against a vanilla PHP install, and invites readers to run the popular repositories themselves rather than publishing his own test results. Many relied on the target already having a local file inclusion (LFI) bug. Some only worked because the test server had been modified to add one. His conclusion: this is not a Log4Shell moment, and you should patch anyway.

Those two positions are not in conflict. One is about the probability of a mass exploitation wave this week. The other is about whether your servers carry a 9.2 memory corruption bug in the request path. Mixing them up is how teams end up either panicking or deferring.

What the bugs are

Per the PHP team's description as reported by BleepingComputer and Help Net Security, both flaws come from one root problem: PHP can leave memory in a corrupted state when a request ends abnormally.

One path involves out-of-memory handling. A fatal error can interrupt PHP while internal request data is only partly initialised, and cleanup then treats that data as valid. The other involves request-owned state that survives after its backing memory has been freed, so a later request on the same worker can use stale state before initialisation resets it.

Sansec's write-up places the triggers in upload-progress handling and fatal-error backtraces, and says every known trigger is a multipart/form-data request that PHP parses before application code runs. Sansec's mapping of code paths to CVE IDs differs from other outlets, so use the official PHP advisory if the distinction matters to you.

Affected SAPIs include PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP, and LiteSpeed. The PHP team rates mod_php highest risk, because one unauthenticated request can trigger the flaw before any application code runs. The bugs were found by Calif, Wiz Research, and OpenAI.

Why exploitation is hard, and why that is temporary

Use-after-free bugs in an interpreter are not deterministic in the way Log4Shell or Shellshock were. Turning a stale pointer into code execution depends on heap layout, build options, the worker model, and configuration. A proof of concept tuned to one lab build fails on the next one. That is why so many public PoCs added an LFI bug: it gives the exploit a reliable second stage.

Sansec's October 22 update agreed that mass exploitation looked less likely than on release day, noting nobody had shown a single universal request. That is a real reason to lower your estimate of a spray-and-pray wave.

It is not a reason to wait. Several facts point the other way:

  • Amazon Threat Intelligence said its MadPot honeypot recorded a PHP2Shell exploitation attempt on October 17, four days before disclosure, per Help Net Security.
  • Cloudflare reported early attacks at 07:43 UTC on October 21, before the 14:00 UTC release, per Sansec.
  • Wiz researchers said AI models substantially reduced the barrier to turning the flaw into an exploit.

CISA said it had not observed exploitation at publication. Taken together, as of 22 October: no public universal exploit, mixed reports of activity ranging from Amazon's honeypot hit to Cloudflare describing large volumes of attempts that sources say did not succeed, and a patch diff that now tells everyone where to look. Memory corruption bugs tend to get easier after the patch, not harder.

The part that is not about RCE

Sansec describes a memory disclosure path in which freed worker memory can be returned to the client in a session cookie, potentially exposing secrets held by that worker, even if the application never starts a session. An attacker does not need reliable code execution to benefit from reading another request's memory. If that description holds for your build, "no easy RCE" understates the exposure.

How to prioritise

Treat this as an incident with an owner, not a backlog ticket.

Inventory, including PHP you did not install

CISA warns that PHP is often embedded in other software, so its presence may not be directly observable. Help Net Security reported Palo Alto Networks saying all versions of PAN-OS and Panorama were affected, with fixes pending at the time. Appliances, control panels, and vendor images belong on the list.

Patch by exposure

Fixed upstream releases are 8.5.12, 8.4.27, 8.3.36, and 8.2.35, with source backports for 7.4, 8.0, and 8.1. Internet-facing mod_php hosts go first. Distribution packages usually keep the old version string with a backported fix, so check the package changelog for the CVE ID rather than reading the version number. Sansec notes the official Docker php image gets no fix for 8.1 or older.

Mitigate only where you cannot patch today

Reported stopgaps include disabling session.upload_progress.enabled and restarting workers, setting fatal_error_backtraces=0 on PHP 8.5, and WAF rules from the major providers. Some guidance sets memory_limit=-1, which removes PHP's own memory guard, so pair it with container or cgroup limits. Blocking multipart requests breaks uploads. None of these is a fix, and CISA's advice for systems that cannot be updated is to take them offline.

Verify the setting reached the workers

A php.ini change for the CLI does not reach a PHP-FPM pool. Confirm runtime values from a request served by the pool itself.

What to watch for

CISA recommends monitoring for PHP worker processes launching shells or downloading tools. In practice that means alerting on process lineage: php-fpm or the web server spawning sh, bash, curl, or wget. A rise in worker segfaults or out-of-memory fatals on multipart endpoints is also worth a look, since both bugs live on abnormal request termination. That last signal is noisy and a heuristic, not an indicator of compromise.

The broader point

Exploitability debates are useful for deciding how fast to move and how loudly to page people. They are a poor input for deciding whether to patch. The useful question is narrower: given who can reach this code path, how long can you carry the risk, and what evidence would change that? For PHP2Shell, the answer for internet-facing hosts is days, not a quarter.

Frequently asked questions

Is PHP2Shell being exploited in the wild?
Reports are mixed. CISA said it had not observed exploitation when it published on October 21, 2026. Amazon reported a honeypot exploitation attempt on October 17, Cloudflare reported early attacks before the patch release, and Sansec said a mass wave looked less likely than first feared. Plan for targeted attempts rather than none.
Why do public PHP2Shell exploits fail?
Elias Taylor and Sansec found that public proof-of-concepts did not work against a default PHP install, and many relied on a separate local file inclusion bug in the target. Use-after-free exploitation depends on heap layout, build, and worker model, so an exploit tuned to one lab rarely transfers. That raises attacker cost but does not remove the flaw.
Which PHP versions fix CVE-2026-109618 and CVE-2026-109619?
Upstream fixes are in PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35, with source backports published for 7.4, 8.0, and 8.1. Distribution packages often backport fixes without changing the version string, so check your package changelog for the CVE identifiers. Older unsupported versions need a vendor backport or a migration.
Can a WAF protect against PHP2Shell instead of patching?
Cloudflare and The triggers sit in request parsing that runs before application code, and attackers can vary payloads, so rules cover known patterns only. Treat a WAF as a bridge measured in days, and patch.