Skip to content
Threat ResearchCVE-2026-109618

php2shell: a public exploit is out, the patch still stops it

A public php2shell exploit landed on Exploit-DB. We validated it in our isolated lab: it is the same core as the earlier PoC, not a new bug, the patch still stops it, and the in-the-wild activity is now real.

Shadow Labs · Threat Intelligence

8 min read

Key takeaways

TL;DR
  1. 01

    A public exploit for php2shell (CVE-2026-109618) was published on Exploit-DB on 22 October. We validated it in the same isolated lab: it reached code execution as the web user, three runs out of three, on PHP 8.4.26.

  2. 02

    It is not a new bug or a new technique. Function by function, its exploitation core is identical to the earlier public PoC; only the orchestration and the way it proves execution changed.

  3. 03

    The fixed release (8.4.27 and siblings) still stops the chain in our lab, as do two stopgap configurations, but only this chain, in this profile. Updating PHP remains the only complete fix.

  4. 04

    The activity is real now: Amazon logged attempts from 17 October, Sophos reported a successful compromise, and Datadog showed the defense surface is wider than multipart alone. Hunt back to 17 October.

Yesterday we published our php2shell lab: how we reproduced the PHP engine RCE in a sealed box and proved it, with the offensive detail held back. Today the picture moved enough to be worth a second note. A public exploit for the same flaw is now on Exploit-DB, and three intelligence teams published real-world activity, including one successful compromise. Here is what we checked, what is genuinely new, and what it means for patching. [Confirmed]

A public exploit, and what it actually is

On 22 October an entry for CVE-2026-109618 was published on Exploit-DB as ID 52704, listed under OffSec and crediting the original work to a researcher handle, with a note that the code was adjusted using AI. [Confirmed] One detail is easy to misread: the listing's own "Verified" field is marked with a cross, not a check. It is a published proof of concept, not something Exploit-DB or OffSec have independently verified, and we are careful not to describe it as validated by them. [Confirmed]

A public, easy-to-obtain exploit changes the risk arithmetic even when the underlying bug is unchanged: more people can now run it, with less skill, against more targets. [Our assessment]

We ran it, in the same sealed box

We took the file exactly as published, read it before running anything, pinned it to one target URL and two fixed commands, and ran it against our isolated lab: PHP 8.4.26, Apache, mod_php, on a Docker network with no route to the internet. In three runs it reached code execution as the web user every time, and our harness confirmed it the honest way. It refuses to call a run a success unless the exact output of id for the web user, uid=33(www-data), lands in a marker file that it cleared first. The proof is the measured effect, not the exploit's own message. [Confirmed]

Two public php2shell PoCs share one identical coreThe October 21 PoC (Zer061, pinned by commit) and the October 22 Exploit-DB 52704 entry published by OffSec share an AST-identical exploitation core: the Exploit and Target classes, the multipart builder, the heap and libphp leaks and the cookie parsers are byte-for-byte equivalent after normalization. Only the orchestration changed: the October 21 code reported BLIND_OK without checking its own proof file, while Exploit-DB 52704 rewrote the entry point, removed the target list and built-in listener, and added proof-of-execution. A second public exploit raises availability, not the attack surface; it is the same bug, CVE-2026-109618.Oct 21 · Zer061 PoCReports BLIND_OKpublic, pinned by commit · proof file never checkedunverified successSame core · AST-identicalExploitTargetbuild_multipartheap / libphp leakscookie parsersOct 22 · Exploit-DB 52704Proof-of-execution addedOffSec · credited 9bie · listener removed
Fig. 1Function-by-function comparison against the earlier public PoC: the exploitation core is AST-identical; only the wrapper and the result check changed.

The comparison is the real finding. We diffed this exploit against the PoC we used yesterday, definition by definition. The exploitation core, the request builder, the two memory leaks and the cookie parsers, is identical down to the parsed syntax tree. [Confirmed] What changed is everything around it: the entry point was rewritten, the target list and the built-in listener were stripped out, and, most usefully, it now re-reads its own proof of execution after each attempt instead of printing a blind success. The earlier code reported BLIND_OK without ever checking whether a command had run. [Confirmed] This is not a new vulnerability or a new technique; it is the same chain, packaged to be more convenient and more honest about whether it worked. [Our assessment]

The patch still holds

We re-ran the public exploit against the fixed release and two stopgap configurations, with the same harness. The result matched our earlier lab exactly:

TargetResult of the public exploit
PHP 8.4.26, upload progress on (vulnerable)Code execution as www-data; 3 of 3 runs
PHP 8.4.27 (the fixed release)No execution; the memory leak failed
PHP 8.4.26, session upload progress offNo execution; the memory leak failed
PHP 8.4.26 with memory_limit=-1No execution; the memory leak failed

Read the last three rows carefully. Each means only that this exact chain did not reproduce in that configuration, not that a host is safe. [Our assessment] They hold for one public chain and one build. PHP is explicit that updating is the only complete fix; the two configuration changes each cut a single path and are stopgaps, not remedies. [Confirmed]

