php2shell-CVE-2026-109618-CVE-2026-109619-PoC README

The project's README from github.com/eness/php2shell-CVE-2026-109618-CVE-2026-109619-PoC. As one markdown file: README.md.

php2shell — CVE-2026-109618 / CVE-2026-109619

php2shell — CVE-2026-109618 / CVE-2026-109619

Critical Advisory (CVSS v4.0: 9.2 - Critical): On October 20, details of two pre-auth Remote Code Execution (RCE) flaws in the PHP core leaked online ahead of coordinated disclosure. Exploitation allows arbitrary command execution straight from the web server.


Table of Contents


Overview

php2shell refers to two critical vulnerabilities (CVE-2026-109618 & CVE-2026-109619) affecting core PHP functionality. The primary demonstrated vector is a heap use-after-free (UAF) in the PHP core session upload progress mechanism leading to arbitrary code execution (zend_call_function / system()).

Root Cause

PHP's upload progress handler (php_session_rfc1867_callback in ext/session/session.c) stores two raw zval * bucket pointers (post_bytes_processed and current_file_bytes_processed) directly in live HashTable structures.

During request processing:

  1. Trigger: A standard multipart POST request activates progress tracking with default configuration values (session.upload_progress.enabled = 1).
  2. Free: A progress update cycle re-reads session data. The function zend_hash_update() destroys the previous data tree using the destructor zval_ptr_dtor, freeing the memory block.
  3. Reclaim: The freed bucket memory is reclaimed. The dangling pointer is redirected to crafted zend_fcall_info and zend_internal_function structures.
  4. Execution: PHP calls zend_call_function(), resulting in arbitrary system command execution.

Verification & Targets


Affected PHP Versions

The following table summarizes the PHP versions affected by CVE-2026-109618 and CVE-2026-109619, along with their support and patch statuses:

PHP Branch Status Affected Versions Fixed / Secure Version Notes
PHP 8.5 Supported (Active) < 8.5.12 8.5.12 Emergency security release published
PHP 8.4 Supported (Active) < 8.4.27 8.4.27 Emergency security release published
PHP 8.3 Supported (Active) < 8.3.36 8.3.36 Emergency security release published
PHP 8.2 Supported (Security Only) < 8.2.35 8.2.35 Emergency security release published
PHP 8.1 End of Life (EOL) All 8.1.x versions No Official Patch (EOL) Set session.upload_progress.enabled = Off or use ELS/distro backports
PHP 8.0 End of Life (EOL) All 8.0.x versions No Official Patch (EOL) Official support ended; configuration mitigation is mandatory
PHP 7.x End of Life (EOL) All 7.0 - 7.4 versions No Official Patch (EOL) Core ext/session logic vulnerable; urgent mitigation or upgrade required
PHP 5.x End of Life (EOL) 5.4.0+ (with RFC1867 progress tracking) No Official Patch (EOL) Official support ended; isolate host or disable upload progress

[!WARNING] PHP 8.1 and older End-of-Life (EOL) versions do not receive official security patches from the PHP Foundation. For these environments, immediately apply session.upload_progress.enabled = Off or rebuild PHP from source using the provided C source patch.


Threat Landscape & Detection Guidance

Exploitation of php2shell typically manifests as anomalous child processes spawned directly by PHP worker processes (php-fpm, php-cgi, php-cgi.exe, httpd, apache2).

Behavioral Indicators & Suspicious Child Processes

Monitor and alert on PHP worker processes executing:

Monitoring Recommendation

For Linux-based web environments without an endpoint detection agent, tools like Florian Roth's free process-watcher can be run in observe mode to flag unusual child process spawning in real time.


Action Items for Organizations

  1. Inventory All PHP Environments:
    • Public-facing web servers running applications like WordPress, Drupal, Joomla, or Magento.
    • Internal appliances, hosting panels (cPanel, Plesk), and bundled standalone binaries (php.exe, php-cgi.exe).
  2. Prepare for Patch Windows:
    • Official emergency patches from PHP and downstream Linux distributions are scheduled for release around Wednesday, October 21 at 14:00 UTC (10:00 AM ET).
    • Apply vendor updates immediately once released.
  3. Isolate End-of-Life (EOL) Installations:
    • Environments running unsupported versions (PHP 5.x, 7.x, 8.0, 8.1) may not receive official upstream backports.
    • Restrict access via VPN, apply strict WAF rules, or disable public internet exposure.
  4. Incident Response & Investigation:
    • If suspicious child processes or unexpected files are detected, isolate the host and preserve web server/PHP logs.
    • Inspect web roots and temporary directories (/tmp, /var/tmp) for dropped webshells or transient execution artifacts.

Proof of Concept (PoC)

This repository is dedicated to security research and Proof-of-Concept (PoC) development for php2shell (CVE-2026-109618 / CVE-2026-109619).

The PoC exploit is currently being developed and tested. The code will be published in this repository very soon.

⭐ Star this repository to stay updated on the upcoming PoC release.


Mitigation & Source Patching

Until official vendor packages are updated in your repositories, you can protect your environments using configuration changes, automated scripts, or by compiling PHP with the included source patch.

1. Configuration Mitigation (Immediate Stopgap)

The vulnerability relies on PHP's session upload progress mechanism (session.upload_progress.enabled), which is enabled by default. Disabling this directive neutralizes the attack vector while preserving regular file upload functionality:

In your php.ini:

session.upload_progress.enabled = Off

