In short
- The 3 November 2026 security release is Next.js 16.4.5 (Active LTS) and 15.5.29 (Maintenance LTS). Both include the fixes for every CVE on this page.
- Every exported Server Action can be called with a direct POST request, even if no screen uses it. Check the session and the record's owner inside each one.
- Proxy, called middleware before Next.js 16, is for optimistic redirects. CVEs in 2025 and 2026 let requests get past it, so the real check belongs where the data is read.
- Any variable named
NEXT_PUBLIC_is written into the JavaScript at build time. A secret behind that prefix is public, and old builds keep it after you remove it. - Next.js adds
X-Powered-Byby default and leaves CSP, HSTS and frame protection to you. Add them innext.config.ts, then check what the live app sends.
On this page
- Is Next.js secure? What it protects and what it leaves to you
- The Next.js vulnerabilities that matter, 2024 to November 2026
- How to check which Next.js version you run
- Next.js middleware auth: why proxy is not enough
- Server Actions are public endpoints
- Secrets: NEXT_PUBLIC_, source maps and server-only code
- Next.js security headers
- The image optimizer and the cache: quieter leaks
- What Keybrum tests on a live Next.js app
- Prompts to give your coding agent
- Next.js security checklist
- Questions
- Sources
Is Next.js secure? What it protects and what it leaves to you
Next.js is the React framework maintained by Vercel. One codebase holds your pages, your API routes (Route Handlers), your Server Actions and the code that talks to your database, so a Next.js app is a server, not only a website. Everything that depends on your data model stays your job: who owns which record, and which page needs a login. And the framework itself has had serious vulnerabilities, which only an upgrade fixes.
Here is the split, checked against the Next.js documentation in November 2026:
| Area | What Next.js does for you | What stays your job |
|---|---|---|
| Server Actions | Accepts only POST, compares the Origin header to the host, uses encrypted action ids and drops unused actions from the client bundle | Checking the session and the record's owner inside every action, and returning only what the UI needs |
| Environment variables | Keeps variables on the server unless their name starts with NEXT_PUBLIC_ | Never putting a secret behind that prefix |
| Source maps | Off in production builds unless you set productionBrowserSourceMaps: true | Leaving them off |
| Rendering | React escapes the values you render in JSX | Anything passed to dangerouslySetInnerHTML, and third-party scripts |
| Remote images | /_next/image only fetches hosts listed in images.remotePatterns | Listing exact hosts and paths, without broad wildcards |
| Authentication | Documents the patterns and lets proxy redirect early | Choosing an auth library and verifying the user where the data is read |
| Security headers | Adds X-Powered-By by default, and documents how to set the protective ones | Adding Content-Security-Policy, Strict-Transport-Security and the rest |
| Patches | Ships security fixes for the Active LTS (16.x) and Maintenance LTS (15.x) lines | Upgrading, and deploying from the lockfile |
Where you host changes a few of these. On Vercel, routing runs in a separate system, which is why the 2025 middleware bypass never reached apps hosted there. For React2Shell, Vercel designed firewall rules with the React team before the CVE was announced and deployed them to all its users. Neither replaces the upgrade: Vercel's own bulletin says WAF rules cannot block every variant and tells everyone to check their versions directly.
The Next.js vulnerabilities that matter, 2024 to November 2026
Most of them hit a place where an app trusts the framework to draw a line: proxy auth, Server Actions, the image optimizer or the cache. In 2026 alone, the GitHub Advisory Database lists five critical remote code execution advisories for next, three of them in image processing. The table lists the ones to know, with the affected and fixed versions from each advisory.
| Advisory | What it let a stranger do | Who was exposed | Fixed in |
|---|---|---|---|
| CVE-2024-34351, CVSS 7.5 | Make your server send requests to a host the attacker picks (server-side request forgery, SSRF) through a Server Action and a forged Host header | Self-hosted apps on 13.4.0 to 14.1.0 with a Server Action that redirects to a relative path | 14.1.1 |
| CVE-2025-29927, CVSS 9.1 | Skip middleware with one internal header, so pages protected only by middleware opened with no session | Self-hosted apps that checked auth in middleware; Vercel, Netlify and Cloudflare Workers were not affected | 15.2.3, 14.2.25, 13.5.9, 12.3.5 |
| CVE-2025-55182 (React2Shell), CVSS 10.0 | Run code on the server with one request and no login | App Router apps on Next.js 15.x and 16.x (and 14.3 canaries from canary.77), which bundle the affected React server code (19.0.0, 19.1.0, 19.1.1, 19.2.0). Exploited in the wild | Next.js 15.0.5, 15.1.9, 15.2.6, 15.3.6, 15.4.8, 15.5.7, 16.0.7; React 19.0.1, 19.1.2, 19.2.1 |
| CVE-2026-27978, medium | Trigger Server Actions from another site with the visitor's cookies, because Origin: null passed the CSRF check | 16.0.1 to 16.1.6 | 16.1.7 |
| CVE-2026-44575, CVSS 7.5 | Reach a page protected by middleware or proxy through its .rsc and segment-prefetch URL variants | App Router apps on 15.2.0 to 15.5.15 and 16.0.0 to 16.2.4 | 15.5.16, 16.2.5; with middleware.ts and Turbopack, 15.5.18, 16.2.6 (incomplete fix, CVE-2026-45109) |
| August 2026 release: CVE-2026-75604 and GHSA-2xp9-vwfh-vxw4, critical | Run code on the server through an attacker-controlled AVIF image the optimizer processes, or on Windows-hosted servers | AVIF: 10.0.0 to 15.5.23 and 16.0.0 to 16.3.2. Windows: 13.4.0 to 15.5.23 and 16.0.0 to 16.3.2 | 15.5.24, 16.3.3 |
| GHSA-vcvr-r3jv-pc5j, critical | Run code on the server through a next/og image route that puts visitor input into SVG content | 16.2.0 to 16.3.5, Node.js ImageResponse only | 16.3.6 |
| CVE-2026-94483, CVSS 6.5 | Use the image optimizer to reach private IPs through an allow-listed host whose DNS the attacker controls | 16.0.0 to 16.3.7, only with images.remotePatterns set | 16.3.8 |
| October 2026 release: GHSA-2464-fhr4-w9xw and GHSA-673q-mjm6-r5xr, critical | Run code on the server through an SVG the image optimizer processes, or through a use cache function that returns typed arrays. A third advisory, CVE-2026-94482, let crafted requests to Server Actions stall the server (13.0.0 to 15.5.27 and 16.0.0 to 16.4.0) | SVG: 10.0.0 to 15.5.27 and 16.0.0 to 16.4.0 on glibc Linux. use cache: 16.0.0 to 16.4.0 with Cache Components | 15.5.28, 16.4.1 |
| November 2026 release | Get another tenant's or user's cached data with Cache Components and use cache, or read HttpOnly cookie values through the x-middleware-set-cookie header of Edge routes | Mostly apps with Cache Components enabled; Edge Route Handlers and Edge API routes that set cookies with NextResponse.cookies.set() | 16.4.5, 15.5.29 |
How to check which Next.js version you run
- 1
Read the installed version, not the range
package.jsonmay say^15.2.0; the lockfile decides what ships. Runnpm ls next react react-dom(orpnpm why next,yarn why next) in the project. - 2
Compare it to the current floor
The 3 November 2026 security release is 16.4.5 for the 16.x line (Active LTS) and 15.5.29 for 15.x (Maintenance LTS). The Next.js support policy asks you to serve production from the latest release of one of those two lines, so a 14.x or older app needs a major upgrade, not a patch. Security releases for 15.x are promised only through 31 January 2027, so plan the move to 16.
- 3
Upgrade and deploy from the lockfile
Run
npm install [email protected](or[email protected]), commit the lockfile, and make sure your host installs withnpm cior the equivalent, so the version you tested is the version that runs. - 4
Hear about the next release first
Next.js usually announces security releases on its blog a week ahead, but it moved the August 2026 one forward for a new critical flaw. Watch the security advisories of the
vercel/next.jsrepository on GitHub.
# What is installed, including nested copies
npm ls next react react-dom
# The image library Next.js uses: 0.35.5 or later (October 2026 SVG advisory)
npm ls sharp
# Upgrade to the November 2026 security release (pick your line)
npm install [email protected]
npm install [email protected]
# Known advisories in your production dependencies
npm audit --omit=devNext.js middleware auth: why proxy is not enough
Next.js 16 renamed middleware to proxy: the file is now proxy.ts, it exports a proxy function and it runs on the Node.js runtime by default. The middleware.ts convention is deprecated. Either way, the Next.js authentication guide calls a check there optimistic: read the session cookie and redirect, without database queries, because proxy runs on every route, prefetches included. The secure check, against your session store, belongs where the data is read.
Two CVEs show why. CVE-2025-29927 let a request skip middleware with one header. CVE-2026-44575 let App Router requests reach a protected page through URL variants the matcher did not cover, and its advisory gives the lesson as a workaround: enforce authorization in the route or page itself instead of relying on middleware alone. They were not the only ones: in May and July 2026, GitHub published four more middleware or proxy bypass advisories for next, through i18n, dynamic route parameters, Turbopack with a single locale, and the incomplete first fix of CVE-2026-44575. Apps that already checked the user next to the data had nothing behind any of these bypasses.
// proxy.ts: fine as a first filter, wrong as the only one
import { NextResponse, type NextRequest } from 'next/server'
export function proxy(request: NextRequest) {
if (!request.cookies.get('session')) {
return NextResponse.redirect(new URL('/login', request.url))
}
}
export const config = { matcher: ['/dashboard/:path*'] }session exists. It says nothing about whose invoices the page then loads.// lib/dal.ts: the check that counts, next to the data
import 'server-only'
import { cache } from 'react'
import { redirect } from 'next/navigation'
import { getSession } from '@/lib/session' // your auth library
export const requireUser = cache(async () => {
const session = await getSession() // verified against your session store
if (!session) redirect('/login')
return session
})
// app/dashboard/invoices/page.tsx
import { requireUser } from '@/lib/dal'
import { db } from '@/lib/db'
import { InvoiceList } from './invoice-list'
export default async function InvoicesPage() {
const { userId } = await requireUser()
const invoices = await db.invoice.findMany({ where: { ownerId: userId } })
return <InvoiceList invoices={invoices} />
}requireUser() in every page, Route Handler and Server Action that reads private data. import 'server-only' turns an accidental import from a Client Component into a build error.Server Actions are public endpoints
A Server Action looks like a function call in your component. On the network it is a POST to your app that anyone can send. The Next.js data security guide says it plainly: an exported Server Action is reachable by a direct POST request, even if no screen of your app uses it, and a login check on a page does not extend to the actions defined in it. Next.js encrypts action ids and removes unused actions from the client bundle, which helps when a check is missing, but the ids of the actions your pages call ship in the JavaScript every visitor downloads.
So every action needs two checks: authentication (is someone signed in?) and authorization (may this user touch this record?). Skipping the second is an IDOR: change the id in the request, get or delete someone else's data.
'use server'
import { z } from 'zod'
import { requireUser } from '@/lib/dal'
import { db } from '@/lib/db'
// Bad: anyone who sends this action an id deletes that invoice
export async function deleteInvoiceUnsafe(id: string) {
await db.invoice.delete({ where: { id } })
}
// Good: validate the input, check the caller, scope the query to their rows
export async function deleteInvoice(input: unknown) {
const id = z.string().uuid().parse(input)
const { userId } = await requireUser()
const { count } = await db.invoice.deleteMany({ where: { id, ownerId: userId } })
if (count === 0) throw new Error('Not found')
return { ok: true } // return what the UI needs, never the raw row
}Against cross-site requests the defaults are good: actions only accept POST, and Next.js aborts the request when the Origin header does not match the host (or X-Forwarded-Host). CVE-2026-27978 was the gap: Next.js treated Origin: null, which sandboxed iframes send, as a missing origin and let it through until 16.1.7. Never add 'null' to experimental.serverActions.allowedOrigins, list only your own domains there if you run behind a reverse proxy, and set SameSite=Strict on sensitive auth cookies, as the advisory suggests.
Secrets: NEXT_PUBLIC_, source maps and server-only code
Next.js copies the value of every variable whose name starts with NEXT_PUBLIC_ into the JavaScript at build time. The name is the only switch. When a Client Component cannot read a variable, adding the prefix makes the error go away, and that is how secret keys end up in bundles. Public is fine for keys designed to be public. Anything else is readable by every visitor from the first deploy, see API keys exposed in the frontend.
Fine behind NEXT_PUBLIC_ | Never behind NEXT_PUBLIC_ |
|---|---|
Supabase URL and anon or publishable key (sb_publishable_...) | Supabase service role key or secret key (sb_secret_...), see the service role guide |
Stripe publishable key (pk_live_...) | Stripe secret key (sk_live_...) and webhook secret (whsec_...) |
| Firebase web config, analytics ids | OpenAI, Anthropic or other AI provider keys |
| Your public site URL | Database URLs, session or JWT secrets, private keys |
To check, build the app and search what the browser receives, not your source:
npm run build
# Every public variable your code references
grep -rhoE "NEXT_PUBLIC_[A-Z0-9_]+" app src lib components 2>/dev/null | sort -u
# Secret key formats in the files sent to browsers
grep -rlE "sk_live_|sk-proj-|sk-ant-|sb_secret_|whsec_|PRIVATE KEY" .next/static.next/static is a key every visitor can read. Move it to a server-only variable, call the provider from a Route Handler or Server Action, and rotate the key: removing it from the next build does not take it back from the old one.Two related leaks. Production source maps are off by default, and productionBrowserSourceMaps: true makes Next.js serve your original source next to each JavaScript file, comments and internal routes included. And everything in the public/ folder is served at your site's root, so a .env file or a database export copied there is one URL away, see exposed .env files. Mark the modules that hold secrets or database access with import 'server-only', so importing one from a Client Component fails the build instead of shipping the code.
Next.js security headers
Out of the box, Next.js adds an X-Powered-By header that tells everyone what you run; poweredByHeader: false removes it. The protective headers are left to you, and the Next.js docs show how to set them. The simplest place is headers() in next.config.ts:
// next.config.ts
import type { NextConfig } from 'next'
const securityHeaders = [
{ key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
{ key: 'X-Content-Type-Options', value: 'nosniff' },
{ key: 'Referrer-Policy', value: 'strict-origin-when-cross-origin' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'self'; base-uri 'self'; object-src 'none'" },
]
const nextConfig: NextConfig = {
poweredByHeader: false,
async headers() {
return [{ source: '/:path*', headers: securityHeaders }]
},
}
export default nextConfigStrict-Transport-Security value is the one in the Next.js docs. Keep includeSubDomains only if every subdomain serves HTTPS, and read the HSTS preload trap before you keep preload: once a domain is on the preload list, removing it takes months. This CSP covers framing, plugins and base URLs, not scripts.A strict Content-Security-Policy for scripts needs a nonce: a random value, new on every request, that marks your own inline scripts as allowed. Next.js can generate it in proxy, but its docs say a page must be rendered dynamically to get a nonce, so the pages that use one cannot be static. If that cost is too high, ship the partial policy above first, and try a script policy in Content-Security-Policy-Report-Only before you enforce it. The security headers guide has the full nonce setup and the report-only rollout, with config for Vercel, Netlify and Cloudflare.
The image optimizer and the cache: quieter leaks
/_next/image fetches remote images from your server. Next.js only lets it fetch hosts that match images.remotePatterns and answers 400 to the rest, and since version 16 it refuses addresses on your local network unless you set dangerouslyAllowLocalIP: true. Three things weaken it: broad wildcards; redirects, which the optimizer follows up to 3 times by default without checking the new location against your patterns; and allowed hosts whose DNS someone else controls, the case behind CVE-2026-94483. Pin the list:
// next.config.ts, inside nextConfig
images: {
remotePatterns: [new URL('https://YOUR_PROJECT.supabase.co/storage/v1/object/public/avatars/**')],
maximumRedirects: 0,
},maximumRedirects exists since Next.js 16.The optimizer also decodes whatever image it is given, and decoders are written in C. In August 2026 a flaw in libheif, which sharp uses for AVIF, allowed code execution through an attacker-controlled AVIF image, so the patched releases turned AVIF optimization off. In October 2026 a memory flaw in an upstream image library did the same with SVG files on glibc-based Linux. The fix for both is the upgrade, and for the SVG flaw on 15.x it is not enough on its own: 15.5.28 still accepts sharp 0.34, so run npm ls sharp and make sure it shows 0.35.5 or later. The GHSA-2464-fhr4-w9xw page has the commands.
Caching is the other quiet one. A page or Route Handler that returns one user's data must never be stored where the next visitor gets it, whether by use cache, unstable_cache or a CDN in front of the app. Three advisories in the November 2026 release were exactly this: with Cache Components, a result computed for one tenant or user could be served to another. After upgrading, keep per-user data out of shared caches and send Cache-Control: private, no-store on authenticated responses.
What Keybrum tests on a live Next.js app
The checks above read your code. Keybrum reads your deployed app from the outside, the way a stranger would, and keeps a finding only when the behavior is proven: a CVE is never reported from a version number alone. It only attacks apps whose owner proved ownership.
| Attack | What a finding proves |
|---|---|
web.nextjs-middleware-bypass | A protected page answers with no session when the internal middleware header is sent (CVE-2025-29927) or when it is requested as a router prefetch |
web.middleware-path-bypass | A page that redirects to login opens through a path variant the matcher misses: double slash, encoded character, case change |
web.nextjs-action-csrf | Server Actions reject a foreign Origin but accept Origin: null (CVE-2026-27978) |
web.nextjs-action-ssrf | A Server Action made your server call Keybrum's callback through a forged Host header (CVE-2024-34351) |
web.nextjs-image-ssrf | /_next/image fetched a unique Keybrum callback URL, so the optimizer reaches hosts it should refuse (the CVE-2026-94483 family) |
web.rsc-surface | Your app answers the React Server Components protocol and ships Server Action ids, so the React2Shell surface is live and the version must be patched. No exploit is sent |
web.source-maps, web.env-file, web.security-headers | Original source or .env files served to anyone, or protective headers missing |
web.cache-private-data, web.api-idor | A signed-in user's data served to a visitor with no session, or to a second account |
Each finding comes with the request that worked and a fix your coding agent reads through Keybrum's MCP server. After the fix, the same attack runs again.
Prompts to give your coding agent
If Cursor, Claude Code or another agent wrote your app, give it these one at a time and read the diff before you merge:
1. Upgrade next to 16.4.5 (or 15.5.29 if we stay on 15), update react and react-dom to the versions it expects, run the build and the tests, and commit the lockfile.
2. List every exported Server Action and Route Handler. For each one, show where it checks the session and where it checks that the record belongs to the caller. Add both where missing, through one requireUser() helper in lib/dal.ts marked with import 'server-only'.
3. Keep proxy.ts as an optimistic redirect only. Every page that reads private data must call requireUser() itself.
4. List every NEXT_PUBLIC_ variable and say whether its value is meant to be public. Move any secret to a server-only variable and call the provider from the server.
5. Add security headers in next.config.ts (Strict-Transport-Security, X-Content-Type-Options, Referrer-Policy, a CSP with frame-ancestors), set poweredByHeader: false, and confirm productionBrowserSourceMaps is not enabled.
6. Restrict images.remotePatterns to exact hosts and paths, and set images.maximumRedirects to 0.Next.js security checklist
- Next.js 16.4.5 or 15.5.29 or later, confirmed with
npm ls nextand in the deployed build, andsharp0.35.5 or later - Every Server Action and Route Handler checks the session and the record's owner
- Proxy (or middleware) only does optimistic redirects; pages check the user themselves
- No secret behind
NEXT_PUBLIC_, and no secret key format in.next/static productionBrowserSourceMapsoff, nothing private inpublic/Strict-Transport-Security,X-Content-Type-Options,Referrer-Policyand a CSP withframe-ancestorssent;X-Powered-Byremovedimages.remotePatternslists exact hosts,maximumRedirectsset- Per-user responses never stored in a shared cache
experimental.serverActions.allowedOriginslists only your domains, never'null'- Security advisories of
vercel/next.jswatched on GitHub - On Supabase: RLS on every table, see the Supabase RLS guide
For the parts outside Next.js, the vibe coding security checklist covers the database, payments and AI endpoints, and vibe coding security risks explains where generated apps usually break.
Questions
Is Next.js secure by default?
The framework layer has good defaults: escaped rendering, origin checks on Server Actions, no production source maps, and environment variables that stay on the server unless prefixed. It does not know your data model, so authorization, security headers and secret handling are yours. Like any framework it also has CVEs, so staying on a patched version is part of the job.
What are the most serious Next.js vulnerabilities?
React2Shell (CVE-2025-55182), a CVSS 10.0 remote code execution flaw in React Server Components that was exploited in the wild, and the CVE-2025-29927 middleware bypass, rated 9.1. In 2026, five critical advisories allowed code execution: through AVIF and SVG images in the optimizer, next/og, use cache and Windows hosts. Next.js 16.4.5 and 15.5.29 include the fixes for all of them.
Is middleware auth enough in Next.js?
No. The Next.js docs present proxy (middleware before Next.js 16) as a place for optimistic checks that read the session cookie and redirect. CVEs in 2025 and 2026 let requests get past it, so verify the session and the record's owner in each page, Route Handler and Server Action as well.
How do I add security headers in Next.js?
Return them from the headers() function in next.config.ts for the source /:path*, or set them in proxy when you need a per-request nonce for a Content-Security-Policy. Set poweredByHeader: false to drop X-Powered-By. Then check the live response, since a CDN or host can add or strip headers.
Are NEXT_PUBLIC_ environment variables safe?
They are public by definition: Next.js writes their values into the JavaScript at build time. That is fine for a Supabase publishable key or a Stripe publishable key, and a leak for any secret key. If a secret was ever behind the prefix, rotate it, because old builds still contain it.
Can anyone call my Server Actions?
Yes. Next.js documents that an exported Server Action is reachable by a direct POST request, even if your UI never calls it. The built-in Origin check stops other websites from acting through a visitor's browser; it does not stop someone sending the request from a script. Check authentication and authorization inside every action.
Does hosting on Vercel protect my Next.js app?
Against some framework bugs, partly: Vercel's routing design kept apps hosted there out of reach of CVE-2025-29927, and it deployed firewall rules for React2Shell. It does nothing for a Server Action without an ownership check or a secret behind NEXT_PUBLIC_, and Vercel itself tells users to upgrade.
Sources
- 1.November 2026 Security Release, Next.js Blog
- 2.How to think about data security in Next.js, Next.js Docs
- 3.How to implement authentication in Next.js, Next.js Docs
- 4.proxy.js file convention, Next.js Docs
- 5.Environment variables, Next.js Docs
- 6.productionBrowserSourceMaps, Next.js Docs
- 7.headers, Next.js Docs
- 8.poweredByHeader, Next.js Docs
- 9.How to set a Content Security Policy (CSP), Next.js Docs
- 10.Image component (remotePatterns, maximumRedirects), Next.js Docs
- 11.Support policy, Next.js
- 12.August 2026 Security Release, Next.js Blog
- 13.Upcoming Next.js September Security Release, Next.js Blog
- 14.Authorization Bypass in Next.js Middleware (GHSA-f82v-jwr5-mffw), GitHub Security Advisory
- 15.React Server Components are vulnerable to RCE (GHSA-fv66-9v8q-g76r), GitHub Advisory Database
- 16.Next.js is vulnerable to RCE in React flight protocol (GHSA-9qr9-h5gf-34mp), GitHub Advisory Database
- 17.CVE-2025-55182, NIST National Vulnerability Database
- 18.Next.js Server-Side Request Forgery in Server Actions (GHSA-fr5h-rqp8-mj6g), GitHub Advisory Database
- 19.Null origin can bypass Server Actions CSRF checks (GHSA-mq59-m269-xvcx), GitHub Advisory Database
- 20.Middleware / Proxy bypass via segment-prefetch routes (GHSA-267c-6grr-h53f), GitHub Advisory Database
- 21.Server-Side Request Forgery in Image Optimization (GHSA-cjq9-62q9-8jv4), GitHub Advisory Database
- 22.Unauthenticated RCE in Image Optimization API when AVIF files are used (GHSA-2xp9-vwfh-vxw4), GitHub Advisory Database
- 23.Unauthenticated RCE on Windows-hosted servers (GHSA-p293-qw3h-jr36), GitHub Advisory Database
- 24.Remote Code Execution in next/og ImageResponse (GHSA-vcvr-r3jv-pc5j), GitHub Advisory Database
- 25.Unauthenticated RCE in Image Optimization API when SVG files are used (GHSA-2464-fhr4-w9xw), GitHub Advisory Database
- 26.Unauthenticated RCE in use cache functions returning typed arrays (GHSA-673q-mjm6-r5xr), GitHub Advisory Database
- 27.Denial of Service in App Router using Server Actions (GHSA-p3m5-59mp-jv5r), GitHub Advisory Database
- 28.Postmortem on Next.js Middleware bypass, Vercel
- 29.React2Shell security bulletin, Vercel