PHP2Shell in the wild: the first 48 hours on a honeypot fleet
Advisories describe what an attack could do. This guide summarises what actually arrived. OffSeq, which maintains this site, runs a fleet of decoy servers called Mirage, and recorded the PHP2Shell traffic that reached it between 18 and 22 October 2026. The full research report, with its method and limits, is linked at the end; this page keeps to what a defender needs.
The short version
- Nine source addresses in seven countries sent PHP2Shell-shaped requests to the fleet, eight of them between 20 and 22 October.
- Two groups. Five addresses used the session upload progress route that the PHP advisories describe; four sent oversized request bodies consistent with the out-of-memory route. OffSeq attributes the second group with lower confidence, by request shape only.
- It started before the fix. The earliest request with the full memory-pressure pattern reached the fleet at 21:57 UTC on 20 October, about sixteen hours before the fixed releases shipped. One oversized WordPress request, attributed by shape only, arrived on 18 October.
- The trigger was new. The
PHP_SESSION_UPLOAD_PROGRESSfield name appeared zero times across the fleet in the six weeks before 20 October. Every occurrence falls in the 20 to 22 October window. - The lead tool labels itself. Its requests carry the literal string
p2shellin the multipart boundary, which legitimate traffic does not contain.
How the first two days unfolded
| Time (UTC) | What the fleet recorded |
|---|---|
| 18 Oct | One oversized request against a WordPress endpoint, attributed by shape only |
| 20 Oct, 21:57 | First oversized memory-pressure request, from a cloud-hosted address, before any fix was public |
| 21 Oct, 14:00 | PHP ships 8.5.12, 8.4.27, 8.3.36 and 8.2.35 |
| 21 Oct, 16:21 | First session upload progress requests; the lead source runs a rapid, automated series of requests of increasing size |
| 21 Oct, 18:16 to 21:55 | Three more sources appear, each with its own recognisable variant of the request |
| 22 Oct, 02:30 | The lead source repeats its run |
| 22 Oct, 10:06 | A manual check from a further address |
What to search your own logs for
These signals are taken from the detection section of OffSeq's report. None is proof on its own, and a determined attacker can change most of them, so match on several together.
- The string
p2shellin aContent-Typeheader. OffSeq reports that no legitimate traffic contains it. - A
PHP_SESSION_UPLOAD_PROGRESSfield in multipart uploads, especially on sites with no upload progress feature. The field name is configurable, so treat it as strong but not sole evidence. - Form field names with very deep array nesting, far beyond anything your forms use.
- Bursts from one source whose request sizes climb steadily over a minute or two.
- Multipart bodies of several hundred kilobytes or more carrying a single field of repeated characters.
- On the server: a PHP-FPM, Apache or httpd process starting a shell or download tool, and memory-limit errors or worker crashes that line up in time with multipart POST requests.
The detection and response guide explains how to search error logs and what to do if anything matches.
Indicators
OffSeq published the source addresses and strings below. The addresses span VPS, cloud and anonymisation networks and several are shared infrastructure, so investigate matches rather than blocking them outright, and expect the list to age quickly.
| Indicator | Type | Context |
|---|---|---|
94.154.43.7 | IP address | Lead source, AS219502, GB; session upload progress with increasing request sizes |
38.180.45.91 | IP address | AS34702, EE; session upload progress variant, user agent B8RAT/1.0 |
80.66.66.66 | IP address | AS209702, FI; session upload progress variant |
217.60.242.76 | IP address | AS197974, IR; single minimal probe |
87.192.237.19 | IP address | AS8193, IE; manual check with curl |
34.19.34.88 | IP address | Google Cloud, US; oversized body, about 16 hours before the fix |
34.76.232.95 | IP address | Google Cloud, BE; oversized body |
34.76.218.47 | IP address | Google Cloud, BE; oversized body |
194.42.196.44 | IP address | US; 2 MB body against a WordPress endpoint on 18 October |
p2shell | String | Literal substring in the lead tool's multipart boundary |
B8RAT/1.0 | String | User agent of one session upload progress variant |
PHP_SESSION_UPLOAD_PROGRESS | String | Multipart field name used by the session route |
po10nn060000_efc8bc7e3e52_000000000000 | JA4H | HTTP fingerprint of the lead source |
po10nn150000_94b423c72d17_000000000000 | JA4H | HTTP fingerprint of the cloud-hosted oversized-body cluster |
Indicators published by Amazon
Amazon's threat intelligence team, which runs the MadPot honeypot network, published the addresses below with its report of the earliest known attempt. Amazon notes they include shared anonymisation infrastructure that is not exclusive to this activity, and advises investigating observations rather than blocking.
| IP address | Observed |
|---|---|
103.216.220.92 | 17 October 2026, four days before disclosure |
31.223.184.166 | 21 October 2026 |
37.19.200.5 | 21 October 2026 |
134.209.159.64 | 21 October 2026 |
103.114.163.188 | 21 October 2026 |
95.217.98.37 | 21 October 2026 |
What this changes for you
- Exploit tooling was circulating before the patch. Amazon's earliest observation is from 17 October, and it advises starting investigations from at least that date. If a server was internet-facing and unpatched in that window, treat the question "were we reached?" as open until you have looked.
- The traffic is automated and broad. Several sources, different variants, repeated runs against decoys that belong to no particular organisation: this is opportunistic scanning, and Amazon reports broad exploitation in the wild.
- Patching is still the fix. Nothing in the field data changes the remediation: install 8.5.12, 8.4.27, 8.3.36 or 8.2.35, or your vendor's fixed package, restart every PHP worker, and use the stop-gaps only where you cannot patch yet.
Sources
- Amazon Threat Intelligence identifies PHP2Shell exploitation prior to public disclosure in MadPot The earliest known attempt on 17 October, broad exploitation after release, indicators, and the advice to investigate from 17 October.
- PHP2Shell in the wild: the first 48 hours on a honeypot fleet The full research report: method and limits, the timeline, the per-source variants, detection signals and the complete indicator table.
- RCE via OOM corruption The out-of-memory route the oversized bodies are consistent with.
- RCE via stale global state The session upload progress route.
Questions
Related questions
Should we block these IP addresses?
We found the p2shell string in our logs. Were we compromised?
Do the decoys prove the attacks work?
Keep reading
More guides
-
Patching PHP2Shell: platform by platform
Where the fixed PHP packages are for Debian, Ubuntu, RHEL and its rebuilds, Fedora, SUSE, Alpine, Amazon Linux, Docker, control panels and managed hosts, and how to make sure the new binary is the one running.
Read the guide -
PHP2Shell on PHP 8.1, 8.0, 7.x and older
There is no official fixed release below PHP 8.2. What the PHP project provided for 7.4, 8.0 and 8.1, where distribution fixes come from, and what to do with anything older.
Read the guide -
PHP2Shell mitigations when you cannot patch yet
The configuration changes the PHP project published for systems that cannot be updated today, what each one blocks, what it breaks, and the two settings that make things worse.
Read the guide