Qualys Risk Response Playbook · October 2026

PHP2Shell: from exposure to verified remediation

2 critical flaws in the PHP runtime let attackers run code on your web servers without logging in. Follow 5 steps to find every PHP installation, reduce exposure today, and prove the fix.

CVE-2026-109618CVE-2026-109619

At a glance

Critical · CVSS 9.2
0Logins or user clicks an attacker needs
73%of PHP installations sit on internet-facing assets
0.13%of PHP installations patched within 12 hours of disclosure
Oct 20, 2026Upstream fix released
Start here

Find your path

Answer 4 questions about a server or server group. The playbook shows its priority, whether its PHP version is fixed, and the fastest stopgap available to you.

We filled in example answers. Change them to match your server.

1How does this server run PHP?
2Can it be reached from the internet?
3Which PHP version serves web requests?

php -v can report a different installation than the one serving requests.

4What Qualys coverage does it have?
The threat in brief

2 flaws, 1 outcome: remote code execution

Both bugs live in the PHP runtime, so they can fire before your application code runs. Exploitation depends on allocator layout, build and worker scheduling.

CVE-2026-109618

Memory corruption after out-of-memory errors

What breaks
An out-of-memory error leaves request data half-initialized, and cleanup treats it as valid.
Result
Invalid memory access during request shutdown
Requests
1 per attempt under mod_php
Advisory
GHSA-w8hw-w9fx-j79w
CVE-2026-109619

Stale global state

What breaks
PHP keeps references to request data after its memory is freed. The next request on the same worker reads them.
Result
Heap use-after-free and memory disclosure
Requests
2, on the same worker
Advisory
GHSA-6wmf-4rv5-p3rp

Who is at risk, most urgent first

Highest
Apache mod_php

Researchers demonstrated RCE for both CVEs, including with default limits and the prefork MPM. The exploit can fire before app code runs.

High
PHP-FPM

FPM's startup behavior blocks 1 out-of-memory path, but the PHP security team confirmed RCE through the session lifecycle.

At risk
php-cgi, FrankenPHP, LiteSpeed

Your configuration and application decide how exploitable these are.

Hidden
PHP you didn't deploy

Parallel branches, container images, hosting panels and PHP bundled in appliances.

Why act now

Attacks are live. Cloudflare has reported attack traffic, including attempts to evade its protections.

Exploit code is public. Proof-of-concept scripts have spread quickly on GitHub.

Secrets can leak. Worker memory can expose passwords, tokens and API keys, without authentication.

Qualys TRU data · 10,000+ customers
167MPHP installations found
156Mwith a known version
110M end-of-life (5.4–8.1) 44M supported (8.2–8.5), unpatched
The response

5 steps to verified remediation

Each step starts with its goal and what "done" looks like. Open the details only when you need them.

1
Step 1 · Find

Find every PHP installation

CSAMPHP2Shell Fightback dashboardInstaScanDeep ScanTotalCloudContainer SecurityTotalAppSec
Goal

Build one inventory of every PHP installation, including the hidden and end-of-life ones, and see it in one view. You can't protect PHP you don't know about.

Done when

You've tagged every PHP asset, including containers, hosting panels and appliance-bundled PHP.

Run these queries in CSAM › Inventory › Assets

Save each as a dynamic tag, for example "PHP2Shell – EOL PHP". Matching hosts join automatically, and you can reuse the tag in VMDR, dashboards and patch jobs.

All assets running PHP
(software: ((name: "php")))
End-of-life PHP (8.1 and earlier)
((software: (((name: "PHP") AND (version: (*..8.1))))))
End-of-life PHP on business-critical assets
((asset.criticalityScore: [4..*)) AND (software: (((name: "PHP") AND (version: (*..8.1))))))
Reach PHP in hard-to-find placesInstaScan, Deep Scan, cloud, containers and web apps

InstaScan (Agent Insta)

Matches new vendor advisories (Red Hat, Ubuntu, Debian, Oracle Linux) against inventory you already have, typically within minutes. No new scan needed.

VMDR Deep Scan

Finds PHP binaries in custom folders and secondary drives, with path, installed version and fixed version. Requires Windows and Cloud Agent 6.2 or later. Included with VMDR.

TotalCloud and Container Security

Find PHP in AMIs, images, Kubernetes and serverless. Runtime Vulnerability Reachability (eBPF) shows which vulnerable packages are actually running.

TotalAppSec

