Patched Next.js in September? You're Still Exposed (16.4.1, 2026)

If you upgraded Next.js to 16.3.8 after the September 30 advisories, you did the right thing, and you're still exposed. Two weeks later, on 2026-10-14, Next.js shipped an out-of-band update for a critical unauthenticated RCE and a high-severity DoS. Both affect 16.3.8. And there is no 16.3.9: we checked the npm registry on 2026-10-28, and the 16.3 line ends at 16.3.8.

The fix is 16.4.1, a minor-version jump. Teams that only take patch releases will skip right past it.

TL;DR

The October 14, 2026 Next.js update fixes a critical RCE in use cache functions (GHSA-673q-mjm6-r5xr, CVSS 9.5, affects 16.0.0 to 16.4.0) and a Server Actions DoS (GHSA-p3m5-59mp-jv5r, CVSS 8.2, affects 13.0.0 to 15.5.27 and 16.0.0 to 16.4.0). Fixed in 16.4.1 and 15.5.28 only. September's 16.3.8 doesn't cover either one. Neither advisory has a workaround besides upgrading.

What shipped, and when

Next.js split this into two releases because, in its own words, two fixes were "postponed from the September security release due to upstream dependency delays." The October 14 announcement lists three issues:

AdvisorySeverityWhat it isAffectedFixed in
GHSA-673q-mjm6-r5xrCritical, CVSS 9.5Unauthenticated RCE when a use cache function returns multiple typed arrays>=16.0.0, <=16.4.016.4.1
GHSA-p3m5-59mp-jv5rHigh, CVSS 8.2Crafted requests pin the CPU on any App Router app with a Server Action13.0.0 to 15.5.27, 16.0.0 to 16.4.015.5.28, 16.4.1
CVE-2026-96889CriticalRCE through SVG in an upstream image library, on glibc-based Linuxsee our sharp postsharp 0.35.5+, or Next 16.4.1 / 15.5.28

The first two have no CVE ID on their advisory pages as of this writing, so search for them by GHSA ID. The Next.js announcement links each one to an upstream React advisory (GHSA-xqc2-xf4c-x3h3 and GHSA-h3gv-c5rc-p453).

Here's the release timeline from the npm registry, because it explains the trap:

VersionPublishedCovers September fixesCovers October fixes
16.3.82026-09-30YesNo
16.4.02026-10-06YesNo
16.4.12026-10-14YesYes
16.4.32026-10-23YesYes (current latest)
15.5.272026-09-30YesNo
15.5.282026-10-14YesYes

Note 16.4.0. It shipped eight days before the fix, so if someone upgraded you to "the latest minor" in early October, that doesn't count either.

Which bug actually reaches your app

The RCE needs a specific shape, and the advisory says upgrade anyway

The RCE needs App Router with Cache Components, plus a use cache function that returns multiple typed arrays (Uint8Array, Float32Array and friends). That's a narrow pattern. Most apps don't return binary buffers from cached functions.

The advisory doesn't let you off the hook on that basis, though: "You should upgrade immediately even if your application does not have similar functions." Take that seriously. "We don't have that pattern" is a claim about every file in a codebase you didn't write line by line, and it needs to hold for every future AI edit too.

The DoS reaches almost every AI-built App Router app

The Server Actions bug has a much lower bar. You need App Router and at least one Server Action. That's it. No auth needed, and a crafted request "can lead to excessive CPU usage" that "blocks processing of further requests in the same process."

This is the one that matters for most of our readers. When you ask Cursor, v0, Bolt or Claude Code to build a contact form, a settings page or a waitlist signup in a Next.js App Router project, the idiomatic answer is a Server Action: a function marked "use server" that the form posts to. If your app has a single form like that, it's in scope. Pages Router apps, and App Router apps with zero Server Actions, are not.

A DoS sounds less scary than RCE, and it is. But on a serverless host, an attacker pinning your functions' CPU can cost you money as well as uptime, and on a single small container it takes the whole app offline until it restarts.

The two-minute check

1

Find the version you actually run, not the one you asked for.

Terminal
npm ls next      # or: pnpm why next / yarn why next

