What the checker looks at
It reads four packages: next, react, react-dom, and the react-server-dom-* packages (webpack, turbopack, parcel) that run React Server Components. It compares each version with the affected ranges published on our CVE pages, one release line at a time, and gives you the first version that fixes each flaw on your line.
| What you give it | What it learns | How exact |
|---|---|---|
| A version you type | One version, or a release line like 15.1 | Exact when you type all three numbers |
| package.json | A range like ^15.1.0 | The lowest version the range allows |
| package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock | The versions actually installed | Exact |
Output of npm ls next react | The versions actually installed | Exact |
Why package.json is not enough. "next": "^15.1.0" means 15.1.0 or any later 15.x release. The lockfile records which one was installed. With a range, the checker evaluates the lowest version it allows and tells you so: that is the worst case, and your lockfile may already pin a release with the fix.
Why react-server-dom matters. React2Shell (CVE-2025-55182) is in react-server-dom-webpack, react-server-dom-parcel and react-server-dom-turbopack, not in react itself. React's advisory lists 19.0, 19.1.0, 19.1.1 and 19.2.0 as affected and 19.0.1, 19.1.2 and 19.2.1 as fixed. Next.js ships its own copy of these packages inside next, so for a Next.js app the Next.js version is what counts. With React Router, Waku or a Vite or Parcel Server Components plugin, the copy in your lockfile counts. An app that renders React only in the browser does not run this code.
How to read the result
- The verdict comes first, in one sentence, colored by the worst severity it found.
- Affected lists each CVE your version contains, worst first: what it lets a stranger do, the first version that fixes it on your release line, and the install command for npm, pnpm, yarn or bun. When that first fix still carries another CVE on the list, the command skips ahead to the first release none of them affect.
- One upgrade clears all of them appears when several CVEs apply. It is the lowest version that none of them affect, so you upgrade once.
- May apply holds the CVEs a version alone cannot settle, such as a
react-server-dompackage your framework may or may not install, or a canary build numbered before the affected range starts. The card says what to check. - Not affected and Not checked stay folded: the CVEs your release already has the fix for, and the ones that need a version you did not give.
Several CVEs only matter in some setups. The middleware bypass (CVE-2025-29927) matters when middleware does your auth checks, and its advisory says deployments hosted on Vercel are protected automatically. React2Shell hits the App Router, not the Pages Router. Each card links to the part of its CVE page that says who is affected.
How to fix what it finds
- 1
Confirm what is installed
Run
npm ls next react react-domin the project, orpnpm why nextandyarn why next. That is the version your build uses, whatever package.json says. - 2
Install the fixed version
Copy the command from the result. It writes the new version to package.json and to the lockfile in one go.
- 3
Commit the lockfile and redeploy
The fix exists only once the new build serves your traffic. A server still running the old build is still affected.
- 4
Rotate secrets after a code execution flaw
For React2Shell, Next.js asks anyone whose app was online and unpatched on December 4, 2025 to rotate the secrets it uses, starting with the most critical ones.
# What your project really installs
npm ls next react react-dom
# Replace VERSION with the one the checker gives you
npm install next@VERSION
# React outside Next.js: keep these on one version
npm install react@VERSION react-dom@VERSION react-server-dom-webpack@VERSIONpnpm add, yarn add or bun add. The checker writes the command for the package manager your lockfile uses.If you cannot upgrade today, some CVEs have a stopgap. For the middleware bypass, the advisory says to stop outside requests that carry the x-middleware-subrequest header before they reach Next.js. Behind nginx, one line in the block that proxies to your app does it:
location / {
proxy_set_header x-middleware-subrequest "";
proxy_pass http://127.0.0.1:3000;
}React2Shell has no workaround: the Next.js advisory says upgrading is required. Hosting providers added filtering rules after disclosure, and React's own advisory warns you not to depend on them.
What a version check cannot tell you
A version check lists the known flaws your release contains. It is not proof that a stranger can use them on your app, for four reasons.
- It cannot see your setup. A middleware bypass changes nothing if every route checks the session itself, and everything if middleware is your only check.
- It cannot see your deploy. The lockfile in your repository and the build in production drift apart when a deploy fails or a server never gets rebuilt.
- It only knows the CVEs on our list. A new advisory reaches the checker when its CVE page is published, and canary releases are matched by version number only.
- A range is a worst case. With package.json alone, the answer is about the lowest version the range allows. Paste the lockfile for the truth.
Keybrum works from the other end: it tests each reachable CVE on your live app by its behaviour, never by version, and never runs code execution or denial of service payloads. For the leaks a version cannot show, such as keys in the JavaScript bundle or routes that skip the auth check, read the Next.js security guide.
Questions
How do I check if my Next.js version is vulnerable?
Type the version into the checker above, or paste your lockfile for the exact installed version. It lists every CVE on our list that your version contains and the first release that fixes each one. In a terminal, npm ls next prints the version your project installs.
Is this a React2Shell scanner?
It is the version side of one: it tells you whether your Next.js or react-server-dom version contains React2Shell (CVE-2025-55182) and which release fixes it, without sending anything to your app. Keybrum's attack checks whether the vulnerable surface is reachable on your live app, without running the exploit.
Which versions fix CVE-2025-55182?
For the React packages (react-server-dom-webpack, -parcel and -turbopack), 19.0.1, 19.1.2 and 19.2.1. For Next.js, 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7 and 16.0.7 on their lines, per the Next.js advisory. Later CVEs in the same code were fixed in later releases, so take the version the checker gives you rather than the first fix.
Is my app affected if package.json says ^15.1.0?
Maybe. ^15.1.0 allows any 15.x release from 15.1.0 up, and only the lockfile records which one is installed. The checker evaluates 15.1.0, the lowest the range allows, so the result is the worst case. Paste package-lock.json, pnpm-lock.yaml or yarn.lock for the exact answer.
Does a patched Next.js version mean my app is safe?
No. It means the CVEs on this list are fixed in your release. Your own code can still leak: keys in the JavaScript bundle, routes that skip the auth check, database rules that let anyone read. Those need a test of the live app, which is what the free check starts.
Does the checker send my lockfile anywhere?
No. The page reads what you paste inside your browser and never sends, stores or logs it. Only the kind of result, such as affected or clear, reaches our analytics, never what you pasted, and only if you accepted cookies.