CVE-2026-109618 and CVE-2026-109619: PHP Vulnerability 2026 Explained

Devraj V
Devraj V
Senior MEAN and Full stack Developer
Share:

Introduction

 

Quick answer: CVE-2026-109618 and CVE-2026-109619 are two separate critical PHP flaws, both rated CVSS v4.0 9.2 and fixed in PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12. One involves out-of-memory handling, the other stale worker state. This article compares them, shows how to find the PHP runtime that is actually exposed, and explains what proof a production fix needs.

 

Two CVE Identifiers, One Critical Assessment Task

Security bulletins list CVE-2026-109618 and CVE-2026-109619 side by side, as if they were one problem. They are not. The PHP security team published them together on 21 October 2026 as two critical PHP vulnerabilities, each with its own advisory, failure mechanism and interim controls. Both are rated 9.2 on CVSS v4.0 and fixed by the same releases. 

Engineering teams still have to decide which systems face which flaw and what proves a fix is live. This article compares the two CVEs using the PHP advisories and vendor bulletins, then covers which runtime serves production, which package carries the fix and what proof to keep. For incident background, see our PHP2Shell security crisis overview.

Not sure which of your services run an affected PHP build? Send us your stack and we will tell you which CVE applies to each part. → Request a free PHP version check

 

Start With the Advisory Record: What Each CVE Actually Identifies

CVE-2026-109618 (advisory GHSA-w8hw-w9fx-j79w, titled “RCE via OOM corruption”) covers what happens when a request runs out of memory at the wrong moment. PHP can be interrupted while request data is only partly set up, and cleanup then treats that unfinished data as valid. The confirmed triggers run through multipart request parsing, according to Mattias Geniar’s mitigation analysis. On Apache with mod_php, researchers also triggered it with an ordinary form post. PHP-FPM stops a worker when request startup fails, which closes that startup path, but FPM remains affected in other ways. 

CVE-2026-109619 (advisory GHSA-6wmf-4rv5-p3rp, “RCE via stale global state”) covers state a PHP worker keeps between requests. Error, session, object and extension state can still point at memory that belonged to one request, and a later request on the same worker may use it. The advisory confirms two consumers: session upload progress, which is enabled by default and needs no call to session_start(), and, on PHP 8.5, fatal error backtraces. A warning during initialization can also consume stale error state, including warnings from per-request settings such as php_value lines in .htaccess. Hiding errors does not help.

Want a second opinion on your exposure? Share your setup and our PHP team will map both advisories to it. → Talk to our PHP team

Both flaws carry the vector AV:N/AC:H/AT:P/PR:N/UI:N. A 9.2 score therefore does not mean trivial exploitation: the vector records high attack complexity and attack requirements that must be present, as the University of Toronto advisory lists it. PHP validated full remote code execution for both, and the same advisory notes that reliability depends on build, extensions and server layout. 

 

Compare the Failure Conditions, Not Just the CVE Numbers

The table shows what sources establish for each CVE. Where they do not settle a point, the cell says so. 

Technical dimension CVE-2026-109618 CVE-2026-109619
PHP record title RCE via OOM corruption (GHSA-w8hw-w9fx-j79w) RCE via stale global state (GHSA-6wmf-4rv5-p3rp)
Vulnerable behavior Request data left partly initialized when memory runs out during setup Worker state outlives the request memory it points to, a use-after-free
Confirmed triggers Multipart request parsing; on mod_php, ordinary form posts too (Geniar) Session upload progress; PHP 8.5 fatal error backtraces; warnings from per-request settings
Required configuration Not established beyond default PHP behavior Both confirmed paths are on by default
Confirmed RCE targets Apache mod_php; PHP-FPM through paths that start in the application mod_php through backtraces; mod_php and PHP-FPM through session upload progress
Potential impact Code execution; worker memory disclosure demonstrated by Wiz Code execution; Tenable reports PHP also lists memory disclosure
Affected versions PHP 5.4 to 8.2.34, 8.3.35, 8.4.26 and 8.5.11 (AWS) Same ranges (AWS)
Remediation status Fixed in 8.2.35, 8.3.36, 8.4.27, 8.5.12; no fix on end-of-life branches (AWS) Same releases; interim controls may help on end-of-life branches (AWS)
Interim controls PHP names memory_limit set to -1, low post_max_size, web server limits on multipart requests session.upload_progress.enabled set to 0, fatal_error_backtraces set to 0 on 8.5, remove per-request settings

