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]
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:
| Target | Result 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 off | No execution; the memory leak failed |
PHP 8.4.26 with memory_limit=-1 | No 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
/tmpand 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 orPHP_SESSION_UPLOAD_PROGRESSdoes 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
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.
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
phpcommand line.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.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+3ShowHide
- 01php.net
PHP, October 2026 security releases: fixed versions and the statement that updating is the only complete fix.
- 02aws.amazon.com
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.
- 03sophos.com
Sophos, Proof-of-concept exploit released for PHP vulnerabilities 109618/109619: multiple attempts, one successful exploitation and the payload indicators.
- 04securitylabs.datadoghq.com
Datadog Security Labs, php2shell: critical vulnerabilities in PHP: the urlencoded route, the pre-application parsing and the HTTP 200 caveat.
- 05tenable.com
Tenable, php2shell frequently asked questions: the caution that unverified public PoCs can carry malware.
- 06cisa.gov
CISA, Known Exploited Vulnerabilities Catalog: KEV status check.