Flags web apps and APIs that expose a PHP version, including ones missing from host inventories. Treat it as an indicator, not proof.

See it in one place

PHP2Shell Fightback dashboard

One place to find every PHP instance in your environment, see which ones are actually at risk, and decide what to fix first.

Download the dashboard
Know your full PHP footprint
  • Every asset running PHP, with detections from the past week
  • Source-based discovery, showing how each instance was found
  • Safe instances separated out, so you can focus on what needs attention
See where the real risk is
  • Internet-facing instances and attack surface exposure
  • End-of-life and unpatched PHP versions, with EOL and EOS breakouts
  • Apache HTTP Server mod_php risk
  • General web service and header exposures
Prioritize and act fast
  • PHP2Shell prioritization, with high-risk assets grouped by OS
  • InstaScan detections of PHP2Shell in under a day
  • Detection age and state (active, fixed, reopened) to track progress
Set up the dashboardDownload, import and open it in 3 steps
  1. Download the dashboard from the PHP2Shell blog using the button above.

  2. Import the file into the Unified Dashboard module.

  3. In the Dashboard tab, open the Dashboard Picker and select PHP2Shell Fightback. Its widgets start showing PHP data from your subscription.

Your subscription doesn't include this dashboard by default, so download and import it yourself, or ask your TAM for help. Turn on Trending for the remediation widgets to show leadership how exposure falls as you mitigate and patch.

Qualys keeps tuning and updating the dashboard as new CVEs and patches roll out for each PHP version.

QID 45110 (PHP Server Detected) finds installations but doesn't confirm a vulnerability. Use it as your discovery baseline.

2
Step 2 · Detect & prioritize

Detect, confirm and prioritize

VMDRTotalAppSecTotalCloudContainer SecurityETM TruConfirm
Goal

A vulnerable version isn't always an exploitable system. Detect with QIDs, then confirm with ETM TruConfirm so your team works on real risk first.

Done when

You have a ranked list of vulnerable systems, each with an owner and a deadline.

Core detection QIDs

QIDWhat it detectsNotes
45110PHP Server DetectedInventory
48394PHP Installation and Configuration DetectedInventory
389102PHP2Shell multiple vulnerabilitiesCloud Agent
Container Sensors
39033PHP2ShellUnauthenticated
39036, 389141Session upload-progress RCE (CVE-2026-115560)Coming soon
520310, 533086PHP2Shell checks for web apps and APIsTotalAppSec
520404Session upload-progress RCE in web appsTotalAppSec
533068PHP2Shell intrusive checkCan crash unpatched apps

Run QID 533068 carefully. Use it only in non-production or on verified-patched systems, with approvals, inside a maintenance window.

Find the QID for your platform33 distribution and vendor QIDs, filterable
QIDAdvisory

Source: the Qualys blog. Qualys adds QIDs as vendors publish advisories, so also search the KnowledgeBase by CVE.

How ETM TruConfirm validates safely

  1. Verify the target runs PHP.

  2. Send a benign probe: an upload request that mimics an attacker's first move, with no files, no code and no memory pressure.

  3. Confirm exposure: PHP startup warnings show the entry point is reachable and session.upload_progress.enabled=0 is missing.

ETM TruConfirm raises the TruRisk score of each confirmed exposure and moves it up the queue with evidence attached.

Rank confirmed assets in this order

  1. Internet-facing Apache mod_php

  2. Other publicly reachable PHP services

  3. Business-critical apps, using the CSAM criticality score

  4. End-of-life branches that need an upgrade or backport plan

How validation narrows the list: a customer example

All assets with PHP
1,539
Running a vulnerable version
138
Also internet-facing
63
Confirmed exploitable
25

98.4% fewer assets to act on first. Start mitigation with the confirmed 25, then work through the rest. A negative result doesn't prove every path is closed, so keep patching.

Why not test production with a public exploit?4 risks of running PoC scripts on live servers
Ties up workersSome hold an upload open for about a minute or force out-of-memory, starving real traffic.
Writes to diskThey store PHP code in a real session file, which an interrupted run can leave behind.
Walks the bugThey trigger the memory corruption itself, which can crash a worker on an unpatched build.
May be fakeLook-alike exploit code is common. Check what it connects to and writes before trusting it.

Run PoCs only on a snapshot clone in an isolated lab. To your WAF and SIEM, PoC traffic looks like a real attack.

3
Step 3 · Mitigate

Reduce exposure today