Four differences matter in practice. First, the controls do not overlap. Memory and request size limits address CVE-2026-109618, while disabling session upload progress addresses one confirmed path for CVE-2026-109619. A team that applies only one set leaves the other CVE open, and PHP says neither set makes an installation safe. 

Second, execution model changes exposure. PHP rates Apache mod_php highest because an unauthenticated request can trigger the attack before any application code runs. All PHP installations serving web requests are in scope, including PHP-FPM, PHP-CGI, FrankenPHP and LiteSpeed. 

Short on engineers to apply and test controls? Add experienced PHP developers to your team this week. → Hire PHP developers

Third, end-of-life branches are not equal. AWS says no fix is available for CVE-2026-109618 on end-of-life branches, while interim controls for CVE-2026-109619 may help where effective. Fourth, sources differ on which CVE carries the memory disclosure path, so treat both as capable of exposing worker memory. 

 

From Runtime Defect to Business Exposure

A vulnerable runtime is not the same as an exposed asset, and neither is a compromised one. Treat exposure as five stages: a vulnerable runtime exists somewhere in the organization; it receives input from an untrusted party; the attacker meets the advisory’s conditions; exploitation succeeds; and evidence confirms an incident. Each stage needs its own evidence. A missing patch proves only the first. 

Public reporting now supports the third stage and part of the fourth, but not the scale of the fifth. Amazon recorded an attempt on 17 October, four days before the fix, and later called the bugs broadly exploited without knowing whether early attempts would have worked. watchTowr observed exploitation on 21 October. CISA said that day it had not observed exploitation, and reports dated 23 October show neither CVE in its Known Exploited Vulnerabilities catalog. The PHP Foundation said the leaked proofs of concept it inspected held no working exploit, and Sansec later argued mass exploitation was less likely than feared, as Geniar summarizes.

Exposed before you patched? We can help set up the log review and verification routine. We provide development capacity, not incident response. → Ask our PHP team

Business impact sits in two bands: documented possibilities, namely code execution and worker memory disclosure that may include passwords, tokens and API keys, and confirmed outcomes at specific organizations, which public sources do not establish at scale. Label which band each risk claim belongs to. 

 

The Production Runtime May Not Match the Version You Checked

A version check answers a narrow question: which PHP did this shell or scan reach? VirusTotal fingerprinted about 5.1 million IP addresses running PHP on 21 October, yet only about 1.1 million announced a version, so roughly four in five hide it. Those counts describe footprint, not confirmed vulnerable hosts, but they show why outside checks miss most servers. 

Inside an organization the mismatch is usually local: the command-line PHP differs from the PHP-FPM pool serving the site, several branches sit side by side, a container image on disk is newer than the container running, and control panels and bundled applications ship their own PHP. WordPress is one application that inherits all of this, as our WordPress-specific analysis explains. 

Not sure which runtime serves production? Tell us what you run and we will identify the PHP build behind it. → Request a free PHP version check

A short, read-only workflow identifies the runtime that serves one application. The commands below are illustrative: service and package names vary by distribution, so adapt them to your environment. 

  • Find the handler: mod_php, a PHP-FPM socket or another server API (SAPI, the interface between PHP and the web server), as the web server configuration shows. 
  • Ask the serving binary, not your shell: run the version command of the PHP-FPM binary named in the service unit, or php -v inside the running container. 
  • Compare timestamps. A service that started before the package was installed is still running old code. 

systemctl show php8.3-fpm –property=ActiveEnterTimestamp 

rpm -q –qf ‘%{INSTALLTIME:date}\n’ php-fpm # RPM-based systems 

grep ‘ upgrade php8.3-fpm’ /var/log/dpkg.log # Debian-based systems 

  • Record both timestamps and the version output with the date, so the check can be repeated. 

 

Map the Vulnerability to the Right Package and Support Branch

Remediation depends on who builds your PHP, and a version string cannot settle it because vendors can fix a flaw without renumbering. Plesk patched its end-of-life builds with unchanged version numbers and a build date of 21 October 2026, and Meow Apps notes that Ubuntu 24.04’s fixed PHP 8.3 package still carries the 8.3.6 base version with a new revision suffix. 

