What Changed: From Staging to Active Scanning
For most of October, PHP2Shell was a story about two critical unauthenticated remote code execution flaws in the PHP runtime itself - the kind of bug that we covered in depth when the fixes landed. The actor behind it was preparation: infrastructure, tooling, target research. That changed in the early hours of October 24.
CYFIRMA's Version 3 advisory reports that at roughly 01:47 (channel time), the operators of a closed I2P channel - two Korean-speaking handles active since March 2026 - announced their first target set was ready: 216 hosts that still appear unpatched or only partially mitigated. The list arrived a day earlier than the operators themselves had predicted. By about 02:10, roughly one third of those hosts had already been touched by a separate set of 21 compromised scan nodes. CYFIRMA assesses with high confidence that the operation is North Korean state-nexus, affiliated with the Lazarus Group ecosystem (Lazarus, APT38, Hidden Cobra, ZINC / Diamond Sleet).
"Treat every internet-facing PHP host below 8.5.12, 8.4.27, 8.3.36 or 8.2.35 as exposed, and any host still advertising an older PHP version as a likely member of the operators' 216-host target set. Patch immediately, restart all workers, and hunt back to 17 October 2026, the earliest known exploitation." - CYFIRMA advisory, Version 3, October 24, 2026
Two boundaries matter for honesty here, and we keep them throughout this guide. First, what is confirmed: the channel and its tasking, the 216-host claim, the 21 scan nodes and their observed activity (PHP web shell tooling and session upload progress poisoning attempts). Second, what is assessed rather than proven: the Lazarus affiliation, the exact entry technique, and AI-assisted weaponisation of public proof-of-concept code. Mass compromise has not been confirmed, and no victim has been named.
Here is the timeline in one table:
| Date (2026) | Event | Source |
|---|---|---|
| March | Two operator handles begin coordinating in a closed I2P channel | CYFIRMA |
| October 17 | Earliest known exploitation - the hunt window opens here | CYFIRMA |
| October 20 | Technical details leak publicly, ahead of coordinated disclosure | CYFIRMA |
| October 21 | PHP ships fixes: 8.5.12, 8.4.27, 8.3.36, 8.2.35; CISA and CERT-EU publish alerts | PHP, CISA, CERT-EU |
| October 22-23 | CYFIRMA publishes its early warning (Versions 1-2) | CYFIRMA |
| October 24, ~01:47 | Operators report the 216-host target set ready; ~1/3 already scanned by ~02:10 | CYFIRMA |
| Next milestone | A refined shortlist of highest-confidence hosts; no launch date stated | CYFIRMA |
How the 216-Host Target List Was Built
The most operationally useful detail in the advisory is the filtering logic, because it tells you exactly what makes a host interesting to this actor. The operators did not keep every PHP server they found. They kept the ones that advertise weakness - and they recorded sector and country tags for each, with scan results written back into the same spreadsheet under a separate column.
| Kept on the target list | Dropped from the target list |
|---|---|
| Hosts still bannering an older, unfixed PHP version | Hosts bannering the fixed versions (8.5.12 / 8.4.27 / 8.3.36 / 8.2.35) |
| Hosts only partially mitigated | Hosts sitting behind heavy filtering |
| Hosts in the priority geographies and sectors | - |
The priority geographies named in the advisory are twelve: the United States, Japan, Thailand, Indonesia, South Korea, Australia, Taiwan, India, Singapore, the UAE, Saudi Arabia, and the European Union. The sector list runs to eight across three tiers, with government and financial institutions first, alongside logistics, airports and aviation, manufacturing, and online transaction platforms. PHP powers roughly three quarters of all websites whose server-side language is known, according to W3Techs - which is why a campaign like this builds a list rather than picking a single industry.
The tradecraft is patient, and that patience is the reason ordinary monitoring will not catch it. CYFIRMA describes low-and-slow pacing with deliberate avoidance of noisy sweeps, node rotation with logging of which addresses respond with expected indicators, and burn discipline: any node that meets filtering or rate limiting is marked, pulled from the active set, and never reused. If your defence plan is "our WAF would have blocked the scan," ask yourself whether it would have flagged a handful of paced requests spread across days - because that is the shape this activity takes.
The 21 Scan Addresses (and the Other 32)
These are the scan-node IPv4 addresses named in the Version 3 update, published by CYFIRMA in defanged form (dots replaced with [.] so the list can be shared safely - restore the dots before using them in firewall rules or log searches). Two cautions from the advisory itself: some of these nodes are compromised machines that may belong to victim organisations, so block and hunt rather than assume ownership; and these 21 supplement 17 earlier source addresses plus 15 staging addresses that remain valid, all listed in the full CYFIRMA advisory.
| # | Scan-node address (defanged) | Observed activity |
|---|---|---|
| 1 | 142.93.155[.]162 | Web shell tooling / session upload progress poisoning |
| 2 | 134.122.38[.]73 | Web shell tooling / session upload progress poisoning |
| 3 | 5.255.114[.]109 | Web shell tooling / session upload progress poisoning |
| 4 | 165.22.232[.]198 | Web shell tooling / session upload progress poisoning |
| 5 | 159.223.59[.]200 | Web shell tooling / session upload progress poisoning |
| 6 | 192.177.131[.]13 | Web shell tooling / session upload progress poisoning |
| 7 | 94.154.42[.]149 | Web shell tooling / session upload progress poisoning |
| 8 | 173.249.16[.]178 | Web shell tooling / session upload progress poisoning |
| 9 | 170.64.224[.]137 | Web shell tooling / session upload progress poisoning |
| 10 | 170.64.226[.]40 | Web shell tooling / session upload progress poisoning |
| 11 | 45.148.10[.]80 | Web shell tooling / session upload progress poisoning |
| 12 | 152.237.230[.]29 | Web shell tooling / session upload progress poisoning |
| 13 | 146.70.194[.]93 | Web shell tooling / session upload progress poisoning |
| 14 | 185.157.109[.]60 | Web shell tooling / session upload progress poisoning |
| 15 | 143.246.213[.]138 | Web shell tooling / session upload progress poisoning |
| 16 | 144.91.70[.]51 | Web shell tooling / session upload progress poisoning |
| 17 | 217.60.196[.]124 | Web shell tooling / session upload progress poisoning |
| 18 | 151.253.243[.]219 | Web shell tooling / session upload progress poisoning |
| 19 | 23.106.131[.]214 | Web shell tooling / session upload progress poisoning |
| 20 | 173.249.16[.]192 | Web shell tooling / session upload progress poisoning |
| 21 | 45.148.10[.]201 | Web shell tooling / session upload progress poisoning |
Check Your Server in Five Steps
- Check what your PHP service advertises. On the host, run
php -vand compare against the fixed versions (8.5.12, 8.4.27, 8.3.36, 8.2.35 - and remember 8.1 and older have no fix at all). From the outside, check whether your responses expose anX-Powered-Byheader or a version banner; hiding it is good hygiene, but if it is visible and old, the operators' selection logic would have kept you. - Hunt the 21 addresses in your access logs. Restore the dots, save the list to
php2shell-ips.txt, then search:grep -F -f php2shell-ips.txt /var/log/nginx/access.log(or/var/log/apache2/access.log). Include rotated logs withzgrep, and go back to October 17 - the earliest known exploitation date in the advisory. Any hit is a P1 incident: isolate, preserve, investigate. - Look for the attack shape, not the attack volume. Search error logs for PHP worker crashes and segfaults since October 17 - for php-fpm,
journalctl -u php8.3-fpm --since "2026-10-17"(adjust the unit name); for Apache, inspecterror_logfor child process crashes. On the access-log side, review POST requests to PHP endpoints that carry multipart/form-data bodies - CYFIRMA assesses crafted multipart requests as the entry route. The scanning is deliberately low-volume, so a clean rate-based alert means nothing. - Hunt for web shells. List PHP files modified since the hunt window opens:
find /var/www -name "*.php" -newermt "2026-10-17". Review anything you do not recognise, especially in upload and cache directories. The advisory specifically flags abuse of PHP's session upload progress feature, so also review unexpected files in your session save path and any oddsession.upload_progressusage. - Check egress and preserve evidence. Review outbound traffic for signs of I2P or other anonymising tunnels, which the advisory lists as a watch item. And if step 2, 3, or 4 turns up anything suspicious: stop and preserve first. Capture logs, memory, and disk images before patching or restarting - a restart destroys the state associated with CVE-2026-109619, and with it your best evidence.
The Seven-Day Response Plan
CYFIRMA structures its recommended actions in three priority tiers. This is the plan in full, with the owners the advisory assigns to each item:
| Priority | Action | Owner | Due |
|---|---|---|---|
| P1 - Now | Block or monitor the 38 source addresses (21 scan nodes + 17 Version 2 IPs); monitor and hunt the 15 staging addresses | Network / SOC | October 24 |
| P1 - Now | Patch and restart every worker - a reload that keeps old workers alive leaves stale state, and hosts still bannering older PHP are the ones kept on the list | Infrastructure | October 24 |
| P1 - Now | Isolate what cannot be patched within hours - Apache mod_php first; apply the per-CVE temporary controls in the advisory | Infra & Risk | October 24 |
| P2 - 72 hours | Hunt back to October 17 across extended windows - rate-based alerts will miss the low-and-slow pattern | SOC | October 27 |
| P2 - 72 hours | Preserve evidence before patching suspect hosts - a restart destroys CVE-2026-109619 state | Incident Response | October 27 |
| P3 - 7 days | Notify CERTs and brief leadership; watch for the Section 09 infrastructure, I2P egress, a launch statement, or the refined shortlist | CISO Office | October 31 |
Why the Restart Matters as Much as the Patch
This is the detail most coverage gets wrong, and it cuts both ways. Installing the fixed PHP packages is only half the job: PHP-FPM and Apache keep existing worker processes alive across a service reload, and those old workers still run the vulnerable code with stale state. CYFIRMA's advisory is blunt about the consequence - the hosts the operators kept on the target list are the ones still bannering older PHP after the fixes existed. A full restart (systemctl restart php8.3-fpm apache2, adjusted to your setup) is what actually retires the vulnerable workers.
But on a host where you suspect compromise, the same restart destroys evidence. The state associated with CVE-2026-109619 does not survive it. So the correct order on a suspect machine is the reverse of your instincts: preserve first (logs, memory capture, disk image), then patch, then restart. On a clean machine, patch and restart immediately - do not wait for a maintenance window that the actor may not respect.
Apache mod_php on Prefork: The Configuration They Like Most
CYFIRMA assesses - and we keep this in the assessed column, not the confirmed one - that the entry route is crafted multipart/form-data requests, with the highest success rate against Apache mod_php running in its default prefork multi-processing module. If that is your stack, the advisory places you first in the isolation queue: patch today, and if you cannot, pull the service behind filtering until you can. Running PHP through php-fpm instead of mod_php is a widely recommended long-term hardening step for exactly this class of memory-resident attack surface, independent of this campaign.
Running PHP 8.1 or Older? There Is No Patch Coming
The October 21 release covers the supported branches only: 8.5.12, 8.4.27, 8.3.36, and 8.2.35. PHP 8.1 and earlier have no official upstream fix for PHP2Shell and never will - those branches are end-of-life, the same way an operating system past its support date stops receiving security fixes. Your options are a version upgrade, isolation behind heavy filtering (which, notably, is one of the two things that got hosts dropped from the target list), or retiring the service. The PHP Foundation's release announcement and the official changelog list the affected versions in full.
Why This Story Sounds Familiar
A campaign that filters the internet for servers bannering weakness, then works a quiet list, is the server-side version of a pattern we keep seeing on the user side: attackers go where the door is already open. The Gemini incident showed three real companies compromised through credentials their owners had left in public, and most consumer-facing attacks still start with a fake warning or a spoofed message rather than a memory exploit - which is why we maintain guides on removing fake virus pop-ups, stopping email spoofing with SPF, DKIM, and DMARC, and reading email headers forensically. Defences layer: an unpatched runtime undoes everything the layer above it did right. Even fully patched systems still need their humans trained, the same way Windows Update failures like error 0x80073712 need fixing before the next Patch Tuesday - and the same month that shipped these PHP fixes also shipped KB5127648 with an exploited Windows zero-day and KB5124008 with two more. October 2026 has been a month where "I will patch next week" was the expensive answer on every platform.
Key Takeaways
- A suspected North Korean (Lazarus-nexus) operation moved from staging to active scanning on October 24, working a 216-host list of PHP servers that still banner unfixed versions - about a third already touched.
- The list is built on visibility: fixed-version banners and heavy filtering got hosts dropped; old banners got hosts kept, tagged by sector and country.
- Fix versions: PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 (October 21). PHP 8.1 and older will never receive a fix.
- Patch + full restart of every worker - a reload leaves vulnerable workers alive. But on a suspect host, preserve evidence first: the restart destroys CVE-2026-109619 state.
- Hunt logs back to October 17, 2026, for the 21 published scan addresses, multipart anomalies, worker crashes, and unexpected PHP files. Rate-based alerts will not catch this pattern.
Frequently Asked Questions
Has anyone actually been breached through PHP2Shell yet?
Confirmed: active scanning, web shell tooling attempts, and session upload progress poisoning attempts from the 21 nodes, with exploitation evidence dating to October 17. Not confirmed: mass compromise or named victims. CYFIRMA's imminence index sits at 78 out of 100 - high, but below the 90 that would indicate confirmed mass compromise.
I installed the October 21 PHP update. Am I safe now?
From these two CVEs, yes - provided you also performed a full restart of PHP-FPM or Apache so no pre-patch workers remain, and your service no longer banners an old version. If either is untrue, you are still in the profile the operators kept.
I run WordPress. Does this affect me?
PHP is the runtime underneath WordPress, so the vulnerability is in your server's PHP version, not in WordPress itself - plugin updates cannot fix it. On managed hosting, ask your provider which PHP branch you are on and whether they restarted workers after October 21; the fixed versions are 8.5.12, 8.4.27, 8.3.36, and 8.2.35.
Why are the IP addresses written with [.] instead of a dot?
Defanging is a threat-intelligence convention that prevents the addresses from becoming clickable or auto-resolving in documents and browsers. Replace [.] with . when you paste them into firewall rules or log searches.
What if I cannot patch this week?
Follow the advisory's isolation priority: Apache mod_php services first, apply the per-CVE temporary controls published in the CYFIRMA advisory, and put heavy filtering in front of the service. Filtering is one of the two characteristics that got hosts dropped from the target list - it works on this actor's own selection logic.
- CYFIRMA - Suspected DPRK Campaign staging PHP2Shell Targeting (Version 3)
- PHP.net - Security release archive, October 21
- The PHP Foundation - Security release announcement
- CISA - Critical Vulnerabilities in PHP Require Immediate Patching
- CERT-EU - Security Advisory 2026-018
- Unit 42 - CVE-2026-109618 / CVE-2026-109619 analysis
- Tenable - PHP2Shell FAQ
- watchtowr - PHP CVE-2026-109618 FAQ
- W3Techs - PHP usage statistics
Get US tech fixes weekly
No spam. Unsubscribe anytime. Tested on Windows 11 24H2.

Comments
Comments
Post a Comment