PHP's Unpatched Critical RCEs (CVE-2026-109618, CVE-2026-109619): What's Confirmed and What Isn't
Two critical PHP flaws, CVSS 9.2 each, leaked before PHP's fix shipped. What PHP has confirmed, what's still researcher-reported, and what to do now.

- PHP's own security team confirmed an out-of-band release for two critical vulnerabilities, both CVSS v4.0 9.2, scheduled for October 21, 2026 at 14:00 UTC, but as of publication PHP's own advisory has not named CVE numbers, affected versions, or the technical mechanism.
- Everything more specific, the CVE IDs CVE-2026-109618 and CVE-2026-109619, the affected version range, and the use-after-free mechanism in session upload-progress handling, comes from independent researchers (Sansec, Upwind, watchTowr) after embargoed details leaked, not from PHP directly.
- watchTowr says it reproduced one of the two bugs in a lab. No source we could independently verify confirms mass exploitation in the wild; treat exploitation reports as developing, not settled.
- Disabling session.upload_progress in php.ini is a commonly recommended stopgap, but multiple researchers and a PHP core developer have said it is not a confirmed complete fix. There is no config-only fix for this class of bug.
- A proof-of-concept exploit tool is already circulating publicly. We are not naming, linking to, or describing how it works while the vulnerability remains unpatched for most of the ecosystem.
Most security advisories tell you what's wrong and how to fix it. This one is unusual because the two things arrived separately, and out of order. PHP's security team announced an emergency release for two critical bugs, both rated as severe as a vulnerability score gets, but withheld every technical detail until the fix was ready. Then the details leaked anyway, a day early, along with a working exploit tool. By the time you read this, PHP may have already shipped the fix. The gap between what PHP has confirmed and what independent researchers have reported is the most important thing to understand right now, because they are not the same list.
This report distinguishes two tiers of fact. Tier one: what PHP's own security team has stated, directly, in its official announcement. Tier two: what independent researchers (Sansec, Upwind, watchTowr) have reported after embargoed material leaked, which we have not been able to verify against an official PHP source. We label every claim by tier. Treat tier two as credible but not yet officially confirmed.
What PHP itself has actually said (tier one, confirmed)
PHP's security team posted an announcement on October 20, 2026, titled "Upcoming Critical PHP Security Release." The full operative text is short enough to quote directly:
“It addresses two critical vulnerabilities, both rated CVSS v4.0 9.2. Full details, affected versions, and the fixed versions will be published with the release. We reserve the right to release earlier should details of either vulnerability become public, or should evidence of active exploitation appear in the wild.”
That's it. No CVE numbers. No affected version list. No description of the bug class. PHP deliberately withheld those details, which is normal practice for a severe, unpatched vulnerability: publishing exploit-relevant specifics before a fix exists just hands attackers a head start. The release was scheduled for Wednesday, October 21, 2026, at 14:00 UTC.
What leaked, and who's reporting it (tier two, unconfirmed by PHP)
The plan to withhold details didn't survive contact with the internet. According to multiple independent write-ups, information about the embargoed bugs leaked on October 20, a day before the scheduled release, along with a screenshot of an exploit tool. Once that happened, several security research firms published their own analyses, and this is where the CVE numbers and technical details actually come from.
| Detail | What's reported | Source and confidence |
|---|---|---|
| CVE identifiers | CVE-2026-109618 and CVE-2026-109619 | Multiple independent researchers; not named in PHP's own announcement as of publication |
| Mechanism | Use-after-free bugs in php_session_rfc1867_callback, the function that tracks multipart file-upload progress | Reported by Upwind's technical analysis; unconfirmed by an official PHP advisory |
| Affected versions | Disputed. One researcher says all servers running PHP 5.4 or later; another says confirmed only on stock PHP 8.4.4 and 8.2.34; PHP officially supports only 8.2 through 8.5, so 8.1 and older get no official fix regardless | Conflicting across sources; treat the "back to 5.x" claim as unverified |
| Exploitation in the wild | One research firm (Sansec) reported early attacks observed via Cloudflare; we could not independently verify a Cloudflare statement to that effect | Single-source as of publication; watchTowr says it reproduced one bug in a lab but has not reported observing live attacks |
| Proof-of-concept availability | A public exploit tool is circulating | Confirmed to exist; we are not naming or linking it while the bug remains unpatched for most deployments |
Read that table as a confidence gradient, not a wall of equally solid facts. The CVE numbers and the broad severity are about as solid as unofficial reporting gets, since they're consistent across multiple independent firms. The exact affected version range and the in-the-wild exploitation claim are each resting on thinner evidence. Don't make irreversible decisions, like taking production systems offline for days, based on the shakiest items in that list without also checking PHP's actual release once it's out.
Why "just change a config setting" doesn't work here
Most PHP vulnerabilities can be partially contained with a config change while you wait to patch. This one is different, and that difference is the main reason it's gotten this much attention.
- If the reported mechanism (a use-after-free in memory handling) is accurate, this is a bug in PHP's own C code, not in how your application uses PHP. No amount of application-level validation reaches it.
- PHP core developer Gina Peter Banyard has publicly stated that patching is the only real mitigation, according to researcher write-ups of the leak.
- The commonly circulated stopgap, setting session.upload_progress.enabled to 0 in php.ini, closes one plausible path but multiple sources are explicit that it is not confirmed to fully eliminate the risk.
- Because the vulnerable code reportedly runs during PHP's own request parsing, before your application code executes, request-level defenses like a WAF rule matching a specific exploit pattern can be evaded by variations the rule doesn't anticipate.
Treat every interim mitigation below as risk reduction, not a fix. The only thing that actually closes this is upgrading to the patched PHP release once it's available, and verifying the version actually changed on every host, container image, and serverless function running PHP.
What to actually do, right now
- Check what PHP version every internet-facing system you run is actually on. Not what you think it's on: actual runtime version, including inside containers and serverless functions, which often lag behind what's patched on the host.
- If you can take internet-facing PHP services offline or put them behind an authenticated access path until the patch is available, that's the highest-confidence mitigation. Not every team can do this; if you can, it's worth the disruption for a CVSS 9.2 unauthenticated RCE.
- If you can't go offline: set session.upload_progress.enabled = 0 in php.ini, .user.ini, or .htaccess as a partial stopgap, understanding it isn't guaranteed complete.
- If you're behind a CDN or WAF, check whether your provider has shipped rules targeting this vulnerability class and enable them, while treating any single vendor's rule as incomplete coverage rather than a fix.
- Patch the moment the official PHP release is available. Don't wait for a maintenance window on a CVSS 9.2 unauthenticated RCE with public leak activity.
- If you're on PHP 8.1 or earlier, you are on an end-of-life branch and will not get an official fix. Upgrading to a supported branch (8.2 or later) is the only real path off this exposure, for this bug and every future one.
# Check the actual running PHP version (not just what's installed)
php -v
# Check across all running containers using PHP
docker ps --format '{{.Names}}' | xargs -I{} docker exec {} php -v 2>/dev/null
# Check whether session.upload_progress is currently enabled
php -i | grep -i upload_progress
# Disable it as an interim stopgap (edit php.ini directly, then restart php-fpm / apache)
# session.upload_progress.enabled = 0
# Confirm the setting took effect
php -i | grep 'session.upload_progress.enabled'
# After patching, confirm the version actually changed everywhere
php -v | head -1If you were already exposed: what to hunt for
Because embargoed details leaked and a proof-of-concept exists, the responsible assumption for any internet-facing PHP system with a long uptime is that you may have been probed or worse, not just as of this week, but since the leak first circulated. If your systems handle anything sensitive, don't wait for a confirmed breach notification to start looking.
- Look for unexpected PHP files in upload directories, temp directories, or anywhere your application writes user-supplied content, especially files with recent modification times that don't correspond to a known deploy.
- Check for new or modified admin users across any system with a PHP-based admin panel (CMS platforms, e-commerce backends, internal tools).
- Review outbound connections from PHP worker processes for anything unexpected: unfamiliar destinations, unusual ports, or connections initiated outside normal application behavior.
- Check web server and PHP-FPM error logs for repeated crashes or worker restarts around the same request pattern. Researchers have noted that failed exploitation attempts against this bug class tend to crash the PHP worker rather than fail silently, which is itself a signal worth investigating.
- If you have WAF or CDN logs, look for unusual multipart/form-data POST requests, particularly ones with malformed or oversized boundaries, which is the general shape of request this vulnerability class interacts with.
The bigger picture
PHP still runs a large share of the web. Whatever the exact affected version range turns out to be once PHP's own advisory publishes, a CVSS 9.2 unauthenticated RCE in the interpreter itself, not in a plugin or a specific application, is as serious as this category of bug gets. The embargo leak is its own lesson: coordinated disclosure exists precisely to give defenders a head start over attackers, and when that head start gets cut short, the sensible response isn't panic, it's falling back to the things that work regardless of exact technical details: know your exposure, reduce it where you can, patch the moment a real fix exists, and verify rather than assume. We'll update this piece once PHP's official release and advisory are out with confirmed CVE mappings, affected versions, and fixed versions.