Monday: your team patches PHP and celebrates.
Wednesday: a Node.js advisory lands. Thursday: your framework needs an out-of-band update. Friday: someone asks whether the compression library inside half your tools is safe.
Nobody in the room did anything wrong. The risk lived in layers that no one owned. The PHP2Shell flaws made headlines, but they were one chapter in a bigger story about old code, hidden dependencies, and software nobody was watching. This guide explains that story and what web teams can do about it.
Two Weeks, One Pattern
Each flaw has its own details. The pattern is what matters.
| Date (2026) | Component | What happened |
|---|---|---|
| October 14 | Next.js | Updates fixed two critical unauthenticated remote code execution bugs and a denial of service. Fixed versions include 16.4.1 and 15.5.28 |
| October 21 | PHP | Emergency release fixed the two PHP2Shell flaws, which reportedly sat in the code for years |
| October 21 | Node.js | A security release fixed 10 flaws, including the Brotli decoder bug, in the 22, 24, and 26 lines |
| October 22 to 26 | Python, Bun, Envoy, PHP for Windows | Fixes followed for the same Brotli flaw, and PHP rebuilt its Windows packages to include the fixed library |
| October 23 | PHP | The PHP project acknowledged another session-related risk, with a fix pending in a regular release |
7 Places Legacy Risk Hides
- Unsupported runtimes: Old PHP and Node.js versions stop getting patches, but keep running.
- Bundled libraries: Tools ship private copies of components such as Brotli, so updating your own packages does not touch them.
- Container base images: An old image keeps an old runtime until someone rebuilds it.
- Layers that need separate fixes: Updating Next.js does not patch the Node.js it runs on, and an image library may need its own update.
- Quiet fixes: The Brotli fix reportedly landed in February 2026 without a security label, and shipped as a security release in October.
- Version numbers that mislead: In Node.js, the bundled Brotli version number does not change with the fix, so a version check can give false comfort.
- Forgotten servers and plugins: Old sites, test servers, and unused add-ons sit outside normal patch routines.
Where to Look
| Layer | Examples | How to check |
|---|---|---|
| Language runtime | PHP, Node.js, Python, .NET | Check the version the live service uses, not just your laptop |
| Framework | Next.js and similar | Check the framework and its image or build libraries separately |
| Bundled libraries | Compression, image, and TLS libraries | Check vendor advisories and software bills of materials |
| Containers | Base images, CI images | Rebuild and scan images regularly |
| Servers and proxies | Web servers, gateways, load balancers | Check configuration as well as versions |
| Content management | Plugins, themes, add-ons | Remove what you do not use, and update the rest |
Dates That Matter
These dates come from vendor and news reports. Confirm them on the official lifecycle pages.
| Software | Reported status |
|---|---|
| Node.js 20 | End of life since April 30, 2026, with no fix for the Brotli flaw |
| Node.js 18, 23, and 25 | End of life, with no upstream fix |
| PHP 8.2 | Upstream security support is reported to end on December 31, 2026 |
| PHP 8.1 and older | Outside regular support, with limited source backports only for 7.4, 8.0, and 8.1 |
| Istio 1.29 | Reached end of life on October 15, 2026 |
What to Do About End-of-Life Software
| Option | Good for | Trade-off |
|---|---|---|
| Upgrade | Almost everything | Takes testing, and old apps may need changes |
| Vendor extended support | Systems that cannot move yet | Costs money and is a bridge, not a destination |
| Isolate and restrict | Short-term risk reduction | Does not remove the flaw |
| Retire or replace | Unused or low-value systems | Needs a decision and an owner |
How to Prioritise
| Question | If yes | Priority |
|---|---|---|
| Is it exposed to the internet? | Higher risk | Fix today |
| Does it process untrusted input? | Higher risk | Fix today |
| Does it hold sensitive data? | Higher impact | Fix this week |
| Is it internal and low-value? | Lower risk | Fix this month, or retire |
A 30-Day Plan
- Build an inventory: List runtimes, frameworks, base images, and bundled tools for every service.
- Name an owner for each: Unowned software is where risk grows.
- Fix internet-facing systems first: Use the priority table above.
- Plan upgrades off end-of-life versions: Pick dates, and track them.
- Automate checks: Use dependency scanning and a software bill of materials.
- Run a patch drill: Practise a fast, tested rollout before the next emergency.
Some community scripts exist to check for these flaws. Read any script before you run it, and never run unknown code on production systems.
Why the Pressure Is Rising
- Reports say AI-assisted code analysis helped surface both the PHP and Brotli bugs, which had sat in foundational code for years.
- Public details and test code can appear within days, so the gap between disclosure and attack is shrinking.
- Old code is a large, well-known target, and every unpatched copy is another chance.
If you want the background on how researchers find these bugs, read our guide on AI-assisted vulnerability research.
FAQs About Legacy Code Security
What is legacy code security risk?
It is the risk that comes from old, unsupported, or forgotten software and libraries that no longer receive security fixes, or that teams do not know they are running.
Why is end-of-life software dangerous?
It no longer gets security patches, so any newly found flaw stays open. Attackers can use public details against systems that cannot be fixed with an update.
What happens when PHP or Node.js reaches end of life?
The project stops releasing security fixes for that version. Some vendors sell extended support, but the safe path is to upgrade to a supported release.
How do I find hidden dependencies?
Check runtimes, frameworks, container images, and bundled libraries, not just package lists. A software bill of materials and dependency scanners help, as do vendor advisories.
Is upgrading Next.js enough to fix Node.js vulnerabilities?
No. Next.js and the Node.js runtime are fixed separately. A Next.js app on an unpatched Node.js version still has the Node.js issues, so update both.
What is a software bill of materials (SBOM)?
An SBOM is a list of the components inside a piece of software. It helps teams see which products contain an affected library when a flaw is announced.
How often should I update runtimes and dependencies?
Check for security updates regularly, and apply critical ones within days. Track end-of-life dates, and plan upgrades well before support ends.