CVSS v4.0: 9.2 CRITICAL ADVISORY

CVE-2026-109619: RFC1867 Upload Progress Callback Use-After-Free

Comprehensive security advisory for CVE-2026-109619 (PHP2Shell): affected PHP versions matrix, RFC1867 upload progress Use-After-Free fix, and runtime patch.

Check Your Server Vulnerability Status

Verify if your specific PHP-FPM / CLI build is affected by CVE-2026-109619.

Launch Version Checker →

Vulnerability Attributes & Classification

CVE Identifier
CVE-2026-109619
Threat Name
PHP2Shell
Vulnerable Component
ext/session/session.c (php_session_rfc1867_callback)
Default Exposure
Vulnerable by Default (session.upload_progress.enabled = On)
Attack Vector
Network / Remote (Unauthenticated HTTP POST)
Official Fix
commit 1d7dec1 (Arnaud Le Blanc & Ilija Tovilo)

Affected & Secure PHP Versions Matrix

Complete breakdown of PHP runtime versions vulnerable to CVE-2026-109619. Systems running unpatched builds must execute emergency remediation.

PHP Branch Vulnerability Status Patched Version Mitigation Action
PHP 8.5Patched Upstream8.5.12Upgrade to 8.5.12+
PHP 8.4Patched Upstream8.4.27Upgrade to 8.4.27+
PHP 8.3Patched Upstream8.3.36Upgrade to 8.3.36+
PHP 8.2Patched Upstream8.2.35Upgrade to 8.2.35+
PHP 8.1 (EOL)Vulnerable (Unpatched)NoneApply backport commit 1d7dec1 or disable upload_progress
PHP 7.0–8.0Vulnerable (Unpatched)NoneMust set session.upload_progress.enabled = Off
PHP 5.4–5.6Vulnerable (Introduced)NoneMust set session.upload_progress.enabled = Off

Technical Root Cause & Mechanics

CVE-2026-109619 is a Use-After-Free (UAF) condition residing in ext/session/session.c. The upload progress callback caches a raw memory pointer (cached_post_bytes) into the session global state. When request parsing terminates unexpectedly, the underlying buffer is deallocated, but the dangling pointer remains accessible across worker lifetimes, allowing attackers to hijack execution flow.

The flaw triggers before user-space application code ever executes. Application-layer filters, WordPress plugins (Wordfence/Sucuri), and Laravel middleware are physically bypassed because the core C parser handles the stream first.

Step-by-Step Emergency Remediation

Method 1: One-Line Configuration Workaround (Zero Downtime)

Disable upload progress tracking in your global php.ini across CLI and FPM pools:

session.upload_progress.enabled = Off

Method 2: Reload Worker Daemons

Reload the PHP-FPM service to flush running worker pools:

sudo systemctl reload php*-fpm || sudo systemctl restart apache2

Related Guides & Documentation