You're affected if it prints anything from 16.0.0 to 16.4.0, or 13.0.0 to 15.5.27 with Server Actions. 16.3.8 and 16.4.0 are both in range.

2

Check for the two patterns. This tells you how exposed you've been, not whether to upgrade (you're upgrading either way). Search the whole project, because Server Actions often live in actions/, lib/ or server/ folders, not just app/.

Terminal
# Server Actions: any hit means the DoS applies
grep -rlnE "[\"']use server[\"']" . \
  --include=*.{ts,tsx,js,jsx,mjs} --exclude-dir={node_modules,.next}

# use cache functions: review each hit for typed-array returns
grep -rnE "[\"']use cache[\"']" . \
  --include=*.{ts,tsx,js,jsx,mjs} --exclude-dir={node_modules,.next}

A hit is a yes. No hits isn't proof of a no, which is the other reason to upgrade regardless.

3

Upgrade across the minor version, then redeploy.

Terminal
npm install next@16.4.3      # or next@15.5.28 if you're on the 15 line
npm ls next                  # confirm the lockfile moved
npm run build

Going from 16.3 to 16.4 is a minor bump, so build locally and click through login, checkout, and any page that uses caching before you push. If the build is fine, ship it the same day.

Why this one slips through

Three habits stack up here.

Exact pins. create-next-app writes an exact version ("next": "16.3.8"), not ^16.3.8. Dependabot or Renovate will open a PR for 16.4.1, but npm update on its own won't move you, and plenty of AI-built projects have no update bot at all.

Patch-only policies. If your rule is "take patch releases automatically, review minors," this fix falls on the wrong side of it. That's not a mistake in the rule. It's just worth knowing the September and October fixes landed on different minors.

"I already patched this month." The September advisories got a lot of coverage. It's very natural to see "Next.js security update" in October and assume it's the one you already handled.

To see what version a live Next.js site reports, open its browser console and type window.next.version. It's a quick way to check a deploy (or a client's app) without the source. Treat it as a hint: what's actually running on the server is what the lockfile says at build time.

What CheckYourVibe sees here

Our scanner works from the outside, the way an attacker would. It can tell a site runs Next.js, and it flags the client-side problems these apps usually ship with: keys in the bundle, missing headers, exposed source maps. It can't prove whether a particular Server Action is reachable or whether a use cache function returns typed arrays, because that lives in server code.

So this one is a lockfile check, not a scan finding. Run step 1 above. If the version is in range, upgrade, and then run a scan to catch the things a framework upgrade doesn't fix.

Is Next.js 16.3.8 safe?

Not for the October 14, 2026 advisories. 16.3.8 fixed the September 30 issues, but the use cache RCE affects every 16.x release up to and including 16.4.0, and the Server Actions DoS affects 16.0.0 to 16.4.0 as well. As of 2026-10-28 there's no 16.3.9 on npm, so the only fix on the 16 line is 16.4.1 or later.

My app doesn't use 'use cache'. Do I still need to upgrade?

Yes. The Next.js advisory itself says to upgrade even if your app has no similar functions. And the separate Server Actions DoS only needs one Server Action anywhere in an App Router app, which most AI-scaffolded apps have because their forms are built that way.

I'm on Next.js 15. Am I affected?

Not by the use cache RCE, which only affects 16.0.0 and later. You are affected by the Server Actions DoS if you use App Router with at least one Server Action on 13.0.0 through 15.5.27. The fix on the 15 line is 15.5.28.

Does hosting on Vercel protect me?

Don't assume it does. These are bugs in the framework code that runs your app, and both advisories list no workaround besides upgrading. Bump the version in your lockfile and redeploy.

Why didn't npm update fix it?

create-next-app writes an exact version like 16.3.8 into package.json, not a caret range, so npm update stays put. Even with a caret range, your lockfile keeps the old version until you run npm install next@16.4.1 or npm update next.

Upgraded? Now check what the framework can't fix

CheckYourVibe scans your live app for exposed keys, missing headers and leaky bundles, in plain English.

Vulnerability Guides

Patched Next.js in September? You're Still Exposed (16.4.1, 2026)