TruRisk EliminateMitigate NowCAR library
Goal

Turn off session upload progress and harden the related session-handling configuration on every host that's waiting for a patch. You change configuration only, not application code.

Done when

Every PHP worker runs the new config, Qualys confirms the effective configuration, and you've tested apps that use upload progress.

Hosts with Cloud Agents

  1. In TruRisk Eliminate, go to Home › Overview › PHP2Shell Remediation.

  2. On the Agent-Based Remediation widget, select View Risk Elimination to open the affected assets.

  3. Apply the Qualys mitigation via Mitigate Now, or deploy the vendor patch when one is available, such as Ubuntu's PHP security updates.

Mitigate Now also appears for vulnerable detections on your Qualys dashboards, including the PHP2Shell Fightback dashboard. Requires the Qualys Cloud Agent.

Hosts without an agent

  1. In TruRisk Eliminate, go to Home › Overview › PHP2Shell Remediation.

  2. On the Agentless Remediation widget, select View Risk Elimination to open your scanner-based assets, such as appliances and network devices.

  3. Run the PHP2Shell mitigation script from the Custom Assessment and Remediation (CAR) library directly on those assets.

Both routes disable the PHP session upload-progress feature, restart the PHP service automatically, and verify that the setting is active and not overridden. Review the execution logs and restart PHP manually if a restart is still required. The mitigation works on end-of-life PHP too, but it's temporary: updating PHP is the only complete fix.

About the PHP2Shell Remediation widgetsNew in TruRisk Eliminate 4.2.1.1, October 27, 2026

The PHP2Shell Remediation section on the TruRisk Eliminate Home page shows your exposure as soon as you log in, with no query to build. It's marked Critical and lists the CVEs it tracks. Counts come from open VMDR detections for the QIDs tied to CVE-2026-109618 and CVE-2026-109619.

WidgetCoversShowsView Risk Elimination opens
Agent-Based RemediationAssets with the Qualys Cloud AgentDetections: open PHP2Shell detectionsThe affected assets, ready for Mitigate Now or the vendor patch
Agentless RemediationScanner-based assets without the agent, such as appliances and network devicesAssets Affected: assets with at least 1 open PHP2Shell detectionThe scanner-based assets, ready for the CAR mitigation script
  • Each widget opens the matching workflow, so you don't have to look up the affected assets and QIDs yourself.
  • After you mitigate, test applications that use PHP upload progress.
  • After you patch, restart every service that loads PHP so running workers pick up the fixed build.

Source: TruRisk Eliminate Release 4.2.1.1 release notes. VMDR customers can start a 15-day free trial of TruRisk Eliminate from the PHP2Shell prompt in VMDR, or ask their TAM.

No Qualys route? Apply PHP's temporary hardening by handSettings, what each one blocks, and a copyable config
CVESettingWhat is disabled
CVE-2026-109619session.upload_progress.enabled = OffThe confirmed session attack paths
fatal_error_backtraces = OffThe mod_php backtrace path (PHP 8.5 only)
Remove per-request INI settingsDiagnostics raised before initialization, from Apache php_value, .htaccess or a front end's PHP_VALUE
pm.max_requests = 1State carried between requests (optional FPM pool directive, costs performance)
CVE-2026-109618memory_limit = -1The memory-limit failure an attacker can trigger (temporary)
post_max_size = 8M / 32MSmaller request body for out-of-memory attempts (32M only if you accept uploads)
Lower nesting and upload counts, limit at the proxyThe documented multipart out-of-memory triggers
Per-worker cgroup memory limitAn availability boundary. Never use RLIMIT_AS or RLIMIT_DATA, which can trigger the bug
FPM pool or Apache config · php_admin_value can't be overridden by the app
; CVE-2026-109619
php_admin_value[session.upload_progress.enabled] = 0
php_admin_value[fatal_error_backtraces] = 0   ; PHP 8.5 only
pm.max_requests = 1                           ; optional, FPM only

; CVE-2026-109618 (temporary)
php_admin_value[memory_limit] = -1            ; restore a finite limit after patching
php_admin_value[post_max_size] = 8M           ; 32M if you accept uploads
; keep upload_max_filesize below post_max_size
  • Enforce decoded request-size limits at the web server or proxy, including requests without a usable Content-Length. Block multipart if the app doesn't use it.
  • Fix fatal errors and timeouts attackers can trigger in callbacks, uploads, imports and cleanup. Changing timeout values alone doesn't help.
  • memory_limit = -1 removes PHP's per-request cap, so watch for resource exhaustion while it's in place.