Platform Where the fix arrives What to verify
Upstream source and official images PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12 (PHP announcement) Image rebuilt after 21 October; the running container reports a fixed release
Linux distribution packages Vendor security update, which may keep the base version and change only the revision Changelog names both CVEs; installed revision matches the advisory
cPanel EasyApache 4 Patched builds for PHP 7.4 and above (cPanel) Changelog entry for the CVE, using cPanel’s documented rpm check
Plesk Patched PHP builds, plus a separate update for the panel’s own PHP engine (Plesk) Build date of 21 October 2026 or later; panel update level
AWS Elastic Beanstalk New PHP 8.2 to 8.5 platform versions; automatic only with Managed Platform Updates (AWS) Environment runs the updated platform version
AWS Lambda No managed PHP runtime; custom runtimes and images are the customer’s responsibility (AWS) Function rebuilt on patched PHP and redeployed
Amazon Lightsail Updated blueprints; running instances cannot be updated in place (AWS) Workload moved to an instance created from the new blueprint

End-of-life branches need a separate decision. AWS lists PHP 5.4 through 8.1 as having no upstream fix and says migration to a supported branch is required. A vendor backport can change that for your system, but only your vendor can confirm it. This table was last verified on 26 October 2026. 

Stuck on PHP 8.1 or older? Get a fixed-scope assessment with breaking changes and an effort estimate. → Request a PHP migration assessment

 

What Counts as Proof That the Fix Reached Production?

A closed ticket is not proof. Six checks make remediation defensible: 

  • The advisory is mapped to the right asset and runtime. 
  • The installed build matches a confirmed fixed release, or a vendor fix naming both CVEs. 
  • The web-serving runtime uses that build, checked on the running service, not the shell. 
  • Workers were restarted after installation, because stale state lives in running workers. 
  • Health checks and application smoke tests passed. 
  • The result, the date and the responsible owner are recorded. 

Use a record like this for each asset. The entries are illustrative placeholders, not evidence of testing performed by HireDeveloper.dev. 

Field What to record Illustrative entry
Asset Hostname, service or container name app-prod-01 (example)
Runtime SAPI, branch and serving unit PHP-FPM, branch 8.3, pool www (example)
Vendor package Package name and exact revision Distribution php8.3-fpm, revision per vendor advisory
Advisory status Advisory reference and whether it names both CVEs Vendor notice lists CVE-2026-109618 and CVE-2026-109619 as fixed
Fix applied Install and restart times, change ticket Installed [date, time]; service restarted [time]
Verification result Changelog check, start time later than install time, smoke tests Passed; service start time after install time
Reviewer Name, role and review date [Second engineer], [date]

Keep a separate log review beside the fix record, starting 17 October, when attempts were first recorded. Researchers list unusual multipart requests followed by memory limit errors or repeated HTTP 500 responses, oversized PHPSESSID cookies and worker crashes as signals. Amazon adds POST requests containing PHP_SESSION_UPLOAD_PROGRESS. None proves an attack, and their absence proves nothing. 

Need this record completed across many servers? Add dedicated PHP developers to verify, test and document under your direction. → Add dedicated PHP developers

 

When a Security Bulletin Does Not Match Your Environment

Bulletins describe products, and you run configurations. When a managed host, custom build or bundled appliance is not clearly covered, ask the vendor in writing which runtime and build serve you and whether both CVEs are fixed. Read the package changelog instead of the version string. Check official notices, including the Dutch NCSC list of products with a PHP dependency. Record remaining uncertainty with an owner and a deadline. 

While uncertainty remains, match controls to exposure and business risk. An internet-facing system holding sensitive data may justify isolation, a multipart block at the web server, or going offline, which the NCSC advises considering when neither the update nor mitigations can be applied quickly. A low-exposure internal system may justify extra monitoring.

Treat none of these as equal to the fix. PHP says its temporary measures reduce exposure to specific attack paths but do not make an installation safe. Geniar lists suggestions that give false confidence: hiding errors, ini_set() or .user.ini, and RLIMIT_AS. Firewalls help only when the origin cannot be reached directly, and AWS says a WAF only partly helps with CVE-2026-109618. 

 

A Short Triage Framework for Engineering Leaders

