[{"data":1,"prerenderedAt":1119},["ShallowReactive",2],{"switcher-blog-pareja":3,"art-php2shell-php-nodejs-security-patches-october-2026-en":6},{"en":4,"es":5},"\u002Fen\u002Fblog\u002Fphp2shell-php-nodejs-security-patches-october-2026\u002F","\u002Fes\u002Fblog\u002Fphp2shell-php-nodejs-parches-seguridad-octubre-2026\u002F",{"id":7,"title":8,"author":9,"body":10,"date":1102,"description":1103,"extension":1104,"image":1105,"meta":1106,"navigation":1107,"pareja":1108,"path":1109,"seo":1110,"sin_cta":1111,"stem":1112,"tags":1113,"__hash__":1118},"blogEn\u002Fen\u002Fblog\u002Fphp2shell-php-nodejs-security-patches-october-2026.md","PHP2Shell and Node.js: October 21 meant patching both, and here's how to do it without breaking anything","Paco Cubel",{"type":11,"value":12,"toc":1072},"minimark",[13,18,31,34,48,52,89,93,104,107,125,130,148,151,165,169,172,209,212,216,220,255,270,273,306,310,402,406,413,449,456,460,466,490,496,500,522,533,536,556,577,581,591,601,628,632,635,677,681,692,709,712,716,727,762,769,773,788,795,799,809,813,817,883,887,914,936,940,954,958,969,976,979,983,1068],[14,15,17],"h2",{"id":16},"a-wednesday-to-forget","A Wednesday to forget",[19,20,21,22,26,27,30],"p",{},"On 21 October 2026, two of the platforms that power the most websites landed on the same day: ",[23,24,25],"strong",{},"PHP"," pushed out an emergency security release and, a few hours later, ",[23,28,29],{},"Node.js"," followed with its own. Social media was already calling it a \"nightmare day\" for anyone running servers, and that wasn't much of a stretch: LiteLLM, Next.js and several enterprise products had advisories out the same day too.",[19,32,33],{},"Here we focus on what touches almost everyone with a website or an API: PHP and Node.js. Let's get to it.",[35,36,37],"blockquote",{},[19,38,39,42,43,47],{},[23,40,41],{},"Updated 22 October."," Word is going round that \"the patch has already been bypassed\". We looked into it and explain what we found further down, under ",[44,45,46],"em",{},"Update, 22 October",": what got bypassed were the temporary workarounds and some firewall rules, not the official patch.",[14,49,51],{"id":50},"in-a-nutshell","In a nutshell",[53,54,55,77],"ul",{},[56,57,58,60,61,64,65,68,69,72,73,76],"li",{},[23,59,25],{},": two critical flaws (CVE-2026-109618 and CVE-2026-109619, CVSS v4.0 ",[23,62,63],{},"9.2"," each) let an attacker ",[23,66,67],{},"run code on the server without authenticating",". You need ",[23,70,71],{},"8.5.12, 8.4.27, 8.3.36 or 8.2.35",", and you need to ",[23,74,75],{},"restart your PHP processes",".",[56,78,79,81,82,85,86,76],{},[23,80,29],{},": ten flaws, four rated high. The worst (CVE-2026-111497) is an out-of-bounds write in the ",[23,83,84],{},"Brotli decoder"," that allows code execution. You need ",[23,87,88],{},"26.12.1, 24.22.1 or 22.23.4",[14,90,92],{"id":91},"php-what-happened","PHP: what happened",[19,94,95,96,99,100,103],{},"There's a twist to this one. Details of the flaws ",[23,97,98],{},"leaked on 20 October",", before any patch existed, and spread under the name ",[23,101,102],{},"\"php2shell\"",". That same day the PHP team confirmed two critical vulnerabilities and scheduled the release for the 21st at 14:00 UTC.",[19,105,106],{},"According to the official php.net advisory:",[53,108,109,115],{},[56,110,111,114],{},[23,112,113],{},"CVE-2026-109618 — code execution via out-of-memory corruption."," If PHP runs out of memory halfway through setting up a request, it can be interrupted while internal data is only partly initialised, and the cleanup that follows treats that data as valid.",[56,116,117,120,121,124],{},[23,118,119],{},"CVE-2026-109619 — code execution via stale global state."," Internal data belonging to a request can survive after its memory has been freed. The ",[23,122,123],{},"next request handled by the same worker"," may use it before it gets reset.",[126,127,129],"h3",{"id":128},"whos-affected","Who's affected",[19,131,132,133,136,137,140,141,144,145,76],{},"PHP doesn't mince words: ",[23,134,135],{},"every PHP installation serving web requests",", including ",[23,138,139],{},"PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed",". It considers the risk ",[23,142,143],{},"highest with mod_php",", where there's a demonstrated exploit in which an unauthenticated request triggers the attack ",[23,146,147],{},"before a single line of your application runs",[19,149,150],{},"That last part matters: it doesn't matter how well built your site, your WordPress or your framework is. The bug is in PHP, not in your code.",[19,152,153,156,157,160,161,164],{},[23,154,155],{},"What about older versions?"," PHP 8.1 and earlier no longer get updates from the project. The php.net advisory doesn't spell out which branches are affected, but Cloudflare, which took part in the coordinated response, says ",[23,158,159],{},"every server running PHP 5.4 or later",". The security team has published minimal patches for ",[23,162,163],{},"7.4, 8.0 and 8.1"," for people who build from source, and some distributions and extended-support vendors are backporting them into their packages. If your server runs an unsupported PHP, assume you're affected until you can prove otherwise.",[126,166,168],{"id":167},"is-it-being-exploited","Is it being exploited?",[19,170,171],{},"This is where precision matters, because there are plenty of headlines going around:",[53,173,174,189,199],{},[56,175,176,179,180,183,184,188],{},[23,177,178],{},"Hadrian"," reports exploitation ",[23,181,182],{},"at scale"," since the morning of the 21st, before the patch was even out, mostly through PHP's session upload-progress feature (",[185,186,187],"code",{},"session.upload_progress",").",[56,190,191,194,195,198],{},[23,192,193],{},"watchTowr"," says it has seen ",[23,196,197],{},"exploitation attempts"," against both flaws in its honeypot network.",[56,200,201,204,205,208],{},[23,202,203],{},"CISA","'s alert said it had not observed exploitation at the time of publication, and neither CVE ",[23,206,207],{},"was"," in its Known Exploited Vulnerabilities (KEV) catalog late on the 21st.",[19,210,211],{},"In plain terms: there are real attempts, and the gap between \"the patch is out\" and \"it's being used against you\" is measured in hours. Don't wait for official confirmation to patch.",[14,213,215],{"id":214},"php-what-to-do-today","PHP: what to do today",[126,217,219],{"id":218},"_1-check-which-version-is-actually-running","1. Check which version is actually running",[221,222,227],"pre",{"className":223,"code":224,"language":225,"meta":226,"style":226},"language-bash shiki shiki-themes github-dark-high-contrast","php -v\nphp-fpm8.3 -v   # or whichever version you have installed\n","bash","",[185,228,229,242],{"__ignoreMap":226},[230,231,234,238],"span",{"class":232,"line":233},"line",1,[230,235,237],{"class":236},"s_sBn","php",[230,239,241],{"class":240},"sCcAr"," -v\n",[230,243,245,248,251],{"class":232,"line":244},2,[230,246,247],{"class":236},"php-fpm8.3",[230,249,250],{"class":240}," -v",[230,252,254],{"class":253},"sQrFR","   # or whichever version you have installed\n",[19,256,257,258,261,262,265,266,269],{},"Careful: ",[185,259,260],{},"php -v"," tells you the ",[23,263,264],{},"command-line"," version, which isn't necessarily the one serving your site. If you use PHP-FPM or mod_php, check there too (a temporary ",[185,267,268],{},"phpinfo()"," page that you delete straight away, or the FPM binary itself).",[19,271,272],{},"In Docker:",[221,274,276],{"className":223,"code":275,"language":225,"meta":226,"style":226},"docker exec \u003Ccontainer> php -v\n",[185,277,278],{"__ignoreMap":226},[230,279,280,283,287,291,294,298,301,304],{"class":232,"line":233},[230,281,282],{"class":236},"docker",[230,284,286],{"class":285},"sTRMh"," exec",[230,288,290],{"class":289},"sWyjQ"," \u003C",[230,292,293],{"class":285},"containe",[230,295,297],{"class":296},"sMAXC","r",[230,299,300],{"class":289},">",[230,302,303],{"class":285}," php",[230,305,241],{"class":240},[126,307,309],{"id":308},"_2-update","2. Update",[53,311,312,329,335,383,396],{},[56,313,314,317,318,321,322,325,326,328],{},[23,315,316],{},"Debian \u002F Ubuntu"," with distribution packages: ",[185,319,320],{},"sudo apt update && sudo apt upgrade",". Distributions usually ",[23,323,324],{},"backport the fix into their own version"," without changing the headline number, so don't look for \"8.3.36\" in ",[185,327,260],{},": look up your distribution's security notice (Debian Security Tracker, Ubuntu Security Notices) and confirm the installed package is the fixed one.",[56,330,331,334],{},[23,332,333],{},"Third-party repositories"," (Ondřej Surý, Remi…): update the same way and check you've reached the patched version.",[56,336,337,340,341,344,345,348,349,352,353],{},[23,338,339],{},"Docker with a floating tag"," (",[185,342,343],{},"php:8.4-fpm",", ",[185,346,347],{},"php:8.3-apache","…): the official images are already updated. You need to ",[23,350,351],{},"rebuild pulling the new image",":",[221,354,356],{"className":223,"code":355,"language":225,"meta":226,"style":226},"docker compose build --pull\ndocker compose up -d\n",[185,357,358,371],{"__ignoreMap":226},[230,359,360,362,365,368],{"class":232,"line":233},[230,361,282],{"class":236},[230,363,364],{"class":285}," compose",[230,366,367],{"class":285}," build",[230,369,370],{"class":240}," --pull\n",[230,372,373,375,377,380],{"class":232,"line":244},[230,374,282],{"class":236},[230,376,364],{"class":285},[230,378,379],{"class":285}," up",[230,381,382],{"class":240}," -d\n",[56,384,385,340,388,391,392,395],{},[23,386,387],{},"Docker with a pinned version",[185,389,390],{},"php:8.4.14-apache",", for example): rebuilding won't help. You need to ",[23,393,394],{},"change the Dockerfile"," to the patched release of that branch.",[56,397,398,401],{},[23,399,400],{},"Don't forget phpMyAdmin"," and the like: they ship PHP inside too. If it runs in a container, pull the new image and recreate the container (and while you're at it, ask yourself whether it really needs to be open to the internet).",[126,403,405],{"id":404},"_3-restart-your-php-processes","3. Restart your PHP processes",[19,407,408,409,412],{},"This isn't optional. One of the two flaws lives precisely in state that ",[23,410,411],{},"survives between requests inside the same worker",". Until you restart PHP-FPM or Apache, the old workers are still there.",[221,414,416],{"className":223,"code":415,"language":225,"meta":226,"style":226},"sudo systemctl restart php8.3-fpm   # your version\nsudo systemctl restart apache2      # if you use mod_php\n",[185,417,418,435],{"__ignoreMap":226},[230,419,420,423,426,429,432],{"class":232,"line":233},[230,421,422],{"class":236},"sudo",[230,424,425],{"class":285}," systemctl",[230,427,428],{"class":285}," restart",[230,430,431],{"class":285}," php8.3-fpm",[230,433,434],{"class":253},"   # your version\n",[230,436,437,439,441,443,446],{"class":232,"line":244},[230,438,422],{"class":236},[230,440,425],{"class":285},[230,442,428],{"class":285},[230,444,445],{"class":285}," apache2",[230,447,448],{"class":253},"      # if you use mod_php\n",[19,450,451,452,455],{},"Then ",[23,453,454],{},"check the version again",". If you haven't checked it, it isn't done.",[126,457,459],{"id":458},"_4-if-you-cant-update-today","4. If you can't update today",[19,461,462,463,352],{},"PHP lists temporary measures that ",[23,464,465],{},"do not replace the patch",[53,467,468,483],{},[56,469,470,471,474,475,478,479,482],{},"For CVE-2026-109619: ",[185,472,473],{},"session.upload_progress.enabled = 0"," and restart the workers. It's also the path most attacks are using. On PHP 8.5, add ",[185,476,477],{},"fatal_error_backtraces = 0",". Bear in mind that PHP itself says the first setting ",[23,480,481],{},"blocks the confirmed attack paths but not other variants",", and the second only blocks the confirmed path.",[56,484,485,486,489],{},"For CVE-2026-109618: memory-limit and request-size settings described in the advisory itself. Several researchers warn that this part ",[23,487,488],{},"was never a complete fix",", so don't stop there.",[19,491,492,493,76],{},"PHP sums it up plainly: there are no complete mitigations, and ",[23,494,495],{},"updating is the only safe choice",[126,497,499],{"id":498},"_5-if-your-site-sits-behind-cloudflare-you-already-have-a-shield-with-conditions","5. If your site sits behind Cloudflare, you already have a shield (with conditions)",[19,501,502,503,506,507,510,511,514,515,518,519,76],{},"Cloudflare got ahead of this one: since ",[23,504,505],{},"03:02 UTC on 21 October",", roughly nine hours before public disclosure, it has protected every customer using its web application firewall (WAF) against php2shell by default, ",[23,508,509],{},"Free plan included",". On Free, the rules live in the ",[44,512,513],{},"Cloudflare Managed Free Ruleset"," under the name ",[23,516,517],{},"\"Generic Rules - Anomalous Execution\""," and there's nothing to switch on; on paid plans they're in the ",[44,520,521],{},"Cloudflare Managed Ruleset",[19,523,524,525,528,529,532],{},"The interesting part is how they did it. Looking at the request alone wasn't enough to tell an attack from legitimate traffic, so they launched a new capability that inspects ",[23,526,527],{},"the request and your server's response together",", and can block the response before it reaches the attacker. They also say attackers kept ",[23,530,531],{},"tweaking their payloads to slip past the rules",", and they kept adjusting them as they went.",[19,534,535],{},"Now the conditions, which are what decide whether this helps you or not:",[53,537,538,544,550],{},[56,539,540,543],{},[23,541,542],{},"The hostname has to be proxied (orange cloud)."," If the DNS record is grey, Cloudflare sees nothing.",[56,545,546,549],{},[23,547,548],{},"Your server shouldn't accept direct connections to its IP."," If someone knows the real IP and goes straight at it, Cloudflare is bypassed entirely. Ideally your server's firewall only lets in traffic from Cloudflare's IP ranges.",[56,551,552,555],{},[23,553,554],{},"It doesn't replace the patch."," Cloudflare says so itself: it's an extra layer while you update, not the fix.",[19,557,558,559,344,562,344,565,568,569,572,573,576],{},"And keep an eye out for PHP processes (",[185,560,561],{},"php-fpm",[185,563,564],{},"apache2",[185,566,567],{},"httpd",") spawning a shell or download tools such as ",[185,570,571],{},"curl"," or ",[185,574,575],{},"wget",". If that happens, treat the server as compromised: isolate it, keep the logs, and look for web shells, new cron jobs and new user accounts.",[14,578,580],{"id":579},"update-22-october-has-the-patch-been-bypassed","Update, 22 October: has the patch been bypassed?",[19,582,583,584,587,588,76],{},"Since yesterday, social media has been saying the PHP patch \"has already been bypassed\". We checked, and as of today ",[23,585,586],{},"there's no evidence of that",". Neither php.net nor the teams following the case closely (watchTowr, the Dutch NCSC, several security firms' live blogs) have reported a flaw in the patch, and php.net hasn't shipped any new release: the latest are still ",[23,589,590],{},"8.5.12, 8.4.27, 8.3.36 and 8.2.35",[19,592,593,594,597,598,352],{},"What ",[44,595,596],{},"has"," been bypassed, and probably where the confusion comes from, are three things that ",[23,599,600],{},"aren't the patch",[53,602,603,612,618],{},[56,604,605,608,609,611],{},[23,606,607],{},"The temporary workarounds."," Before the patch was out, plenty of people disabled ",[185,610,187],{}," and called it done. PHP walked that back: it closes the known attack paths, not the variants. Anyone who stopped at that setting is still exposed.",[56,613,614,617],{},[23,615,616],{},"Some firewall rules."," Attackers have kept reshaping their requests to dodge WAF rules. For example, an earlier revision of some rules checked request size by looking at a header, and attackers got round it by sending the request in chunks, without that header. Vendors keep tightening the rules, but a firewall is an extra layer, not the fix.",[56,619,620,623,624,627],{},[23,621,622],{},"Public exploits."," More than a hundred GitHub repositories with proofs of concept have appeared, including a variant that gets round one of the operating system's memory protections (ASLR). That makes the attack easier ",[23,625,626],{},"against unpatched PHP",". Against an updated PHP, nothing published works.",[126,629,631],{"id":630},"why-some-updated-servers-are-still-vulnerable","Why some \"updated\" servers are still vulnerable",[19,633,634],{},"This part is real, and it's what can make it look as if the patch doesn't work:",[53,636,637,643,651,661,667],{},[56,638,639,642],{},[23,640,641],{},"PHP wasn't restarted."," The new package is installed, but PHP-FPM or Apache are still running the old processes. One of the two bugs lives exactly there.",[56,644,645,648,649,76],{},[23,646,647],{},"Your distribution didn't have the fixed package yet"," when you updated, or it ships it under a version number that doesn't \"look\" new. Check your distribution's security advisory and look for the CVEs in the package changelog, not the number in ",[185,650,260],{},[56,652,653,656,657,660],{},[23,654,655],{},"The Docker image was rebuilt too early",", before the tag pointed at the fixed release. Run ",[185,658,659],{},"docker compose build --pull"," again and check the version inside the container.",[56,662,663,666],{},[23,664,665],{},"Your PHP is out of support."," PHP 8.1 and older have no official release: only minimal source patches to build yourself for 7.4, 8.0 and 8.1, and nothing for PHP 5.",[56,668,669,672,673,676],{},[23,670,671],{},"The PHP comes bundled inside another product",": a control panel, an appliance, a third-party image. Your ",[185,674,675],{},"apt upgrade"," won't touch that PHP; you depend on the vendor shipping its own update.",[126,678,680],{"id":679},"a-head-start-on-your-inventory-the-dutch-ncsc-repository","A head start on your inventory: the Dutch NCSC repository",[19,682,683,684,691],{},"The Netherlands' National Cyber Security Centre (NCSC-NL) has published a free GitHub repository, ",[685,686,690],"a",{"href":687,"rel":688},"https:\u002F\u002Fgithub.com\u002FNCSC-NL\u002Fphp2shell",[689],"nofollow","NCSC-NL\u002Fphp2shell",", with operational information on both flaws. The most useful parts:",[53,693,694,700,706],{},[56,695,696,699],{},[23,697,698],{},"Detection and mitigation material",", to tell whether you're being attacked and what to apply while you update.",[56,701,702,705],{},[23,703,704],{},"Lists of software and products that ship with PHP inside."," That's exactly what the last point above calls for: finding out whether something you run brings its own PHP, so you know to wait for (or chase) the vendor's update.",[56,707,708],{},"Its advice matches ours: start with what's exposed to the internet, update or apply your distribution's patch, check bundled PHP in images and appliances separately, and watch your logs.",[19,710,711],{},"The NCSC itself says the repository isn't complete and is still being expanded, so it's worth checking back over the next few days.",[14,713,715],{"id":714},"nodejs-what-happened","Node.js: what happened",[19,717,718,719,722,723,726],{},"The same day, the Node.js project released fixes for all three supported lines: ",[23,720,721],{},"26.x, 24.x and 22.x",". They address ",[23,724,725],{},"ten vulnerabilities",": four high, three medium and three low. The high ones:",[53,728,729,738,752],{},[56,730,731,734,735,737],{},[23,732,733],{},"CVE-2026-111497",": out-of-bounds write in the ",[23,736,84],{}," that allows code execution. Affects all three lines.",[56,739,740,743,744,747,748,751],{},[23,741,742],{},"CVE-2026-105483"," and ",[23,745,746],{},"CVE-2026-106069",": two ways to ",[23,749,750],{},"bypass the hostname check on a TLS certificate"," (the first only on 26.x and 24.x).",[56,753,754,757,758,761],{},[23,755,756],{},"CVE-2026-105482",": ",[185,759,760],{},"dns.resolve"," truncates names containing a NUL character.",[19,763,764,765,768],{},"The release also updates dependencies with public vulnerabilities (c-ares, OpenSSL, SQLite, Undici) and ",[23,766,767],{},"stops trusting an eMudhra intermediate certificate"," following the compromise of that certificate authority.",[126,770,772],{"id":771},"whos-really-exposed-to-the-brotli-bug","Who's really exposed to the Brotli bug",[19,774,775,776,779,780,783,784,787],{},"The serious risk is when your application ",[23,777,778],{},"decompresses Brotli coming from outside",": calls to ",[185,781,782],{},"zlib.brotliDecompress",", compressed request bodies your server accepts, or responses you fetch with ",[185,785,786],{},"fetch"," from third-party servers. A Node process that receives nothing from the internet and only talks to your own services is at much lower risk. Lower isn't zero: update anyway.",[19,789,790,791,794],{},"One detail plenty of people miss: ",[23,792,793],{},"having nginx in front doesn't protect you",". Nginx forwards the request and Node receives it just the same.",[126,796,798],{"id":797},"unsupported-lines-get-no-patch","Unsupported lines get no patch",[19,800,801,802,805,806,76],{},"Node.js repeats it in every advisory: ",[23,803,804],{},"end-of-life versions are always affected"," when a security release comes out. If you're still on Node 18 or 20, there's no patch to apply: you need to ",[23,807,808],{},"move to a supported line",[14,810,812],{"id":811},"nodejs-what-to-do-today","Node.js: what to do today",[126,814,816],{"id":815},"_1-check-which-version-is-running","1. Check which version is running",[221,818,820],{"className":223,"code":819,"language":225,"meta":226,"style":226},"node -v\npm2 jlist | grep -o '\"node_version\":\"[^\"]*\"' | sort -u   # if you use PM2\ndocker exec \u003Ccontainer> node -v                          # if it runs in Docker\n",[185,821,822,829,860],{"__ignoreMap":226},[230,823,824,827],{"class":232,"line":233},[230,825,826],{"class":236},"node",[230,828,241],{"class":240},[230,830,831,834,837,840,843,846,849,851,854,857],{"class":232,"line":244},[230,832,833],{"class":236},"pm2",[230,835,836],{"class":285}," jlist",[230,838,839],{"class":289}," |",[230,841,842],{"class":236}," grep",[230,844,845],{"class":240}," -o",[230,847,848],{"class":285}," '\"node_version\":\"[^\"]*\"'",[230,850,839],{"class":289},[230,852,853],{"class":236}," sort",[230,855,856],{"class":240}," -u",[230,858,859],{"class":253},"   # if you use PM2\n",[230,861,863,865,867,869,871,873,875,878,880],{"class":232,"line":862},3,[230,864,282],{"class":236},[230,866,286],{"class":285},[230,868,290],{"class":289},[230,870,293],{"class":285},[230,872,297],{"class":296},[230,874,300],{"class":289},[230,876,877],{"class":285}," node",[230,879,250],{"class":240},[230,881,882],{"class":253},"                          # if it runs in Docker\n",[126,884,886],{"id":885},"_2-update-to-the-fixed-release-for-your-line","2. Update to the fixed release for your line",[53,888,889,898,906],{},[56,890,891,894,895],{},[23,892,893],{},"26.x"," → ",[23,896,897],{},"26.12.1",[56,899,900,894,903],{},[23,901,902],{},"24.x",[23,904,905],{},"24.22.1",[56,907,908,894,911],{},[23,909,910],{},"22.x",[23,912,913],{},"22.23.4",[19,915,916,917,920,921,924,925,928,929,931,932,935],{},"With nvm, ",[185,918,919],{},"nvm install 22.23.4"," (or your line) and restart the app. With NodeSource packages, ",[185,922,923],{},"sudo apt update && sudo apt upgrade nodejs",". In Docker, same as with PHP: with a floating tag (",[185,926,927],{},"node:22-bookworm-slim","), ",[185,930,659],{}," then ",[185,933,934],{},"up -d","; with a pinned tag, change the Dockerfile.",[126,937,939],{"id":938},"_3-restart-and-verify","3. Restart and verify",[19,941,942,943,344,946,949,950,953],{},"Node doesn't update in place: the running process stays the old one until you restart it (",[185,944,945],{},"pm2 restart",[185,947,948],{},"systemctl restart"," or recreating the container). Afterwards, run ",[185,951,952],{},"node -v"," in the same environment the app runs in.",[14,955,957],{"id":956},"how-we-approach-it","How we approach it",[19,959,960,961,964,965,968],{},"A day like this is won or lost ",[23,962,963],{},"before"," the patch comes out. What saves the most time is having an ",[23,966,967],{},"inventory",": knowing which servers run PHP or Node, on exactly which version, whether it's Docker with a floating or pinned tag, and whether it's mod_php or PHP-FPM. With that in hand, \"am I affected?\" takes minutes to answer, and patching becomes a checklist rather than an afternoon of blind SSH sessions.",[19,970,971,972,975],{},"The other lesson is the usual one: ",[23,973,974],{},"unsupported PHP versions",". A 7.2 or 7.4 that \"works fine\" doesn't get the official fix. Today it's php2shell; tomorrow it'll be something else. If you have one of those, the day to plan the migration was yesterday.",[19,977,978],{},"If you don't know which PHP or Node version your servers are running, or you've got one that's out of support and don't know where to start, let's talk.",[14,980,982],{"id":981},"references","References",[53,984,985,992,999,1006,1013,1020,1027,1034,1041,1048,1054,1061],{},[56,986,987],{},[685,988,991],{"href":989,"rel":990},"https:\u002F\u002Fwww.php.net\u002Farchive\u002F2026.php#2026-10-21-5",[689],"Security advisory: Critical remote code execution vulnerabilities, update now — php.net (21 Oct 2026)",[56,993,994],{},[685,995,998],{"href":996,"rel":997},"https:\u002F\u002Fwww.php.net\u002FChangeLog-8.php",[689],"PHP 8 ChangeLog — php.net",[56,1000,1001],{},[685,1002,1005],{"href":1003,"rel":1004},"https:\u002F\u002Fnodejs.org\u002Fen\u002Fblog\u002Fvulnerability\u002Foctober-2026-security-releases",[689],"Wednesday, October 21, 2026 Security Releases — nodejs.org",[56,1007,1008],{},[685,1009,1012],{"href":1010,"rel":1011},"https:\u002F\u002Fhadrian.io\u002Fvulnerability-alerts\u002Fphp2shell-leaked-critical-php-rce-cve-2026-109618-cve-2026-109619",[689],"php2shell: What we know about the leaked critical PHP RCEs — Hadrian",[56,1014,1015],{},[685,1016,1019],{"href":1017,"rel":1018},"https:\u002F\u002Fwatchtowr.com\u002Fintelligence\u002Fphp-remote-code-execution-php2shell\u002F",[689],"CVE-2026-109619: PHP Remote Code Execution Exploited — watchTowr",[56,1021,1022],{},[685,1023,1026],{"href":1024,"rel":1025},"https:\u002F\u002Fblog.cloudflare.com\u002Fphp-vulnerabilities-waf-protection\u002F",[689],"Cloudflare deploys protections against php2shell vulnerability — Cloudflare",[56,1028,1029],{},[685,1030,1033],{"href":1031,"rel":1032},"https:\u002F\u002Fthehackernews.com\u002F2026\u002F10\u002Fphp-issues-emergency-patches-for-two.html",[689],"PHP Issues Emergency Patches for Two Critical PHP2Shell RCE Flaws — The Hacker News",[56,1035,1036],{},[685,1037,1040],{"href":1038,"rel":1039},"https:\u002F\u002Fwww.bleepingcomputer.com\u002Fnews\u002Fsecurity\u002Fphp-warns-admins-of-two-critical-flaws-emergency-patches-coming-tomorrow\u002F",[689],"PHP warns admins of two critical flaws — BleepingComputer",[56,1042,1043],{},[685,1044,1047],{"href":1045,"rel":1046},"https:\u002F\u002Fwww.cisa.gov\u002Fknown-exploited-vulnerabilities-catalog",[689],"Known Exploited Vulnerabilities Catalog — CISA",[56,1049,1050],{},[685,1051,1053],{"href":687,"rel":1052},[689],"NCSC-NL\u002Fphp2shell: operational information on the php2shell vulnerabilities — GitHub",[56,1055,1056],{},[685,1057,1060],{"href":1058,"rel":1059},"https:\u002F\u002Fwatchtowr.com\u002Fintelligence\u002Fphp-cve-2026-109618-faq\u002F",[689],"PHP RCE FAQ: PHP2Shell CVE-2026-109618 & CVE-2026-109619 — watchTowr",[56,1062,1063],{},[685,1064,1067],{"href":1065,"rel":1066},"https:\u002F\u002Fwww.precursorsecurity.com\u002Fblog\u002Fphp2shell-critical-php-rce-vulnerabilities",[689],"Live Blog: PHP2Shell Critical PHP RCE Vulnerabilities — Precursor Security",[1069,1070,1071],"style",{},"html pre.shiki code .s_sBn, html code.shiki .s_sBn{--shiki-default:#FFB757}html pre.shiki code .sCcAr, html code.shiki .sCcAr{--shiki-default:#91CBFF}html pre.shiki code .sQrFR, html code.shiki .sQrFR{--shiki-default:#BDC4CC}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sTRMh, html code.shiki .sTRMh{--shiki-default:#ADDCFF}html pre.shiki code .sWyjQ, html code.shiki .sWyjQ{--shiki-default:#FF9492}html pre.shiki code .sMAXC, html code.shiki .sMAXC{--shiki-default:#F0F3F6}",{"title":226,"searchDepth":244,"depth":244,"links":1073},[1074,1075,1076,1080,1087,1091,1095,1100,1101],{"id":16,"depth":244,"text":17},{"id":50,"depth":244,"text":51},{"id":91,"depth":244,"text":92,"children":1077},[1078,1079],{"id":128,"depth":862,"text":129},{"id":167,"depth":862,"text":168},{"id":214,"depth":244,"text":215,"children":1081},[1082,1083,1084,1085,1086],{"id":218,"depth":862,"text":219},{"id":308,"depth":862,"text":309},{"id":404,"depth":862,"text":405},{"id":458,"depth":862,"text":459},{"id":498,"depth":862,"text":499},{"id":579,"depth":244,"text":580,"children":1088},[1089,1090],{"id":630,"depth":862,"text":631},{"id":679,"depth":862,"text":680},{"id":714,"depth":244,"text":715,"children":1092},[1093,1094],{"id":771,"depth":862,"text":772},{"id":797,"depth":862,"text":798},{"id":811,"depth":244,"text":812,"children":1096},[1097,1098,1099],{"id":815,"depth":862,"text":816},{"id":885,"depth":862,"text":886},{"id":938,"depth":862,"text":939},{"id":956,"depth":244,"text":957},{"id":981,"depth":244,"text":982},"2026-10-21","PHP has shipped 8.5.12, 8.4.27, 8.3.36 and 8.2.35 to close two critical flaws that allow unauthenticated code execution, and on the same day Node.js released 26.12.1, 24.22.1 and 22.23.4 with a Brotli decoder bug that also allows code execution. What we know, who's affected and what to do today.","md","\u002Fog\u002Fog-default.png",{},true,"php2shell-php-nodejs-parches-seguridad-octubre-2026","\u002Fen\u002Fblog\u002Fphp2shell-php-nodejs-security-patches-october-2026",{"title":8,"description":1103},false,"en\u002Fblog\u002Fphp2shell-php-nodejs-security-patches-october-2026",[25,29,1114,1115,1116,1117],"Security","CVE","Servers","Docker","iBDIyqRhMiv8dDleulsYPqKYohXXg69v_Bf9FkZts7M",1792647976994]