Skip to content

Blog · DevSecOps · Published 28 October 2026

Is Your Organisation Ready for the Next Critical CVE?

The next one might be in PHP, Go, Node.js, Next.js, React or Python. The language doesn't matter much. What matters is whether your team can find it, patch it, ship it and prove it — without breaking the things customers pay for.

The one question that measures readiness

If a critical vulnerability in your main runtime is announced tonight, how many hours until every production instance is running the fix — and how would you prove it?

Most teams can answer the first half with a guess. Few can answer the second half at all. “We deployed the patch” is not the same as “nothing vulnerable is still serving traffic”: a forgotten VM, a container image pinned eight months ago, a cron worker nobody restarted, a marketing site on shared hosting.

The PHP2Shell releases in October 2026 are a recent example. The PHP project announced an upcoming critical security release on 20 October and shipped fixes on 21 October, saying there were “no complete mitigations” — updating was the only safe choice. Teams had about a day's notice to be ready for a runtime upgrade. The specific steps are in the PHP2Shell remediation guide; this post is about the readiness that makes a guide like that a routine afternoon.

Why the window keeps getting shorter

A security fix is public the moment it lands: the release notes say where to look and the diff shows what changed. Reading that diff used to take specialist time. AI coding assistants now make understanding unfamiliar code faster for everyone — defenders and attackers alike. I won't put a number on how much faster, because there isn't a trustworthy one. The planning assumptions that follow are simple:

  • Plan for hours, not weeks. A monthly patch cycle is fine for routine updates and too slow for an internet-facing critical.
  • The attack surface is the runtime, not just your code. PHP2Shell sat below the application layer — sound application code didn't help.
  • Your dependencies' dependencies count. A vulnerable transitive package you've never heard of ships to production just the same.

The same AI tooling helps defenders read advisories, map affected code paths and draft upgrade changes faster. It just can't help if you don't know what you run or can't ship a change safely.

The readiness scorecard

Score each row 0–3. Be honest — the gaps are the point.

Capability0 — not there3 — ready
1. Inventory“We think it's mostly PHP 8.3.”Every runtime, framework and base image in production, with versions, queryable in minutes (SBOMs or equivalent).
2. OwnershipNobody knows who owns the legacy service.Every service has a named owning team and an on-call path.
3. DetectionSomeone saw it on social media.Advisory feeds and dependency scanning alert the owning team automatically.
4. RebuildImages are patched by hand on servers.Any service rebuilds from a fresh base image and redeploys from one pipeline run.
5. Test confidence“We'll find out in production.”Automated smoke and contract tests cover the flows that make money: login, checkout, payments, core APIs.
6. Safe rolloutAll-at-once deploys, no rollback plan.Canary or staged rollout, health-gated, with a rehearsed one-command rollback.
7. Verification“The deploy succeeded.”A check against running instances proves no vulnerable version is still serving.
8. Mitigation playbookNothing to do until the patch is ready.Known levers — WAF rules, feature flags, config switches, reducing exposure — ready while the patch is prepared.
9. CurrencySeveral major versions behind; upgrades are projects.On supported branches, with small, regular dependency updates.
10. PracticeNever rehearsed.A patch fire drill has been run in the last six months.

Under 15: the next critical will be an incident. 15–24: you'll patch, but slowly and with surprises. 25+: a critical CVE is a planned change. Row 9 is the one teams underestimate: being far behind turns a one-line patch into a migration, under pressure, which is exactly when things break.

What “patching” actually means per ecosystem

The runbook is the same everywhere. The mechanics — and the traps — differ.