Sort every PHP asset into one of five states, and move assets between states only with evidence. Priority within a state comes from documented factors: verified vulnerability details, internet exposure, plausible exploitation conditions, asset importance and fix availability. Do not invent numeric risk scores without an agreed method. 

State Next action Evidence to move on
Confirmed affected, externally exposed Patch or isolate first; apply interim controls for both CVEs meanwhile Completed evidence record
Confirmed affected, not directly exposed Patch in the next maintenance window; restrict network access Completed evidence record
Patch status uncertain Obtain written vendor confirmation naming both CVEs Written confirmation or changelog entry
Verified fixed Keep the record and monitor Record reviewed on a stated date
Potential compromise requires investigation Preserve logs, isolate, rotate credentials the process could read, involve incident response specialists Investigation closed by qualified responders

Patching can move an asset to verified fixed, but it does not close an investigation. An exposed asset that stayed unpatched after 17 October belongs in the last row until the logs say otherwise. 

Want a triage you can defend to auditors? Book a call and we will walk through your PHP estate. → Book a call with our PHP team

 

The Operational Takeaway: Verify the Runtime, the Fix, and the Evidence

Reliable vulnerability management takes more than recognizing a CVE number or reading a version string. These two CVEs share a score and a fix but not a mechanism. Map each advisory to the runtime that serves traffic, confirm the fix reached it and the workers restarted, and keep the evidence. For implementation steps, use our step-by-step remediation guide. 

Make verification routine, not a scramble. Need hands for upgrades, testing and documentation? → Explore PHP development with HireDeveloper.dev

 

Frequently Asked Questions About CVE-2026-109618 vs CVE-2026-109619

Understand the differences between CVE-2026-109618 and CVE-2026-109619, including PHP2Shell vulnerabilities, remote code execution risks, affected PHP versions, security patches, and mitigation steps. Both vulnerabilities are rated critical, and PHP has released fixes for supported versions.

Are CVE-2026-109618 and CVE-2026-109619 the same vulnerability?

No. They have separate PHP advisories (GHSA-w8hw-w9fx-j79w and GHSA-6wmf-4rv5-p3rp), different failure mechanisms and different interim controls. They share a CVSS v4.0 score of 9.2 and the same fixed releases, which is why bulletins pair them. 

What technical differences are confirmed between the two CVEs?

CVE-2026-109618 concerns out-of-memory handling that leaves request data partly initialized. CVE-2026-109619 concerns worker state that outlives request memory. Confirmed triggers differ: multipart parsing for the first, session upload progress and PHP 8.5 backtraces for the second. 

Can a PHP installation report a version number but still lack a relevant security fix?

Yes, in both directions. Vendors backport fixes without changing the base version, and a package can be fixed on disk while running workers still use old code. Rely on a vendor advisory or changelog naming both CVEs. 

Why can the CLI PHP version differ from the web runtime?

The shell runs the command-line binary on your path, while the website may be served by a different PHP-FPM pool, Apache module or container, possibly from another branch. Check the runtime that serves requests. 

How should a team verify a vendor-backported PHP security patch?

Find the vendor advisory or changelog naming both CVEs, confirm the installed revision matches it, confirm the service restarted after installation, and record the result. cPanel documents a changelog check for EasyApache 4. 

What evidence should be recorded after a production fix?

Asset, runtime, vendor package, advisory status, fix date and restart time, verification result and reviewer. The template in this article shows the format. 

What should administrators do when their hosting provider has not clarified patch status?

Ask in writing for the runtime, the build and a statement naming both CVEs. Treat the asset as patch status uncertain, apply controls you own, and isolate it if exposure and sensitivity justify that. 

Does a fixed PHP version prove that an earlier compromise did not occur?

No. Amazon recorded attempts on 17 October, four days before the fix, so review logs from that date. Patching closes the door but does not show whether anyone used it first. 

How should an organization prioritize assets when exposure is uncertain?

A reasonable order, not a scoring model: internet-facing assets holding sensitive data or credentials, then Apache mod_php systems, then end-of-life runtimes without a confirmed vendor fix, then internal systems. Document the reasoning. 

Where can readers verify the latest official PHP security information?

Start with the PHP security announcement of 21 October 2026, the two php-src advisories and the NVD record for each CVE. Then check your platform vendor, such as AWS bulletin 2026-143-AWS, cPanel or Plesk.