The activity is real now, not hypothetical

Three teams published findings worth folding into your hunt, each with its own scope.

  • Amazon (MadPot). Amazon's honeypots logged an exploitation attempt on 17 October, four days before public disclosure, and more on 21 October from different infrastructure. Amazon describes php2shell as broadly exploited while noting it is unclear whether those attempts would have succeeded on real systems, and recommends hunting back to at least 17 October rather than from the advisory date. [Confirmed]
  • Sophos. Sophos reported multiple attempts and one successful exploitation, which wrote a file to /tmp and ran it (./nfs php) with a payload that looks like a Mirai variant it calls "potassium"; at the time of its update Sophos had not linked the activity to ransomware, data theft or supply-chain abuse. Those indicators belong to Sophos's incident, not to every php2shell attempt. [Confirmed]
  • Datadog Security Labs. Datadog reproduced the RCE independently and added three defensive points: application authentication does not help, because PHP processes the request before your application code runs; its path for CVE-2026-109618 uses application/x-www-form-urlencoded, so a defense limited to multipart or PHP_SESSION_UPLOAD_PROGRESS does not cover every route; and a successful run can return HTTP 200 without crashing the worker, so the status code and the absence of a crash do not rule out execution. [Confirmed]

Do this week

If you run PHP anywhere on the web path

  1. 01Patch, do not configure around it

    Update to 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or your vendor's fixed package. Check backports: a distribution package can keep an old upstream version number and still contain the fix.

  2. 02Rebuild images and restart every worker

    The fix only applies to processes started after it. Rebuild container images and restart or replace all workers, and verify the runtime that actually serves HTTP, not just the php command line.

  3. 03Inventory every PHP that faces the web

    mod_php, FPM, php-cgi, FrankenPHP, LiteSpeed, containers, appliances and runtimes bundled by third parties. The exposed one is often the one nobody tracks.

  4. 04Hunt from 17 October, not from the advisory

    Run the retrospective search above across your logs, and do not drop the urgency because a scan or a PoC failed once. Profile, build, SAPI and configuration all shape whether a given chain fires.

A public exploit is a deadline, not a verdict on your servers. That it ran in our lab says the chain is real and now easy to obtain; it does not say it is reliable against your build, and a scan that fails proves nothing. [Our assessment] Patch first. Then, if you want to know whether anyone reached you before you did, that is what a compromise assessment and threat hunting are for; if you want the detections above tuned to your stack, that is detection engineering; and the lab discipline behind this post is how we run a red-team engagement. The full technical write-up stays under NDA, for the same reason it did yesterday: inside our php2shell lab explains why.

6 sourcesphp.net+5
  1. 01

    PHP, October 2026 security releases: fixed versions and the statement that updating is the only complete fix.

    php.net
  2. 02

    AWS Security, Amazon threat intelligence identifies php2shell exploitation prior to public disclosure in MadPot: the 17 October attempt and the "broadly exploited" wording with its caveat.

    aws.amazon.com
  3. 03

    Sophos, Proof-of-concept exploit released for PHP vulnerabilities 109618/109619: multiple attempts, one successful exploitation and the payload indicators.

    sophos.com
  4. 04

    Datadog Security Labs, php2shell: critical vulnerabilities in PHP: the urlencoded route, the pre-application parsing and the HTTP 200 caveat.

    securitylabs.datadoghq.com
  5. 05

    Tenable, php2shell frequently asked questions: the caution that unverified public PoCs can carry malware.

    tenable.com
  6. 06cisa.gov

Tags

  • #php
  • #php2shell
  • #rce
  • #exploit-db
  • #threat-intelligence
  • #detection
  • #patch
  • #cve-2026-109618

If you want a second pair of hands

Curious what our deliverables look like? Read a sample report.

Written by

Shadow Labs · Threat Intelligence

Shadow Labs is the research team behind Shadow Corp's penetration tests and incident response. We track the threats that reach Latin America and write guides that defenders can act on, with sources you can check.

Drafted with AI assistance and checked line by line against the primary sources cited here by a Shadow Labs editor before it went out, on October 22, 2026. The cover image was generated with AI. Read our editorial standards.

Spotted an error? Write to contact@sh4dowcorp.com and we will correct it publicly on this page.

From research to testing

Find out if this affects you.

Tell us what you want tested against this threat. We agree on scope on a short call. After the call, you get a written proposal within one business day.

Shadow Digest · Free preview

The blog explains. The Digest keeps you current.

This blog is public and evergreen: guides you can come back to. The Shadow Digest is our curated briefing for security teams. Every other Monday, Shadow Labs tells you what happened, whether it reaches Latin America, and what to do this week. Free during the preview; a paid plan for teams is coming.

By subscribing, you agree to receive the Shadow Digest by email (every other Monday, plus rare flash alerts). We email a confirmation link first. We store your address with our providers in the United States, and every email has a one-click unsubscribe link. See our privacy policy.