EcosystemWhere the fix livesThe trap
PHPThe runtime package or base image (mod_php, PHP-FPM, FrankenPHP).Long-running workers keep old code until restarted. Distro packages backport fixes without changing the upstream version number.
GoThe Go toolchain (standard library) and modules in go.mod.Binaries are statically linked: a standard-library fix means rebuilding with the new toolchain and redeploying every binary — upgrading Go on the host does nothing for binaries already built. govulncheck reports the vulnerabilities your code actually reaches.
Node.jsThe Node runtime plus package-lock.json / pnpm-lock.yaml.A runtime fix needs a new base image; a package fix needs a lockfile update, often for a transitive dependency. npm audit / pnpm audit catch the second, not the first.
Next.js / ReactFramework packages in the lockfile, plus wherever it runs (Node server, edge, static export).Self-hosted servers need a rebuild and redeploy. A static export may not be affected by a server-side issue at all — read the advisory before panicking or relaxing.
PythonThe interpreter or base image plus pinned requirements.Unpinned requirements make “what are we running?” unanswerable. pip-audit checks installed packages against known vulnerabilities.

A copyable critical-CVE runbook

Keep this in the repository next to the code, not in a wiki nobody can find at 2 a.m.

# RUNBOOK: Critical vulnerability in a runtime or dependency

## 0. Declare (T+0)
- Incident lead: ____    Comms owner: ____    Channel: #sec-____
- Source of truth: the vendor's official advisory (link). Not social media.

## 1. Assess (T+0 -> T+1h)
- Affected versions / configurations, per the advisory: ____
- Query the inventory: which services, images and hosts match?
- Internet-facing first. Rank by exposure, then by data sensitivity.

## 2. Mitigate while the patch is prepared (if the advisory lists options)
- Config switches / feature flags / WAF rules / restrict exposure
- Record each mitigation so it can be reverted after patching.

## 3. Patch (T+1h -> T+N)
- Bump base image or dependency; rebuild with --pull
- CI: unit + smoke + contract tests on the money paths
- Staged rollout: canary -> 25% -> 100%, gated on error rate and latency
- Rollback command: ____ (rehearsed, not theoretical)
- Restart/replace every long-running worker

## 4. Verify
- Version check against RUNNING instances, not just the build
- Inventory re-query returns zero vulnerable targets
- Mitigations reverted if no longer needed

## 5. Look back
- Logs/alerts since disclosure for the conditions the advisory describes
- If exposure can't be ruled out: rotate credentials the service held

## 6. Close
- Time to patch: ____ h. Which step was slowest? Fix that before the next one.

Upgrading fast without breaking what matters

Speed and safety stop being opposites when upgrades are small and routine. The practices that make an emergency patch boring:

  1. Stay current on purpose. Automated dependency update PRs (Dependabot, Renovate) merged weekly keep each change tiny. The team one patch behind ships the fix in an hour; the team a major version behind starts a migration.
  2. Pin by digest, update by automation. Pinned image digests make builds reproducible; automated bumps keep them from going stale.
  3. Test the flows that make money. Not 100% coverage — a fast smoke suite over login, checkout, payment webhooks and the core API. That is what lets you merge an emergency upgrade with confidence.
  4. Separate deploy from release. Feature flags and staged rollouts mean an upgrade reaches a small slice of traffic first, and a bad one is rolled back before most users notice.
  5. Make rollback a command, and practise it. A rollback you've never run is a hope, not a plan.
  6. Gate on versions in CI. A build step that fails on a known-vulnerable runtime or dependency stops regressions shipping after the incident is “closed”.
  7. Run a fire drill. Pick a real past CVE, pretend it's tonight, and time the runbook end to end. The slowest step is your roadmap.

The short version

Readiness isn't a tool you buy. It's an inventory you can query, a pipeline that rebuilds anything from a fresh base, tests over the paths that make money, a rollout you can stop, and a check that proves you're done. With those in place, the language of the next critical CVE matters much less, and so does how fast attackers read the patch.

Patch readiness assessment

I work with engineering teams to get ready before the next critical vulnerability, not during it:

  • Runtime and dependency inventory across services, images and hosts
  • Your score against the ten capabilities above, with a prioritised gap list
  • A critical-CVE runbook tailored to your stack, committed to your repositories
  • Rebuild-from-base pipelines, version gates and staged rollouts in your CI/CD
  • A timed fire drill, so you know your real time-to-patch