Set these administratively. ini_set() and .user.ini can't hold them, and hiding errors with error_reporting, display_errors or @ doesn't stop the underlying access.

4
Step 4 · Layer

Layer the controls you already own

WAFIPSEDR
Goal

Use your WAF, IPS and EDR to shrink exposure while patches roll out. Each layer catches what the one before it misses.

Done when

You've enabled the vendor rules, confirmed their IDs in your console, and verified each EDR policy fires for your PHP workers.

PHP2Shell 3rd-party mitigation and compensating controls

Select the WAF, IPS, and EDR you run to see the exact signatures and policies each vendor has released for CVE-2026-109618 and CVE-2026-109619, ready to copy into your console.

The WAF stops requests at the edge, the IPS on the network, and EDR catches what an attacker does next on the host.

Each vendor published these IDs in October 2026. Confirm them in your console. EDR policies target follow-on behavior, not the CVEs, so check each one fires for your PHP workers.

Treat signatures as one of several layers. Cloudflare has reported attack traffic that includes evasion attempts.

Coming next in Qualys ETMQualys is building these now, and details may change

2 servers on the same unpatched build can carry very different risk depending on what protects them. Qualys is extending ETM to show that.

  1. Recommendations on every finding: which third-party controls reduce exposure, and where to enable them.

  2. Controls reflected in the score: active controls lower the finding's QVSS Environmental score.

  3. Action from one platform: apply third-party mitigations through TruRisk Eliminate.

5
Step 5 · Remediate & prove

Remediate, restart and re-validate

TruRisk EliminateTruConfidenceETM TruConfirm
Goal

Add the PHP2Shell QIDs from your ranked list to a TruRisk Eliminate patch job. Qualys maps each one to the patch that fixes it. Start with confirmed-exploitable, internet-facing assets.

Done when

Rescans come back clean, ETM TruConfirm can't reach the entry point, running services use the patched runtime, and the PHP2Shell Fightback dashboard shows the detections as fixed.

Upstream fixed releases

PHP 8.58.5.12
PHP 8.48.4.27
PHP 8.38.3.36
PHP 8.28.2.35

Check the full package version against the vendor advisory.

After patching

  1. Restart every service that loads PHP. Running workers keep vulnerable code in memory, which matters most for CVE-2026-109619.

  2. For containers, rebuild the image with patched dependencies and redeploy.

  3. Check installed package versions and running workers.

  4. Re-run ETM TruConfirm and the effective-configuration check.

  5. Restore a finite memory_limit and review temporary upload limits.

End-of-life branches (7.4–8.1)

PHP offers only limited source backports. Get a fixed build from your distribution or support vendor, apply the source backport, or upgrade to a supported branch. Keep the Step 3 mitigation in place until then. It works on end-of-life PHP versions.

Example: Ubuntu USN-8948-1

Packagesphp8.1, php8.3, php8.5
Patch reliabilityHigh
OS rebootNot required
Service restartRequired

Vendors are still rolling out many patches, and you can already deploy Ubuntu's through TruRisk Eliminate. Can't patch or mitigate in time? Restrict public access or isolate the service.

Prove it

Verification checklist

Installing a package is one step. Confirm each application actually runs the patched runtime. Your progress is saved in this browser only.

0% Verification progress
Get help

Free mitigation service for 15 days

Whether or not you already use Qualys, you can get PHP2Shell detection, validation and remediation at no cost.

Not a Qualys customer

Free PHP2Shell mitigation service

Qualys scans your internet-facing assets from the cloud with InstaScan, uses ETM TruConfirm to show which servers attackers can actually exploit, and gives you a patch or mitigation path for each, including PHP versions that will never get a fix.

15 daysfree of charge
0agents to deploy
Up to 1,000assets covered
qualys.com/php2shell-risk-assessment
Sign up for the free service
VMDR customers

Turn on CSAM and TruRisk Eliminate

In VMDR, the PHP2Shell prompt shows how many PHP installations and PHP2Shell vulnerabilities you have. Select Enable CSAM and TRE to start a 15-day free trial of prioritization and remediation.

Book a working session with Qualys

  1. Enable the external scanner for ETM TruConfirm.

  2. Launch the perimeter assessment.

  3. Set up the consolidated PHP2Shell view in ETM.

Contact your TAM to schedule it.