{"id":11,"date":"2026-10-21T20:59:26","date_gmt":"2026-10-21T20:59:26","guid":{"rendered":"https:\/\/adnancanturk.com\/blog\/php2shell-patch-day-runbook-php-nodejs-cloudlinux-cpanel\/"},"modified":"2026-10-23T09:50:29","modified_gmt":"2026-10-23T09:50:29","slug":"php2shell-patch-day-runbook-php-nodejs-cloudlinux-cpanel","status":"publish","type":"post","link":"https:\/\/adnancanturk.com\/blog\/php2shell-patch-day-runbook-php-nodejs-cloudlinux-cpanel\/","title":{"rendered":"PHP2Shell patch day: a runbook for PHP, Node.js, CloudLinux and cPanel servers"},"content":{"rendered":"<p class=\"lead\">21 October 2026 was a patch day for nearly every server that runs PHP. The PHP project shipped emergency fixes for two critical flaws now known as PHP2Shell, Node.js published its own security release a few hours apart, and EasyApache 4 packages with backported fixes reached cPanel and CloudLinux servers the same afternoon. This is the runbook we used, written for anyone who operates the stack rather than writes the application.<\/p>\n<div class=\"tldr\">\n<p class=\"tldr-label\">TL;DR<\/p>\n<ul>\n<li>PHP2Shell is CVE-2026-109618 and CVE-2026-109619: two pre-authentication bugs rated 9.2 that act before application code runs.<\/li>\n<li>Fixed upstream in PHP 8.2.35, 8.3.36, 8.4.27 and 8.5.12; cPanel EasyApache 4 shipped backports for ea-php72 to ea-php85 with unchanged version numbers.<\/li>\n<li>Node.js 22.23.4, 24.22.1 and 26.12.1 shipped the same day, fixing ten CVEs including a Brotli decoder bug that permits remote code execution.<\/li>\n<li>Verify by package changelog, restart every process that loaded PHP, and check that no process maps deleted PHP libraries.<\/li>\n<li><code>session.upload_progress.enabled = 0<\/code> and WAF rules buy time; only the update fixes it.<\/li>\n<\/ul>\n<\/div>\n<h2>Why PHP2Shell is different<\/h2>\n<p>CVE-2026-109618 and CVE-2026-109619 are both rated 9.2 on CVSS v4.0, and the details explain the score. The first is an out-of-memory bug: PHP can be interrupted while request data is only half initialized, and the cleanup that follows treats the broken data as valid. The second is stale global state, where request-owned data survives after its memory is freed and the next request on the same worker uses it before initialization resets it.<\/p>\n<p>Three properties make this a hosting problem rather than an application problem. No login is needed. The attack runs during request parsing, before any application code executes, so a hardened WordPress or a strict framework does not help. And every web SAPI is affected: PHP-FPM, Apache with mod_php, php-cgi, LiteSpeed and FrankenPHP, with mod_php rated the highest risk. Details leaked before the planned disclosure date, a working exploit has been demonstrated, and Cloudflare deployed WAF rules for the known vectors on all plans. The UK NCSC advises taking any system that cannot be patched offline. Treat it as actively exploited.<\/p>\n<figure class=\"wp-block-image size-full gitm-figure\"><svg role=\"img\" aria-label=\"PHP2Shell runbook: before, during and after the 21 October 2026 updates\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1600 800\"><rect width=\"1600\" height=\"800\" fill=\"#fff\"\/><text x=\"80\" y=\"80\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"40\" font-weight=\"700\" letter-spacing=\"-1.5\" fill=\"#171717\" text-anchor=\"start\">The PHP2Shell runbook<\/text><text x=\"80\" y=\"122\" font-family=\"Menlo, monospace\" font-size=\"18\" font-weight=\"400\" letter-spacing=\"2\" fill=\"#858585\" text-anchor=\"start\">BEFORE, DURING AND AFTER THE 21 OCTOBER UPDATES<\/text><path d=\"M80 200H1520\" stroke=\"#e8e5df\" stroke-width=\"3\"\/><path d=\"M80 200H1520\" stroke=\"#f05a28\" stroke-width=\"7\" stroke-dasharray=\"440 40\"\/><circle cx=\"80\" cy=\"200\" r=\"12\" fill=\"#fff\" stroke=\"#f05a28\" stroke-width=\"5\"\/><text x=\"80\" y=\"270\" font-family=\"Menlo, monospace\" font-size=\"22\" font-weight=\"700\" letter-spacing=\"3\" fill=\"#171717\" text-anchor=\"start\">01  BEFORE<\/text><line x1=\"80\" y1=\"300\" x2=\"510\" y2=\"300\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"80\" y=\"324\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"106\" y=\"334\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Inventory every PHP binary<\/text><line x1=\"80\" y1=\"378\" x2=\"510\" y2=\"378\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"80\" y=\"402\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"106\" y=\"412\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">upload_progress.enabled = 0<\/text><line x1=\"80\" y1=\"456\" x2=\"510\" y2=\"456\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"80\" y=\"480\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"106\" y=\"490\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">No memory_limit = -1<\/text><line x1=\"80\" y1=\"534\" x2=\"510\" y2=\"534\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"80\" y=\"558\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"106\" y=\"568\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">WAF: Imunify360 8.83, Cloudflare<\/text><line x1=\"80\" y1=\"612\" x2=\"510\" y2=\"612\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"80\" y=\"636\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"106\" y=\"646\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Baseline files and crashes<\/text><circle cx=\"570\" cy=\"200\" r=\"12\" fill=\"#fff\" stroke=\"#f05a28\" stroke-width=\"5\"\/><text x=\"570\" y=\"270\" font-family=\"Menlo, monospace\" font-size=\"22\" font-weight=\"700\" letter-spacing=\"3\" fill=\"#171717\" text-anchor=\"start\">02  PATCH<\/text><line x1=\"570\" y1=\"300\" x2=\"1000\" y2=\"300\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"570\" y=\"324\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"596\" y=\"334\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">PHP 8.2.35 \u00b7 8.3.36<\/text><line x1=\"570\" y1=\"378\" x2=\"1000\" y2=\"378\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"570\" y=\"402\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"596\" y=\"412\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">PHP 8.4.27 \u00b7 8.5.12<\/text><line x1=\"570\" y1=\"456\" x2=\"1000\" y2=\"456\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"570\" y=\"480\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"596\" y=\"490\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">cPanel ea-php72 to 85 backports<\/text><line x1=\"570\" y1=\"534\" x2=\"1000\" y2=\"534\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"570\" y=\"558\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"596\" y=\"568\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">CloudLinux alt-php per OS<\/text><line x1=\"570\" y1=\"612\" x2=\"1000\" y2=\"612\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"570\" y=\"636\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"596\" y=\"646\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Node 22.23.4 \u00b7 24.22.1 \u00b7 26.12.1<\/text><circle cx=\"1060\" cy=\"200\" r=\"12\" fill=\"#fff\" stroke=\"#f05a28\" stroke-width=\"5\"\/><text x=\"1060\" y=\"270\" font-family=\"Menlo, monospace\" font-size=\"22\" font-weight=\"700\" letter-spacing=\"3\" fill=\"#171717\" text-anchor=\"start\">03  AFTER<\/text><line x1=\"1060\" y1=\"300\" x2=\"1490\" y2=\"300\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"1060\" y=\"324\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"1086\" y=\"334\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Verify by changelog, not php -v<\/text><line x1=\"1060\" y1=\"378\" x2=\"1490\" y2=\"378\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"1060\" y=\"402\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"1086\" y=\"412\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Restart FPM, Apache, lsphp, workers<\/text><line x1=\"1060\" y1=\"456\" x2=\"1490\" y2=\"456\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"1060\" y=\"480\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"1086\" y=\"490\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">No &#x27;(deleted)&#x27; PHP maps<\/text><line x1=\"1060\" y1=\"534\" x2=\"1490\" y2=\"534\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"1060\" y=\"558\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"1086\" y=\"568\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Hunt for web shells and cron<\/text><line x1=\"1060\" y1=\"612\" x2=\"1490\" y2=\"612\" stroke=\"#e8e5df\" stroke-width=\"2\"\/><rect x=\"1060\" y=\"636\" width=\"10\" height=\"10\" fill=\"#f05a28\"\/><text x=\"1086\" y=\"646\" font-family=\"Arial, Helvetica, sans-serif\" font-size=\"23\" font-weight=\"400\" letter-spacing=\"0\" fill=\"#171717\" text-anchor=\"start\">Restore temporary settings<\/text><text x=\"80\" y=\"770\" font-family=\"Menlo, monospace\" font-size=\"15\" font-weight=\"400\" letter-spacing=\"2\" fill=\"#858585\" text-anchor=\"start\">SOURCES: PHP.NET, NODEJS.ORG, CPANEL EA4 CHANGELOG<\/text><\/svg><figcaption>PHP2Shell runbook: before, during and after the 21 October 2026 updates<\/figcaption><\/figure>\n<h2>What was patched on 21 October<\/h2>\n<div class=\"table-wrap\">\n<table>\n<thead>\n<tr>\n<th>Component<\/th>\n<th>Fixed versions<\/th>\n<th>Notes<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>PHP (php.net)<\/td>\n<td>8.2.35, 8.3.36, 8.4.27, 8.5.12<\/td>\n<td>PHP2Shell; minimal source backports published for 7.4, 8.0 and 8.1<\/td>\n<\/tr>\n<tr>\n<td>cPanel EasyApache 4 on CloudLinux<\/td>\n<td>ea-php72 to ea-php85, new release suffix<\/td>\n<td>Backported fix, upstream version number unchanged (for example 8.4.26-2.cloudlinux.1)<\/td>\n<\/tr>\n<tr>\n<td>CloudLinux alt-php<\/td>\n<td>Rolling out per OS<\/td>\n<td>Track the CloudLinux status page; Imunify360 rules as interim protection<\/td>\n<\/tr>\n<tr>\n<td>Node.js<\/td>\n<td>22.23.4, 24.22.1, 26.12.1<\/td>\n<td>Ten CVEs, four high, including a Brotli decoder out-of-bounds write that permits remote code execution<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>The Node.js release is smaller in reach but not in severity. CVE-2026-111497 is an out-of-bounds write in the Brotli decoder on all three lines; CVE-2026-106069 and CVE-2026-105483 bypass TLS hostname checks through loosely parsed or fullwidth IP addresses; and CVE-2026-105482 truncates names at a NUL character in <code>dns.resolve<\/code>. Bundled c-ares, OpenSSL and Undici were updated, and the CA store dropped an eMudhra intermediate after a compromise.<\/p>\n<p>Check a build against the fixed releases:<\/p>\n<div class=\"gitm-widget\" data-widget=\"php2shell\"><\/div>\n<h2>Which PHP setups are most exposed?<\/h2>\n<p>Every way of serving PHP over the web is affected, but the advisory names mod_php as the highest risk, and the way each setup is restarted after the update decides how long the old code keeps running. The table is the version we used to plan the restarts.<\/p>\n<div class=\"table-wrap\">\n<table>\n<thead>\n<tr>\n<th>How PHP is served<\/th>\n<th>Exposure<\/th>\n<th>What makes the fix take effect<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Apache with mod_php<\/td>\n<td>Highest, per the PHP advisory<\/td>\n<td>A full Apache restart; a graceful reload is not enough<\/td>\n<\/tr>\n<tr>\n<td>PHP-FPM (cPanel, plain Apache or nginx)<\/td>\n<td>Affected<\/td>\n<td>Restart or reload the FPM service so every pool forks new workers<\/td>\n<\/tr>\n<tr>\n<td>CGI handler (suPHP-style or <code>\/cgi-sys\/<\/code>)<\/td>\n<td>Affected<\/td>\n<td>Each request starts a new process, so the new binary is used at once<\/td>\n<\/tr>\n<tr>\n<td>LiteSpeed with lsphp<\/td>\n<td>Affected<\/td>\n<td>Upgrade the lsphp packages, then stop the running lsphp processes<\/td>\n<\/tr>\n<tr>\n<td>FrankenPHP, Octane, Swoole, RoadRunner<\/td>\n<td>Affected<\/td>\n<td>Replace the binary or image and restart the long-running server<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>A shared server often mixes several of these. On a mixed server, the CGI-served sites pick up the patched binary on their next request while the FPM pools keep the old one until they restart; that difference is why the stale-process check below matters.<\/p>\n<h2>A field note from a cPanel and CloudLinux server<\/h2>\n<p>On one of our CloudLinux 8 servers running cPanel 11.138, the EasyApache 4 updates installed automatically at 16:16 server time on 21 October, covering every ea-php version from 7.2 to 8.5. Two details are worth knowing. First, <code>php -v<\/code> still reported 8.4.26, because the fix is a backport; the proof is in the package changelog, where each build lists CVE-2026-109618 and CVE-2026-109619. Second, the update is only half the job until every PHP process has restarted, and that is something you should check rather than assume.<\/p>\n<h2>Before the patch: buy time safely<\/h2>\n<ol class=\"checklist\">\n<li><strong>Inventory every PHP binary.<\/strong> List ea-php, alt-php, distribution PHP, LiteSpeed lsphp, Docker images and anything bundled with an application. Each one is a separate patch.<\/li>\n<li><strong>Disable upload progress where it is safe.<\/strong> Set <code>session.upload_progress.enabled = 0<\/code> in <code>php.ini<\/code> or with <code>php_admin_value<\/code> in the FPM pool, then restart the workers. It blocks the confirmed session path of CVE-2026-109619 only; <code>ini_set()<\/code> and <code>.user.ini<\/code> apply too late.<\/li>\n<li><strong>Remove <code>memory_limit = -1<\/code>.<\/strong> An unlimited limit makes the out-of-memory path of CVE-2026-109618 easier to reach.<\/li>\n<li><strong>Turn on WAF coverage.<\/strong> Imunify360 ruleset 8.83 blocks the public exploit shape on Apache, and Cloudflare has managed rules. Both are temporary, and on LiteSpeed the Imunify360 rule only logs.<\/li>\n<li><strong>Take a baseline.<\/strong> Record recently modified PHP files and current crash counts so you can compare after the patch.<\/li>\n<\/ol>\n<h2>After the patch: prove it<\/h2>\n<ol class=\"checklist\">\n<li><strong>Verify by changelog, not by version.<\/strong> On cPanel, <code>rpm -q --changelog ea-php84-php-cli | head<\/code> should mention both CVEs. On php.net builds, check for 8.2.35, 8.3.36, 8.4.27 or 8.5.12.<\/li>\n<li><strong>Restart everything that loaded PHP.<\/strong> Restart PHP-FPM; do a full Apache restart for mod_php, since a graceful reload is not enough; kill lsphp on LiteSpeed; restart queue workers and long-running daemons.<\/li>\n<li><strong>Look for stale processes.<\/strong> <code>grep -lE '\/opt\/cpanel\/ea-php.*\\(deleted\\)$' \/proc\/[0-9]*\/maps<\/code> should return nothing. Any match is a process still running the vulnerable code.<\/li>\n<li><strong>Update Node.js the same day.<\/strong> Move every service, container and CI runner to 22.23.4, 24.22.1 or 26.12.1, and retire Node.js 20, which no longer receives fixes.<\/li>\n<li><strong>Hunt, then relax mitigations.<\/strong> Compare new or changed PHP files, web shells and unexpected cron entries against your baseline before you remove temporary WAF rules and restore your previous settings.<\/li>\n<li><strong>Plan the version moves.<\/strong> PHP 8.1 and older depend on vendor backports, and PHP 8.2 reaches end of life on 31 December 2026. Target 8.4 or 8.5.<\/li>\n<\/ol>\n<h2>How do you roll the update across a fleet?<\/h2>\n<p>On one server the update is a package install and a restart. Across a fleet the risk moves from the bug to the rollout: a configuration that worked on one box can break a site on another, and a restart at the wrong moment drops requests. We use the same order every time.<\/p>\n<ol class=\"checklist\">\n<li><strong>Pick a canary.<\/strong> Patch one server that carries a representative mix of sites, restart, and compare the control panel and a sample of sites before and after.<\/li>\n<li><strong>Record the before state.<\/strong> For each server, the installed package versions, the handler each sample site uses and its HTTP status. Without that, a regression cannot be told apart from an old fault.<\/li>\n<li><strong>Restart in a quiet hour.<\/strong> An FPM restart is short, but a full Apache restart for mod_php drops connections in flight.<\/li>\n<li><strong>Verify, then move on.<\/strong> Changelog check, stale-process check, sample sites, then the next server. A failure stops the rollout until it is understood.<\/li>\n<\/ol>\n<p>On cPanel servers with automatic EasyApache 4 updates the install step happens by itself, as it did on ours, which leaves the restart and verification as the work. Servers without automatic updates need the install step scheduled explicitly, and those are the ones most likely to be forgotten.<\/p>\n<h2>What signs should you look for after patching?<\/h2>\n<p>Patching closes the hole but does not tell you whether anyone used it first. Because details leaked before the release, it is worth a short review of the days before your update. Look for PHP files created or changed in web roots since mid-October that no deployment explains, PHP-FPM log lines about workers that exited on a signal, unexplained bursts of 500 or 502 responses, new cron entries for web users, and outbound connections from PHP processes to unfamiliar hosts.<\/p>\n<p>None of these proves an intrusion on its own, and a clean result is not a guarantee. Treat a hit as the start of an investigation, compare it with the baseline you took before patching, and keep the temporary WAF rules in place until the review is done.<\/p>\n<p>For the background on the earlier 2026 releases see <a href=\"\/blog\/php-nodejs-security-releases-2026-server-checklist\/\">the PHP and Node.js release overview<\/a>; the BIND and Java updates of the same week are in <a href=\"\/blog\/nodejs-bind-java-october-2026-security-releases-server-side\/\">Node.js, BIND and Java in one week<\/a>, and the kernel side in <a href=\"\/blog\/kernel-hardening-shared-linux-server-five-settings\/\">five kernel settings for a shared Linux server<\/a>.<\/p>\n<h2 id=\"faq-php2shell-patch-day\">FAQ: PHP2Shell and the 21 October 2026 updates<\/h2>\n<h3 id=\"faq-what-is-php2shell-2026\">What is PHP2Shell, and why was it patched as an emergency in October 2026?<\/h3>\n<p>PHP2Shell is the name given to CVE-2026-109618 and CVE-2026-109619, two memory-safety bugs in PHP rated 9.2 on CVSS v4.0. They need no login and act before application code runs. Details leaked before the planned date, so PHP released the fixes on 21 October 2026.<\/p>\n<h3 id=\"faq-which-php-versions-fix-php2shell\">Which PHP versions fix PHP2Shell, and what about PHP 8.1 and older?<\/h3>\n<p>The fixed upstream releases are 8.2.35, 8.3.36, 8.4.27 and 8.5.12. PHP 8.1 and older get no upstream release; the PHP team published minimal source backports for 7.4, 8.0 and 8.1, and some vendors ship their own patched packages.<\/p>\n<h3 id=\"faq-cpanel-php-v-old-version-patched\">Why does php -v still show the old version after cPanel installed the PHP2Shell fix?<\/h3>\n<p>Because EasyApache 4 shipped the fix as a backport with a new package release, not a new PHP version. The changelog of each <code>ea-php<\/code> package lists both CVEs, and that changelog, not <code>php -v<\/code>, is the proof.<\/p>\n<h3 id=\"faq-mod-php-vs-php-fpm-php2shell\">mod_php vs PHP-FPM: which is more exposed to PHP2Shell?<\/h3>\n<p>The PHP advisory rates mod_php as the highest risk, with a demonstrated exploit against it. PHP-FPM is also affected. Whatever you run, the fix only applies after the right restart: a full Apache restart for mod_php, an FPM restart for pools.<\/p>\n<h3 id=\"faq-upload-progress-mitigation-enough\">Is disabling session.upload_progress enough to mitigate PHP2Shell without patching?<\/h3>\n<p>No. It blocks only the confirmed session path of CVE-2026-109619 and does nothing for CVE-2026-109618. Set it in <code>php.ini<\/code> or the FPM pool, not with <code>ini_set()<\/code>, and treat it as a stopgap until the update is installed.<\/p>\n<h3 id=\"faq-imunify360-litespeed-php2shell\">Does the Imunify360 rule protect LiteSpeed servers from PHP2Shell in 2026?<\/h3>\n<p>Only partly. Imunify360 ruleset 8.83 blocks the public exploit shape on Apache, but on LiteSpeed it logs the pattern rather than blocking it. On either server it is interim coverage, not a replacement for the patched PHP.<\/p>\n<h3 id=\"faq-stale-php-processes-check\">How do you confirm that no process is still running unpatched PHP code after the update?<\/h3>\n<p>Search the memory maps for deleted PHP libraries: <code>grep -lE '\/opt\/cpanel\/ea-php.*\\(deleted\\)$' \/proc\/[0-9]*\/maps<\/code>. An empty result means every running process loaded the new files; any match is a process that still needs a restart.<\/p>\n<h3 id=\"faq-cloudlinux-alt-php-php2shell\">Are CloudLinux alt-php packages patched for PHP2Shell, or only EasyApache ea-php?<\/h3>\n<p>The ea-php backports reached CloudLinux 8 servers on 21 October. CloudLinux announced that alt-php packages would roll out per operating system and listed their status on its status page, so check that page for the alt-php versions your accounts use.<\/p>\n<h3 id=\"faq-node-same-day-release-priority\">Patching PHP vs Node.js first: should the 21 October 2026 Node.js release wait for PHP2Shell?<\/h3>\n<p>No, run them in parallel. The Node.js release fixed four high-severity issues, including a Brotli decoder bug that permits remote code execution. Updating Node.js does not touch PHP, so there is no reason to queue one behind the other.<\/p>\n<h3 id=\"faq-check-compromise-before-patch\">How can you tell whether a server was compromised before the PHP2Shell patch?<\/h3>\n<p>There is no single test. Review web roots for unexplained new PHP files, FPM logs for crashing workers, unusual 500 or 502 bursts, new cron entries and outbound connections from PHP, and compare them with a baseline. A hit starts an investigation; a clean result is reassurance, not proof.<\/p>\n<h2>Sources<\/h2>\n<ul class=\"sources\">\n<li><a href=\"https:\/\/www.php.net\/\" rel=\"noopener\" target=\"_blank\">PHP security release, 21 October 2026<\/a>, php.net<\/li>\n<li><a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-w8hw-w9fx-j79w\" rel=\"noopener\" target=\"_blank\">GHSA-w8hw-w9fx-j79w (CVE-2026-109618)<\/a> and <a href=\"https:\/\/github.com\/php\/php-src\/security\/advisories\/GHSA-6wmf-4rv5-p3rp\" rel=\"noopener\" target=\"_blank\">GHSA-6wmf-4rv5-p3rp (CVE-2026-109619)<\/a>, GitHub<\/li>\n<li><a href=\"https:\/\/nodejs.org\/en\/blog\/vulnerability\/october-2026-security-releases\" rel=\"noopener\" target=\"_blank\">October 2026 security releases<\/a>, nodejs.org<\/li>\n<li><a href=\"https:\/\/www.helpnetsecurity.com\/2026\/10\/21\/php2shell-php-vulnerabilities-patched-cve-2026-109618-cve-2026-109619\/\" rel=\"noopener\" target=\"_blank\">PHP2Shell: critical PHP vulnerabilities patched<\/a>, Help Net Security<\/li>\n<li><a href=\"https:\/\/blog.imunify360.com\/php-cve-2026-109618-cve-2026-109619\/\" rel=\"noopener\" target=\"_blank\">Imunify360 ruleset 8.83 for PHP2Shell<\/a>, Imunify360<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>On 21 October 2026 PHP shipped emergency fixes for PHP2Shell, two unauthenticated remote code execution flaws, on the same day as a Node.js security release. What was patched, how the hosting stack received it, and what to do before, during and after the update.<\/p>\n","protected":false},"author":0,"featured_media":31,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[12,6,11,13,3,9,2,5,10],"class_list":["post-11","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-security","tag-cloudlinux","tag-cpanel","tag-cve-2026-109618","tag-easyapache-4","tag-node-js","tag-patch-management","tag-php","tag-php-fpm","tag-php2shell"],"_links":{"self":[{"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":2,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"predecessor-version":[{"id":46,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/posts\/11\/revisions\/46"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/media\/31"}],"wp:attachment":[{"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adnancanturk.com\/blog\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}