Or for PHP-FPM pool configurations (e.g., /etc/php/*/fpm/pool.d/www.conf):

php_admin_flag[session.upload_progress.enabled] = off

After modifying the configuration, reload/restart your web services (e.g. systemctl reload php-fpm or systemctl reload apache2).

2. Automated Quick-Fix Script

A mitigation helper script is available under the quick-fix/ directory:

3. Source Code Patch (session-upload-progress-counters.patch)

If you build PHP from source or maintain custom distribution packages, a C-level source patch is provided under patch/session-upload-progress-counters.patch.

What the patch fixes: The patch resolves the root cause in ext/session/session.c and ext/session/php_session.h. Instead of maintaining vulnerable, raw zval * bucket pointers (post_bytes_processed and current_file_bytes_processed) into dynamic HashTable structures (which become dangling pointers when the hash table is cleared or re-allocated during upload progress updates), the patch:

How to Apply the Patch:

  1. Navigate to the root of your php-src source directory:

    cd /path/to/php-src
    
  2. Test applying the patch (dry-run):

    # Using git (if building from a git clone)
    git apply --check /path/to/patch/session-upload-progress-counters.patch
    
    # OR using GNU patch
    patch -p1 --dry-run < /path/to/patch/session-upload-progress-counters.patch
    
  3. Apply the patch:

    # Using git
    git apply /path/to/patch/session-upload-progress-counters.patch
    
    # OR using GNU patch
    patch -p1 < /path/to/patch/session-upload-progress-counters.patch
    
  4. Recompile and install PHP:

    ./buildconf --force   # if needed
    ./configure <your-options>
    make -j"$(nproc)"
    sudo make install
    
  5. Restart your PHP runtime / web services:

    sudo systemctl restart php-fpm
    # or
    sudo systemctl restart apache2
    
Community Backports for EOL Versions (PHP 5.6, 7.4, 8.0, 8.1)

For legacy systems that cannot immediately upgrade to supported PHP 8.2+ releases (e.g. legacy OpenCart, WordPress, or control panels running on PHP 5.6, 7.4, 8.0, or 8.1), dedicated backports combining the official PHP Group OOM fix with the root-cause counter sync are available:

4. Cloudflare WAF Custom Rules

Recommended Cloudflare WAF rule templates to filter malicious traffic are located in the cloudflare-rule-fix/ directory:

5. FrankenPHP Caddyfile Configuration

To disable the session upload progress mechanism globally in FrankenPHP environments, a Caddyfile snippet is provided.

Add the contents of frankenphp/Caddyfile-snippet to your global Caddyfile block:

{
    frankenphp {
        php_ini session.upload_progress.enabled 0
    }
}

6. Lighttpd Configuration

For environments running Lighttpd, you can block multipart requests (POST, PUT, PATCH) on virtual hosts or directories that do not accept file uploads using lighttpd/php2shell.conf:

$HTTP["request-method"] =~ "^(POST|PUT|PATCH)$" {
    $REQUEST_HEADER["Content-Type"] =~ "(?i)^\s*multipart/form-data([;,[:space:]]|$)" {
        url.access-deny = ( "" )
    }
}

7. Apache Mitigation (ModSecurity & .htaccess)

Two mitigation options are provided for Apache environments:


Disclaimer

This project is intended strictly for educational purposes and authorized security research. Use only in environments you own or have explicit permission to test.

php2shell-CVE-2026-109618-CVE-2026-109619-PoC (eness/php2shell-CVE-2026-109618-CVE-2026-109619-PoC)

php-security
Searching Database…

What is this?This repository documents two critical pre-auth remote code execution vulnerabilities in PHP (CVE-2026-109618 and CVE-2026-109619) and ships mitigation scripts, WAF rules, and a source patch; a working proof-of-concept exploit is still in development.
Is the exploit code actually in here, or is this just an advisory?Right now it is mainly a security advisory plus mitigation tooling (config changes, a quick-fix shell script, a C patch, and WAF/Apache/Lighttpd rules) rather than a ready-to-run exploit.
How do I protect my servers against this right now?Disable session.uploadprogress.enabled in php.ini or your PHP-FPM pool config and reload php-fpm/apache2, or run the helper script under quick-fix/ to check and apply the mitigation automatically.
Do I need the PHP source code to fix this?Only if you want the permanent fix: applying patch/session-upload-progress-counters.patch requires your php-src source tree so you can patch and recompile PHP.
Can I actually download and run the exploit from this repo?Not yet — the authors say the PoC is still being developed and tested and will be published 'very soon'; only the advisory and mitigations are available today.
Which PHP versions are affected?Reports indicate PHP 5, 6, 7, and 8 can be affected, but official patches are mainly expected for currently supported PHP 8.x branches, leaving EOL versions like 5.x, 7.x, 8.0, and 8.1 without vendor fixes.
What's the root cause of the vulnerability?It's a heap use-after-free in PHP's session upload progress handler (php_session_rfc1867_callback): freed zval bucket pointers get reclaimed and redirected to trigger zend_call_function(), leading to arbitrary command execution.
How can I tell if someone is exploiting this on my server?Watch for PHP worker processes (php-fpm, apache2) spawning unexpected children like /bin/sh, cmd.exe, curl, wget, nc, or recon commands such as whoami/id/uname -a; tools like process-watcher can flag this behavior in real time.
Is there a WAF rule I can deploy immediately?Yes, the cloudflare-rule-fix/ directory has Cloudflare WAF rule templates that block malicious multipart traffic, and ModSecurity/.htaccess rules for Apache are also included.
Creator
eness
Size
0.2 MB
Stars
1K
Updated
CommitOct 22
Age
5d
Commits · 90 Days