On this page
- Which client sites do I check first?
- How do I group client sites so the right person gets asked?
- What counts as evidence for one client site?
- A client's scanner says a patched site is vulnerable. Who is right?
- What do I send a host that says "we are on PHP 8.3"?
- What do I tell the client?
- Were client sites hit before we patched?
- May I scan or touch a client site?
- What is the order of work this week?
To triage client sites for PHP2Shell (CVE-2026-109618 and CVE-2026-109619), list every domain, group the sites by who controls the PHP runtime, and collect one piece of evidence per site: the fixed package or build name plus a restart or redeploy time after it. A version banner, a panel label or a host's reassurance is not evidence.
| Fact | Detail | Source |
|---|---|---|
| Bugs | CVE-2026-109618 and CVE-2026-109619, unauthenticated remote code execution in PHP core, CVSS v4 9.2 | PHP notice |
| Fixed upstream releases | 8.5.12, 8.4.27, 8.3.36, 8.2.35. Affected means below these on each branch | GHSA-w8hw-w9fx-j79w |
| Older branches | 8.1 and older get no project release. PHP published source backports for 7.4, 8.0 and 8.1; vendors ship their own | PHP notice |
| Scope | Every PHP installation serving web requests: mod_php, PHP-FPM, CGI, FrankenPHP, LiteSpeed | PHP notice |
| Attempts | First honeypot attempt 17 October (AWS, vendor-claimed). No confirmed client compromise published by a primary source at our check | AWS |
| CISA KEV | Neither CVE listed at our 22 October check. Re-check before relying on this | CISA |
| Checked | 24 October 2026 | this page |
Which client sites do I check first?
Every site that serves PHP, which means every WordPress, WooCommerce, Magento, Shopware, Drupal and Laravel client, plus anything a builder generated on a PHP host. The bug sits under the application, so plugin updates close nothing. The full scope of affected PHP builds is laid out separately.
The UK NCSC asks for an inventory first, covering every PHP install, old or new, internet-facing systems first. CERT-EU says end-of-life branches are affected too. The Canadian Cyber Centre adds that appliances, applications and containers can bundle PHP without anyone calling it PHP. For an agency that means staging copies and forgotten microsites as well as the main sites.
Within that list, start with stores and sites holding personal data, then end-of-life PHP, then the rest. PHP 8.2 reaches end of life on 31 December 2026, per the PHP notice, so a site pinned to 8.2 has a second reason to move.
How do I group client sites so the right person gets asked?
Group by who can change the PHP runtime, because that person owns the evidence. Our responsibility guide explains the layers.
| Who controls PHP | Typical client sites | Who you ask | Evidence to request |
|---|---|---|---|
| You (VPS or dedicated you administer) | Agency-run servers, staging | Yourself | Package changelog naming both CVEs, service start time after install |
| Managed WordPress host | Care-plan sites on a managed platform | Host support, per site | Build or backport identifier for the environment, restart time |
| Shared or reseller host | Small brochure sites | Host support or reseller | Same, for each PHP version selector the domain can use |
| Client-owned hosting | Client holds the hosting login | The client, then their host | A forwarded host reply, dated |
| Container or PaaS | Apps you deploy | Yourself or the platform | New image digest, redeploy time, build log showing the runtime |
| Bundled product | Builder, appliance, SaaS add-on | The vendor | A vendor advisory or release note naming the fix |
Two traps recur. A cPanel server can assign a different PHP version to each domain, so one host answer can be true for one client and false for the next. And a managed host that resolved an incident has not necessarily told you anything about your site: Kinsta's status note marked the rollout resolved on 22 October at 08:26 UTC but published no per-site build or restart time, as we set out on the Kinsta page. At WP Engine we found no dated PHP2Shell note at all, so that status is unknown.
What counts as evidence for one client site?
Keep a ledger with one row per domain. A row is complete when it answers "can you prove it?" without a phone call.
- Domain, client, host, and the person who can change PHP.
- The PHP handler and which PHP version the domain uses (for the domain itself).
- The package, build or image identifier, and where the changelog or build log names both CVEs.
- The restart or redeploy time, which must be later than the install time.
- Who said it, on what date, and the message itself saved with the row.
- State: detected, unknown, or confirmed by owner evidence (defined below).
- Date the client was told, and what they were told.
A client's scanner says a patched site is vulnerable. Who is right?
Often the scanner is reading a banner. Debian's security FAQ says it backports fixes into the version it shipped, so a package can carry the old number and still hold the fix. Plesk's change log records the fix backported on 21 October to PHP 8.1.34, 8.0.30 and 7.4.33 on Linux, with those numbers unchanged. Canonical lists 8.1.2-1ubuntu2.28 as the fixed package on Ubuntu 22.04.
A banner can be wrong in the other direction too. A site that hides its version, or sits behind a proxy, shows nothing, and a package that was updated but never restarted still runs old code. Canonical says the application likely needs a restart or the system a reboot, and watchTowr's FAQ gives the same instruction to restart workers.
So when a client forwards an alert, answer with the ledger row. Send the package changelog or build record and the restart time, and ask the scanner's operator to retest against that evidence. If the row is empty, ask the host.
What do I send a host that says "we are on PHP 8.3"?
A branch number answers nothing. Send this, per domain, and save the reply. Our shared hosting page has the longer version.
For [client domain], which PHP build serves web requests, and does its package changelog name CVE-2026-109618 and CVE-2026-109619? Please give the build or backport identifier, the date and time the workers serving this domain were restarted or replaced, and whether we need to redeploy or change a setting. Please reply in writing so we can forward it to our client.
Read the answer against this table.
| What the host says | What it shows | State | Next step |
|---|---|---|---|
| Names the build, says both CVEs are in it, gives a restart time | Both things that matter | Confirmed by owner evidence | File it with its date |
| "We are on 8.3" or "your panel shows 8.3" | A branch label | Unknown | Ask again for build and restart time |
| "Fixed across the platform" with no build or time | A claim without evidence | Unknown | Reply with the two missing items |
| "You are not affected" | A statement | Unknown | PHP says all web-serving installations are in scope; ask which build serves the domain |
| "Cloudflare protects you" | An extra layer | Unknown | Cloudflare still says to patch |
| No reply after your deadline | Nothing | Unknown | Escalate via the account owner; tell the client |
If a host cannot confirm, the interim settings in the PHP notice reduce exposure and do not replace the update: session.upload_progress.enabled=0 set where it applies before request parsing, then every worker restarted. Test an upload and a checkout afterwards, since changes to request handling can break both.
What do I tell the client?
Say what you can show, with a date, and say what you are waiting for. Avoid "we patched PHP immediately" unless the row backs it, because it draws a request for proof. Ready-made client email templates cover other situations too.
Update on [domain], [date]. PHP, the language your site runs on, had two serious flaws disclosed on 21 October. Status for your site: [confirmed: your host confirmed in writing on (date) that the fixed build is serving your site and was restarted at (time) / unknown: we have asked your host to confirm the fixed build and restart time and expect a reply by (date)]. We will write again when that changes. We are also reviewing logs from 17 October for signs of earlier activity.
For clients with a smaller site and no technical contact, the ten minute response page is written for them and can be forwarded as is.
Am I affected? Where each client site stands
A check from outside can read headers and version hints. It cannot see the package changelog, which runtime serves a virtual host, or when workers last started.
- Detected The site serves PHP and the version it shows is below the fixed release for its branch. Treat it as exposed. Ask the host or patch and restart today, and tell the client the site is awaiting a fix.
- Unknown The version is hidden, could be a backport, or you cannot tell which PHP serves the domain. This is the common case across a portfolio. Get the build and restart evidence from whoever runs the server.
- Confirmed by owner evidence You hold a package or build identifier naming both CVEs and a restart or redeploy time after it. The runtime is updated. Whether anything got in earlier is a separate question.
No scan, ours included, moves a site from "unknown" to "confirmed".
Were client sites hit before we patched?
Start the look-back at 17 October, four days before disclosure. AWS recorded its first honeypot attempt that day and advises starting review from at least then. AWS also says it is unclear whether any attempt would have worked on a real system, and its listed addresses are shared infrastructure to investigate rather than block. watchTowr reports its own honeypot attempts from 21 October. All of that is vendor telemetry.
The government position is cautious. The Canadian Cyber Centre said in its 23 October update that it had not identified active exploitation, and warned that could change quickly. No primary source we read names a compromised client site, so do not tell a client that theirs was or was not hit. Tell them the window you checked and what you looked at.
For each exposed site, look at the web server and PHP logs for the window, unexpected PHP files in upload directories, new administrator accounts, scheduled tasks you did not create, and unfamiliar outbound connections. If anything looks wrong, preserve logs before you clean, and rotate credentials the PHP user could read. Deleting one odd file does not end an investigation.
One separate incident overlaps the dates. TeamUpdraft says unauthorised access to its customer database included UpdraftCentral connection keys, and released UpdraftPlus 1.26.13 and 2.26.13 on 19 October. Its notice does not tie that incident to PHP. If you manage client sites through UpdraftCentral, handle it as its own checklist, alongside this one; the wider risk of agency management plugins is covered separately.
May I scan or touch a client site?
Get the client's written agreement first, and keep two permissions apart: checking and changing. If a site is later hacked, who carries the liability depends on your contract. A domain owner can prove control of a domain, but that does not mean your client has agreed to what you plan to do on their host account.
On the Red side, the free scan reads the stack a site serves and matches each version to known vulnerabilities, one scan per domain. You prove ownership by adding one DNS TXT record, so the client or whoever holds their DNS has to do that step. It is a lookup. It can say a version is affected. It cannot say whether a given setup is exposed, see a vendor backport, which runtime serves a virtual host, or whether workers restarted. Use it to find sites where the banner already looks old. Do not use it as a clearance. A full scan costs $100 per scan and is ordered from the dashboard once the free scan has run.
What is the order of work this week?
- Today: build the ledger from your hosting accounts, billing list and DNS. Mark each site's controller. Send the host question for every managed and shared site.
- Today: patch and restart the servers you administer, then record the package and the service start time.
- Within 48 hours: send each client a dated status in the three-state wording. Chase hosts that have not replied.
- Within 48 hours: start the look-back from 17 October on stores and sites holding personal data.
- This week: decide, with each client, what happens to sites on end-of-life PHP with no vendor backport: move, or accept a documented interim.
- This week: schedule 8.2 sites to move before 31 December 2026.
More agency guidance is on the agency and MSP security pages. The wider picture is in the October 2026 tracker. Server-side steps are in the fix and verify guide.
Questions people ask
What do I tell clients who ask whether we patched PHP?
Tell them only what you can show. If you hold a package or build name that lists both CVEs and a restart time after it, say the runtime serving their domain was updated on that date. If you only have the host's word, say you have asked for written confirmation and give the date you will follow up.
A client's scanner says a site we patched is still vulnerable. Who is right?
Possibly both. Many scanners read the version banner, and distributions and panels backport the fix without changing the number. Send the scanner's finding and your package changelog or build record to whoever runs the scan, and ask them to retest against the evidence rather than the banner.
Do I need written consent before I scan or touch a client site?
Get it. A domain owner can prove control with a DNS record, but your client should still agree in writing to what you will check and when. Keep checking and changing as separate permissions, and never act on a client host account you were not given.
Is Cloudflare in front of the client site enough to wait?
No. Cloudflare says its rules are an extra layer and tells customers to patch, and the rule covers the default upload-progress field name only. Traffic that reaches the origin another way is not covered. Treat the WAF as time bought while you patch.
How far back should I look for client sites hit before the patch?
AWS recorded its first honeypot attempt on 17 October and advises starting log review from at least that date. Check from 17 October to the time the patched runtime was restarted. Patching does not remove anything that was planted earlier.
The client's host will not give a build or a restart time. What now?
Record the site as unknown, escalate through the account owner, and tell the client plainly what is missing. If the site is a store or holds personal data, ask the host for the interim settings in the PHP notice and decide with the client whether to move it.
Sources
- PHP security notice, 21 October 2026, and 23 October follow-up (php.net)Fixed releases, scope, source backports for 7.4, 8.0 and 8.1, interim settings, 8.2 end of life on 31 December 2026, and the separate CVE-2026-115560 notice. Read 24 October 2026.
- GHSA-w8hw-w9fx-j79w: CVE-2026-109618 (php/php-src advisory)Affected versions are those below 8.2.35, 8.3.36, 8.4.27 and 8.5.12. Read 24 October 2026.
- GHSA-6wmf-4rv5-p3rp: CVE-2026-109619 (php/php-src advisory)States that worker recycling and multiple workers reduce the chance of success but do not remove the condition. Read 24 October 2026.
- Amazon Threat Intelligence: PHP2Shell attempts seen in MadPot honeypots before disclosure (AWS Security Blog)Vendor telemetry. First attempt 17 October; AWS says it is unclear whether any attempt would have worked on a real system; start log review from at least 17 October. Read 24 October 2026.
- UK NCSC: critical security issue affecting PHP (21 October 2026, updated 23 October)Inventory all PHP, update internet-facing systems first, monitor vendors that bundle PHP, consider taking a system offline if it cannot be mitigated.
- Canadian Centre for Cyber Security alert AL26-026 (21 October 2026, update 1 on 23 October)Had not identified active exploitation at update 1; notes a proof of concept exists. Tells operators to find appliances, applications and containers that bundle PHP.
- CERT-EU security advisory 2026-018 (version 1.2, 23 October 2026)Patch immediately or isolate; end-of-life branches are also affected; vendor backports; says one third-party repository would not have updates on release day.
- Dutch NCSC advisory NCSC-2026-0443 (21 October 2026)Fixed versions and source patches for 7.4, 8.0 and 8.1; distribution users apply vendor updates.
- watchTowr: PHP2Shell FAQ (updated 23 October 2026)Vendor-claimed exploitation seen on its honeypots from 21 October; restart workers after updating; KEV status as of 22 October.
- Cloudflare: WAF protections for the PHP vulnerabilities (21 October 2026, updated 23 October)Rules live from 03:02 UTC on 21 October; cover the default upload-progress field name only; Cloudflare still says to patch.
- Debian security FAQ: version numbers and backported fixesDebian backports fixes into the shipped version, so the version number alone does not show whether a package is fixed.
- Canonical: PHP2Shell vulnerability fixes available (Ubuntu blog, 21 October 2026)Fixed package per release (for example 8.1.2-1ubuntu2.28 on 22.04); the application likely needs a restart, or the system a reboot.
- Plesk Obsidian change log: PHP updates of 21 October 2026Lists the fix backported to PHP 8.1.34, 8.0.30 and 7.4.33 for Linux, with those version numbers unchanged.
- TeamUpdraft: security incident notice (19 to 23 October 2026)A separate incident that touches agencies using UpdraftCentral. Fixed plugin versions 1.26.13 and 2.26.13.
- CISA Known Exploited Vulnerabilities catalog (release 2026.10.23)Neither CVE was listed at our 22 October check. Re-check before relying on this.
- cPanel docs: about EasyApache 4A cPanel server can assign a different PHP version to each domain.
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.