php2shell.io
Independent technical resourceCVE-2026-109618 / CVE-2026-109619Reviewed 2026-10-21
CRITICAL · CVSS 9.2 PHP CORE / SECURITY BRIEF

PHP2SHELL: PHP vulnerabilities, patches and mitigation

Two vulnerabilities.
A direct path to your runtime.

Unauthenticated remote code execution in PHP core. Understand the exposure, patch your runtimes, and reduce risk where an immediate upgrade is impossible.

CVE-2026-109618CVE-2026-109619
php2shell.io / advisoryread-only
$ cat advisory.txt
severitycritical / 9.2
authenticationnot required
affected layerPHP runtime
complete remediationpatch PHP
# first fixed upstream releases
8.2.35  /  8.3.36
8.4.27  /  8.5.12
$ update runtime → restart workers
Static advisory summary · no commands executed
02
Critical vulnerabilities
9.2 / 10
CVSS v4.0 severity
Pre-auth
Remote attack paths
Fix available
21 October 2026
01 / TAKE ACTION

Choose your next step.

Start with a patched runtime. Then verify controls, improve visibility, and explore the evidence.

02 / CONTROL[ TEMPORARY / PARTIAL ]

Reduce the exposure.

When patching is impossible, apply scoped controls at the PHP runtime, web server, and edge.

Explore compensating controls
PHPWeb serversCloud WAFs
03 / DETECT[ MONITOR & INVESTIGATE ]

Watch the requests.
Follow the worker.

Connect web logs, PHP errors, process activity, and WAF events to investigate exploitation.

Improve detection and monitoring
Request logsProcess lineage
04 / EXPLOIT[ CHECK THE EVIDENCE ]

Know what a test proves.

Use curl checks and reviewed labs. Understand which results establish exposure and which do not.

Review exposure checks and PoCs
curl examplesResearch labs
05 / READ[ FOLLOW THE SOURCES ]

Read the research.

Trace the guidance to PHP advisories, researchers, public repositories, and infrastructure docs.

Browse advisories and references
Primary sourcesAttribution
06 / SCORE[ CVSS v4.0 ]

Understand the 9.2.

Explore the published vulnerability metrics and calculate how a different base vector changes severity.

Explore the CVSS calculator
Published vectorWhat-if scenarios
02 / UNDERSTAND THE EXPOSURE

One name. Two failure modes.

These flaws reach beyond session upload progress. A single configuration toggle cannot close every attack path.

CVE-2026-109618

Out-of-memory corruption

A failed allocation can interrupt request initialization. Cleanup can then use incomplete internal data as though it were valid, opening a route to code execution.

Confirmed pre-application exploitation on Apache mod_php.
Other web runtimes still require an update.
CVE-2026-109619

Stale state between requests

A worker can retain references to memory released by an earlier request. A subsequent request can encounter that stale state, leading to disclosure or code execution.

Confirmed session paths affect mod_php and PHP-FPM.
Prerequisites differ between runtimes.

Sources: PHP: OOM advisory · PHP: state-lifecycle advisory

02B / FOLLOW THE FAULT. READ THE FIX.

Anatomy of the vulnerability.

Two failure modes in PHP’s request lifecycle, with exact excerpts from the upstream runtime changes.

CVE-2026-109618

An interrupted operation. Invalid state.

An allocation can fail while internal request data is only partly initialized. An immediate bailout skips the rest of that operation; shutdown can then encounter the unfinished state.

  1. Request processing allocates memory
  2. OOM interrupts an operation
  3. Shutdown reaches invalid state
Zend/zend_alloc.c PHP 8.5 · 31c0ea7d
Selected removed and added lines; intervening diff lines omitted− removed+ added
Removed: -	zend_bailout();
Removed: -	exit(1);
 … intervening diff lines omitted …
Added: +	EG(delayed_oom).state = ZEND_OOM_STATE_PENDING;
Added: +
Added: +	zend_atomic_bool_store_ex(&EG(vm_interrupt), true);
Before
The removed allocator path ends in zend_bailout(). That abrupt exit can leave intermediate state inconsistent.
What changed
The added path records a pending OOM and signals the VM. The wider fix adds controlled unwinding and safe failure handling; it does not simply raise memory_limit.

The advisory confirms pre-application exploitation on Apache mod_php. This excerpt illustrates the allocator redesign; the complete update also changes callers, parsers, and extensions.

CVE-2026-109619

One request ends. Its pointers survive.

A worker can keep global references to an earlier request’s freed memory. A later request can use those references before initialization replaces them. The producer and consumer must run in the same worker.

  1. Request A leaves a global reference
  2. Request memory is released
  3. Request B touches stale state
