Skip to content

PHP Is Not the Only Risk: What Legacy-Code Security Problems Mean for Web Teams

Key Takeaways & Executive Summary

Patching PHP is not the end of the story. In two weeks, flaws also hit Node.js, Next.js, and a compression library hidden inside many tools. Here is what legacy code and hidden dependencies mean for web teams.

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

  1. Unsupported runtimes: Old PHP and Node.js versions stop getting patches, but keep running.
  2. Bundled libraries: Tools ship private copies of components such as Brotli, so updating your own packages does not touch them.
  3. Container base images: An old image keeps an old runtime until someone rebuilds it.
  4. 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.
  5. Quiet fixes: The Brotli fix reportedly landed in February 2026 without a security label, and shipped as a security release in October.
  6. 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.
  7. 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

  1. Build an inventory: List runtimes, frameworks, base images, and bundled tools for every service.
  2. Name an owner for each: Unowned software is where risk grows.
  3. Fix internet-facing systems first: Use the priority table above.
  4. Plan upgrades off end-of-life versions: Pick dates, and track them.
  5. Automate checks: Use dependency scanning and a software bill of materials.
  6. 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.

FREQUENTLY ASKED QUESTIONS

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.

Rehan Naeem

Technical Analyst & Systems Contributor