Next.js: Server-Side Request Forgery in rewrites via attacker-controlled destination hostname
Published 22 Jul 2026 · Updated 10 Sept 2026
Affected packages
- Affected
- >=12.0.0 <15.5.21
- Fixed in
- 15.5.21
npm install next@15.5.21- Affected
- >=16.0.0 <16.2.11
- Fixed in
- 16.2.11
npm install next@16.2.11Details
Impact
A rewrites() or redirects() rule that builds its external destination hostname from request-controlled input can be pointed at an arbitrary hostname, regardless of the rule's hostname suffix. For a rewrite, Next.js proxies the request to that arbitrary host and serves the response from the application's origin, leading to Server-Side Request forgery. A redirects() rule configured this way is vulnerable to an Open Redirect.
This affects any destination that puts a dynamic segment in the hostname, whether from the path:
// next.config.js
module.exports = {
async rewrites() {
return [
{
source: '/:tenant',
destination: 'https://:tenant.api.example.com',
},
]
},
}or from a has capture:
// next.config.js
module.exports = {
async rewrites() {
return [
{
source: '/',
has: [{ type: 'query', key: 'region', value: '(?<region>.+)' }],
destination: 'https://:region.api.example.com',
},
]
},
}Workarounds
If you cannot upgrade immediately, do not build the hostname of an external rewrites() or redirects() destination from user-controlled input. If a dynamic subdomain is required, constrain the value to hostname-safe characters: value: '(?<region>[a-z0-9-]+)'.
Is GHSA-p9j2-gv94-2wf4 in any of your client repos?
Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected next, and gives you the command that fixes it.
References
- Linkgithub.com/vercel/next.js/security/advisories/GHSA-p9j2-gv94-2wf4
- Linkgithub.com/vercel/next.js/commit/35f501357e9b0fe7c950b0d6aa8fcf5343f707e9
- Linkgithub.com/vercel/next.js/commit/d3033266c6dff23f7be71e19341fe3a8c6e2c599
- Packagegithub.com/vercel/next.js
- Linkgithub.com/vercel/next.js/releases/tag/v15.5.21
- Linkgithub.com/vercel/next.js/releases/tag/v16.2.11
Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.