Zend/zend_execute_API.c PHP 8.5 · 31c0ea7d
Added shutdown resets; selected contiguous lines− removed+ added
Added: +	ZVAL_UNDEF(&EG(last_fatal_error_backtrace));
Added: +	EG(record_errors) = false;
Added: +	EG(num_errors) = 0;
Added: +	EG(errors) = NULL;
Added: +	EG(error_handling) = EH_NORMAL;
Added: +	EG(exception) = NULL;
Before
Executor shutdown could leave error-related globals pointing at state that belonged to the completed request.
What changed
These additions clear the backtrace, recorded errors, error mode, and exception pointer during shutdown, before early processing of another request can reuse them.

This is one state family. The full patch also changes session and extension lifecycle handling. Disabling a single session feature only removes selected attack paths.

These are explanatory excerpts from one branch’s fix, with omitted lines identified. They are not a standalone patch. Install the complete fixed release or vendor-confirmed backport; PHP INI settings only reduce selected attack paths.

Verified against commit-pinned upstream files on 2026-10-21. Fix & provenance · Excerpt verification record. Zend Engine source excerpts © Zend Technologies Ltd.; Zend Engine License 2.00.

03 / UNDERSTAND THE SCORE

Why 9.2? Trace the score.

Explore the Common Vulnerability Scoring System (CVSS) base metrics behind both PHP2Shell advisories.

PHP advisory score · CVSS-B
9.2 / 10
CRITICAL

Both CVE-2026-109618 and CVE-2026-109619 carry this same published score and vector.

OOM advisory ↗State-lifecycle advisory ↗

Remote. Pre-auth. High impact.

AV:N / PR:N / UI:N describe a network attack requiring neither prior privileges nor another user’s participation. VC:H / VI:H / VA:H capture severe impact to the vulnerable system.

AC:H / AT:P capture complexity and prerequisites: PHP’s advisories describe exploit reliability depending on the runtime and, for stale state, requests reaching the same worker. Those constraints do not remove the need to patch.

SC:N / SI:N / SA:N are the advisories’ subsequent-system impact values, not a guarantee that your surrounding infrastructure is isolated.

Published vector · both PHP advisories
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Explore the CVSS calculator11 base metrics

Change the inputs to see a hypothetical CVSS v4.0 base score (CVSS-B). This does not change PHP’s published 9.2 rating. Threat and Environmental metrics are not included here; use the full FIRST calculator to model those factors.

Hypothetical CVSS base metrics
Exploitability

Where the attack begins and what it requires.

Reachable across a network.

Security mechanisms must be overcome.

Specific execution or deployment conditions matter.

No prior privileges needed.

No other user participates.

Vulnerable system impact

Consequences for the system containing the vulnerability.

Total or seriously harmful disclosure.

Total or seriously harmful modification.

Total or seriously harmful disruption.

Subsequent system impact

Consequences for a system beyond the vulnerable system.

No subsequent confidentiality loss scored.

No subsequent integrity loss scored.

No subsequent availability loss scored.

Your selected base metrics
9.2Critical

Matches the published PHP advisory vector.

Your selected vector
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

A severity score is not a test for exposure or compromise. A lower hypothetical score does not make an unpatched PHP deployment safe. Patch and verify the running runtime.

Scoring uses FIRST’s CVSS v4.0 implementation, served locally. Specification · Calculator & source · BSD-2-Clause license. CVSS is owned by FIRST.Org, Inc. and used by permission.

04 / FIRST FIXED RELEASES

Check every PHP deployment.

How to verify →
First PHP releases that fix both PHP2Shell vulnerabilities
PHP branchFirst fixed releaseAction
8.58.5.12Update to this release or newer
8.48.4.27Update to this release or newer
8.38.3.36Update to this release or newer
8.28.2.35Update; plan a supported-branch migration
8.1 and olderEnd of lifeMove to a supported branch or verify a complete vendor backport

Vendor packages may carry a backport under an older version number. Confirm coverage for both CVEs in the package advisory. PHP release advisory ↗

05 / QUICK ANSWERS

Before you change anything.

Does updating WordPress or another application fix this?

The affected component is PHP itself. Update the PHP runtime beneath the application, including bundled runtimes and container images, then replace running workers.

Is disabling session upload progress enough?

It reduces confirmed session-related exposure. It does not repair the broader memory and lifecycle defects, and is not complete protection against either vulnerability class.

Can a WAF replace the patch?

A WAF can block selected request patterns. Other paths, parser differences, inspection limits, and direct access to the origin can leave exposure. Keep the runtime upgrade as the remediation goal.

What about PHP 8.1 and older?

These versions remain end of life. Some vendors provide backported fixes, and PHP published exceptional minimal source backports for 7.4, 8.0 and 8.1. That does not restore ongoing support. Plan a supported-branch upgrade.