On this page
Check for PHP2Shell compromise by looking back to 17 October 2026, the date AWS saw the first exploitation attempt, not just to the 21 October disclosure. Patching stops new attempts and removes nothing already planted. If your PHP was unfixed and reachable in that window, review logs, new files, accounts and scheduled tasks, then rotate the secrets your PHP user could read.
| Question | Answer at our 24 October 2026 check | Source |
|---|---|---|
| What is the bug | CVE-2026-109618 and CVE-2026-109619, CVSS v4 9.2; fixed in PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 or a vendor package | PHP notice |
| What a successful attack gives | Unauthenticated code execution as the web worker account | GHSA-w8hw-w9fx-j79w |
| Possible memory disclosure | Reported by researchers at Wiz; the PHP advisories describe code execution | Wiz |
| First observed attempt | 17 October 2026, AWS honeypot (vendor-claimed) | AWS |
| Confirmed compromise of a named site | None published by a primary source that we found | table below |
| In CISA KEV | Not as of 22 October per watchTowr; we could not search the live catalog | watchTowr FAQ |
The fix itself is covered in the PHP2Shell overview and the patch and restart guide. This page starts after the patch and answers the question those pages leave open.
Was my site hit before I patched?
Nobody outside your server can tell you yet. What exists is a record of attempts. We found no primary source that names a compromised site, and the sources disagree on how much activity there has been.
| Source | Date | What it says | Kind |
|---|---|---|---|
| AWS | 17 and 21 Oct | Attempts in its honeypots; unclear whether any would have worked on real systems | Vendor telemetry |
| watchTowr | 21 Oct, updated 22 Oct | Exploitation observed on its honeypot network; no victim details | Vendor telemetry |
| Cloudflare | 21 Oct, updated 23 Oct | WAF rules live at 03:02 UTC; saw attackers changing requests to evade them | Vendor-claimed |
| Patchstack | 21 Oct | Hosting partners reported incidents at 07:34 UTC; later telemetry showed probing only, no hard evidence of breaches | Vendor-claimed |
| Wordfence | 22 Oct | No confirmed compromises observed; cautions that some failures happen outside WordPress logs | Vendor-claimed |
| CISA | 21 Oct | Had not observed exploitation at the time of publication | Government |
Read that as "attempts yes, confirmed victims unpublished". The UK NCSC takes the cautious side of it: for systems that could not be updated at once, assess for compromise and look for backdoors before patching. Absence from the public record is a statement about reporting. It says nothing about your server.
How far back should I look?
Start on 17 October 2026. That is the earliest attempt AWS reports, and AWS advises investigating from that date, not from the disclosure. The window ends when the PHP workers serving the site were restarted on fixed code, which is the timestamp your host or your service manager can give you.
If you keep logs for longer, a wider net costs little. Sophos recommends reviewing from 1 August 2026. That date comes from Sophos's own framing and has no incident behind it in the sources we read, so treat it as a cautious option for teams with the retention to support it.
Logs may not reach back that far, or may never have held what you need. Sophos points out that many CDN and access logs do not record request bodies, and the PHP project's own advisory says clean logs do not prove safety. If the logs are thin, say so in your notes, because that gap is a finding too.
What are the indicators of compromise?
No source we read publishes a definitive file signature for PHP2Shell. The list below comes from the vendors that wrote hunting guidance. SentinelOne says these are leads, not verdicts, because memory errors and HTTP 500s also occur on healthy servers.
| Where | What to look for | Source | What it cannot tell you |
|---|---|---|---|
| Web, WAF or CDN logs | Multipart POSTs to endpoints that do not normally take uploads; requests carrying the session upload progress field name | AWS, Sophos | Legitimate applications use that field; presence is not an attack |
| PHP and web server error logs | Memory-limit fatal errors, bursts of HTTP 500, unexplained worker crashes or churn | Wiz, SentinelOne | Healthy servers log these too |
| Response cookies | Unexpectedly large or malformed PHPSESSID values | Wiz, Sansec | Points at the memory disclosure path only |
| Processes | PHP or web workers spawning shells, interpreters or download tools; outbound connections you cannot explain | CISA, watchTowr | Needs process or audit logging that was already on |
| Files | New or changed .php files in the web root, uploads, cache and tmp directories | watchTowr, Sophos | A planted file can be named anything |
| Accounts and schedules | New admin users, cron entries, scheduled tasks, SSH keys | watchTowr, SentinelOne | Persistence added by other means looks the same |
Wordfence, in a post republished on Malware News, lists file names seen in public proof-of-concept code, including wp2s.php, php2shell.php and axiom_*.php. Searching for them is cheap. A miss means little, because an intruder who read that list would pick a different name.
A separate WordPress incident overlaps the dates. Patchstack's alert describes attackers using stolen UpdraftCentral keys to install backdoors on connected sites. It is not part of PHP2Shell, so check for it on its own. If you run that plugin, what to do about the exposed UpdraftCentral keys has its own page.
Do I need to rotate passwords and keys?
No primary source requires a blanket rotation after patching, and none rules it out. Two facts drive the decision. Code execution as the web worker account reads whatever that account can read, which usually includes the database password and API keys in your config. And Wiz reports a path that can read worker memory without running code, which Patchstack takes as a reason to rotate credentials the server holds. The PHP advisories themselves describe code execution only.
| Your situation | Rotate? | Basis |
|---|---|---|
| Fixed PHP and restart on or soon after 21 October, no indicators, nothing sensitive in the PHP user's reach | Optional | Judgment. Memory disclosure may leave no trace, so high-value secrets are the ones to consider |
| PHP was unfixed and internet-reachable at any time since 17 October, no indicators found | Yes, after patching and restarting | Patchstack, Wiz. Absence of indicators is weak evidence here |
| Indicators found | Yes, after the host is rebuilt or cleaned, and again if you changed anything earlier | WordPress.org: change passwords after the site is known-good, then again |
| Shared or managed host | Rotate what you control, ask the host about the rest | You cannot rotate server-level secrets |
What to rotate, in the order that limits damage:
- Database user and password used by the site, then update the config that holds them.
- Payment, email, storage and third-party API keys the site uses.
- Hosting panel, SFTP, SSH and CMS admin passwords, and any API tokens for the host.
- WordPress authentication keys and salts, which also logs out every session.
- Application signing and encryption secrets, after checking what breaks. Rotating a framework key can invalidate sessions or stored encrypted data.
- TLS private keys if the server held them. Sansec lists them among the secrets the memory disclosure path can expose.
- Review the use logs of each old key for the window, then revoke it.
Never put a new secret onto a server you have not yet cleaned or rebuilt. Rotation limits what an intruder can do with old keys. It does not evict an intruder who is still on the machine.
What do I do if I find something?
Treat the whole host as compromised and plan for more than one bad file. The steps follow the WordPress.org hacked site guide and watchTowr's advice to preserve logs and files first.
- Write down what you saw, with times and time zone.
- Copy PHP, web server and WAF logs and the suspicious files somewhere off the server before you change anything.
- Take a snapshot of the whole site, even though it is infected.
- Patch PHP and restart the workers, so the same door is shut.
- Rebuild from known-good sources or restore a backup older than the earliest sign, onto the patched runtime.
- Reinstall CMS core, plugins and themes from official packages, and compare the rest against a known-good copy.
- Remove unknown admin users (finding a hidden WordPress admin is harder than it sounds), cron entries, scheduled tasks and SSH keys.
- Rotate secrets as above, from a trusted machine.
- Set
session.upload_progress.enabled=0if you do not use that feature. The PHP project's 23 October notice recommends it until the next bugfix release, which also covers CVE-2026-115560. - If you cannot do this with confidence, the UK NCSC recommends an assured incident response provider.
Questions for your host belong in a message you can forward. Send this one:
For [your domain], please send the web server and PHP error logs from 17 October 2026 to now, and tell me how far back your retention goes. Please also give the time the PHP workers serving it were restarted on a fixed package, and say whether you saw any PHP file changes, new accounts or scheduled tasks on my account in that period.
More on what a host can and cannot confirm is in what a host can confirm about PHP2Shell, and on who owns which step in who owns patching on shared hosting.
Am I affected? A three-state self-test
Am I affected? Where you stand right now
A passive check from outside sees a version at most. It cannot see your logs, your files or whether anyone was inside.
- Detected Your site serves PHP at a version below the fix for its branch. The look-back window is still open. Patch and restart, then work through the indicators above for 17 October onwards.
- Unknown The version is hidden, or could be a vendor backport, or you cannot say which runtime serves the host. This is the common case. Get the package identifier and the restart time from the server or host, and treat the window as open until you have them.
- Confirmed by owner evidence You hold the fixed package name or changelog entry naming both CVEs, and a restart or redeploy time after it. The window closed at that time. What happened before it is still open, and the checks on this page answer it.
No scan, ours included, moves you from "unknown" to "confirmed", and no outside check can say whether a site was compromised. The free scan is a lookup of the technologies and versions your site serves.
Why doesn't patching remove an intruder?
A patch changes the PHP engine from the moment the workers restart. A web shell, a new admin account or a cron entry added on 18 October is ordinary data on disk and in the database, and the new engine runs it as before. The PHP project calls updating the only complete fix for the flaws, and says nothing about cleaning up after them.
That is also why a restore can disappoint. A backup made after 17 October may carry whatever was planted, so choosing a clean restore point matters. A backup restored onto an unpatched server leaves the original hole open. The order that holds up is patch and restart, restore or rebuild from before the earliest sign, then rotate. The 10 minute response covers the patch side, and the tracker lists the other incidents this month that need their own checks. The rest of the incident response guides cover cleanup in more depth.
Questions people ask
Was my site hacked if I patched PHP after 21 October?
Possibly, and the patch cannot tell you. AWS saw the first attempt on 17 October, four days before the fixes shipped. No primary source had published a confirmed compromise of a named site at our 24 October check, so the honest answer is unknown until you have looked at your logs and files for the window.
Do I need to rotate passwords and keys after patching PHP2Shell?
If the site ran an unfixed PHP while reachable from the internet at any point since 17 October, rotating the secrets the PHP user could read is a sensible precaution. Wiz reports a memory disclosure path that may leave no trace in your application logs. If you find signs of compromise, rotate everything after you have cleaned or rebuilt, not before.
My logs look normal. Does that mean nobody got in?
No. The PHP advisory itself says clean logs do not prove safety, and Sophos notes that many CDN and access logs do not record request bodies. The flaws act before your application code runs, so your application logs may show nothing.
I restored a backup. Am I fine now?
Only if the backup predates the earliest possible access and PHP is fixed and restarted. A backup taken after 17 October can carry whatever was planted. Restoring an old copy onto an unpatched server leaves the same door open.
My host says it patched. Should I still look for signs of compromise?
Yes. A patch closes the door from that moment on. It does not remove a file, an admin account or a scheduled task that was added earlier. Ask the host for logs covering 17 October onwards and for the time its workers were restarted.
Have any websites actually been hacked through PHP2Shell?
Attempts are documented by AWS, watchTowr, Cloudflare and others. Wordfence said on 22 October it had observed no confirmed compromises, and we found no primary source naming a compromised site by 24 October. That describes what has been published, and it says nothing about a particular unpatched server.
Sources
- PHP security notice, 21 October 2026, and follow-up of 23 October (php.net)Fixed releases, scope, interim settings, the 23 October session upload progress notice and CVE-2026-115560. Checked 24 October 2026.
- GHSA-w8hw-w9fx-j79w: CVE-2026-109618 (php/php-src advisory)Reports unauthenticated remote code execution as the web worker account.
- GHSA-6wmf-4rv5-p3rp: CVE-2026-109619 (php/php-src advisory)Says clean logs do not prove safety; recommends session.upload_progress.enabled=0 even after patching.
- Amazon Threat Intelligence: PHP2Shell exploitation attempts in MadPot honeypots (AWS Security Blog)Vendor telemetry. First attempt 17 October; recommends investigating from 17 October.
- Wiz Research: PHP2ShellResearcher-reported memory disclosure path and the log signs to look for.
- UK NCSC: critical security issue affecting PHP (21 October, updated 23 October 2026)Assess for compromise and look for backdoors before patching systems that could not be updated at once.
- CISA alert: critical vulnerabilities in PHP require immediate patching (21 October 2026)No exploitation observed at the time of publication; monitor for PHP workers launching shells.
- CISA Known Exploited Vulnerabilities catalogNeither CVE appeared on the first page we could read on 24 October. Search the live catalog before relying on this.
- watchTowr: PHP2Shell remote code execution (published 21 October, updated 22 October 2026)Honeypot exploitation, and its list of things to check on a server.
- watchTowr FAQ: CVE-2026-109618 (updated 23 October 2026)States both CVEs were not in CISA KEV as of 22 October.
- Cloudflare: PHP vulnerabilities and WAF protection (updated 23 October 2026)WAF rules live 03:02 UTC on 21 October; reports attackers changing requests to dodge them.
- Patchstack: PHP major vulnerability alert (21 October 2026)Hosting-partner reports, later probing-only telemetry, and advice to rotate credentials the server holds.
- Sansec: PHP2Shell research (updated 22 October 2026)Store-specific checks; says the memory disclosure path can expose session tokens, API keys and TLS private keys.
- Sophos advisory SA-20261021 (updated 22 October 2026)Indicator list and a review window from 1 August 2026.
- SentinelOne: stopping PHP2Shell (21 October 2026)Process, file and log hunting guidance; states these are leads, not verdicts.
- Wordfence on PHP2Shell, republished on Malware News (22 October 2026)No confirmed compromises observed; lists file names and strings seen in public proof-of-concept code. Original Wordfence page not readable at our check.
- WordPress.org: FAQ My site was hackedRecovery order: document, snapshot, reset access, clean, then change passwords again.
Facts on this page are dated and point at the primary source next to them. If a vendor status changes after the date shown, the vendor's page wins; tell us at support@run.cloud and we will update it.