{"id":"CVE-2026-94485","kind":"vulnerability","aliases":["CVE-2026-94485","GHSA-f87g-xv8r-7p7x"],"related":[],"title":"Next.js has information disclosure in App Router metadata image routes via dynamicParams bypass","description":"Next.js is a React framework for building full-stack web applications. From 16.0.0 until 16.3.8, the `next dev` development server exposes a Model Context Protocol endpoint without reliably restricting cross-site requests. A malicious website visited by a developer can reach the endpoint and read the project's disk location, source code snippets from error reports, route inventory, and development logs. Production deployments do not serve this endpoint. This issue is fixed in version 16.3.8.","summary":"In Next.js App Router apps built with webpack, metadata image routes such as opengraph-image and twitter-image ignore the dynamicParams setting. An attacker can request image URLs for dynamic segments that the app meant to exclude from generateStaticParams, disclosing information those routes were meant to hide.","severity":"medium","cvss":6.3,"epss":0.00173,"exploited":false,"exploited_at":null,"products":[{"name":"next","fixed":["16.3.?"],"affected":">= 16.0.0","ecosystem":"npm"},{"name":"next","fixed":["16.3.8"],"affected":">= 16.0.0, < 16.3.8","ecosystem":"npm"},{"name":"vercel next.js","fixed":["16.3.8"],"affected":">= 16.0.0, < 16.3.8","ecosystem":"vendor"}],"ecosystems":["npm","vendor"],"tags":["cwe-346","next.js","package","self-hosted","vercel"],"not_affected_if":["default-config","static-export"],"how_to_check":"- Check the Next.js version with `npm ls next` and compare it against the affected range.\n- Look for `opengraph-image` or `twitter-image` files under App Router `app/` directories that rely on `dynamicParams = false` or on a restricted `generateStaticParams()`.\n- Confirm whether the build uses webpack (the default bundler in the affected versions).","fix":"- `next` `16.3.8` for affected versions `>= 16.0.0, < 16.3.8`\n- Versions in the product data also list a fixed entry of `16.3.?`, which is unclear and should not be relied on alone.","status":"open","published_at":"2026-09-30T16:14:44+00:00","first_seen_at":"2026-11-09T22:53:14+00:00","triaged_at":"2026-11-09T23:00:53+00:00","updated_at":"2026-11-09T23:10:12+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-11-09T23:00:53Z","model":"claude-haiku-5-5","output":{"fix":"- `next` `16.3.8` for affected versions `>= 16.0.0, < 16.3.8`\n- Versions in the product data also list a fixed entry of `16.3.?`, which is unclear and should not be relied on alone.","reach":"internet","title":"Next.js: metadata image routes ignore dynamicParams, exposing excluded pages","impact":"low","summary":"In Next.js App Router apps built with webpack, metadata image routes such as opengraph-image and twitter-image ignore the dynamicParams setting. An attacker can request image URLs for dynamic segments that the app meant to exclude from generateStaticParams, disclosing information those routes were meant to hide.","audience":"developers","category":"package","nicknames":[],"who_cares":["next.js","self-hosted","vercel"],"confidence":0.6,"fix_status":"available","needs_auth":"no","worst_case":"unauthenticated users read content from routes meant to be excluded","analyst_note":"Ecosystem and fix version unclear: product data lists both 16.3.? and 16.3.8; confirm fixed version against the GHSA page.","how_to_check":"- Check the Next.js version with `npm ls next` and compare it against the affected range.\n- Look for `opengraph-image` or `twitter-image` files under App Router `app/` directories that rely on `dynamicParams = false` or on a restricted `generateStaticParams()`.\n- Confirm whether the build uses webpack (the default bundler in the affected versions).","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["static-export","default-config"],"who_is_affected":"Applications using the Next.js App Router with metadata image routes (opengraph-image, twitter-image) built with webpack. Apps that do not use dynamicParams restrictions on those routes, or that do not use the App Router, are less exposed.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000811,"input_tokens":4769,"output_tokens":668,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,23A '-346':30B '-94485':16A,24A '16.0.0':99C '16.3.8':101C,162C '7p7x':21A 'app':6A,39B,41B,72B 'applic':97C 'attack':62B 'build':92C 'built':42B 'bypass':13A 'code':139C 'context':110C 'cross':117C 'cross-sit':116C 'cve':14A,22A 'cwe':29B 'deploy':150C 'dev':104C 'develop':105C,126C,147C 'disclos':78B 'disclosur':4A 'disk':136C 'dynam':68B 'dynamicparam':12A,59B 'endpoint':112C,130C,155C 'error':142C 'exclud':75B 'expos':107C 'f87g':19A 'fix':159C 'framework':90C 'full':94C 'full-stack':93C 'generatestaticparam':77B 'ghsa':18A 'ghsa-f87g-xv8r-7p7x':17A 'hide':85B 'host':35B 'ignor':57B 'imag':9A,46B,52B,56B,65B 'inform':3A,79B 'inventori':145C 'issu':157C 'locat':137C 'log':148C 'malici':121C 'meant':73B,83B 'metadata':8A,45B 'model':109C 'next':25A,26A,103C 'next.js':1A,28A,31B,38B,86C 'opengraph':51B 'opengraph-imag':50B 'packag':32B 'product':149C 'project':134C 'protocol':111C 'reach':128C 'react':89C 'read':132C 'reliabl':114C 'report':143C 'request':64B,119C 'restrict':115C 'rout':10A,47B,81B,144C 'router':7A,40B 'segment':69B 'self':34B 'self-host':33B 'serv':153C 'server':106C 'set':60B 'site':118C 'snippet':140C 'sourc':138C 'stack':95C 'twitter':55B 'twitter-imag':54B 'url':66B 'vercel':27A,36B 'version':161C 'via':11A 'visit':123C 'web':96C 'webpack':44B 'websit':122C 'without':113C 'xv8r':20A","nicknames":[],"mitigations":[],"who_affected":"Applications using the Next.js App Router with metadata image routes (opengraph-image, twitter-image) built with webpack. Apps that do not use dynamicParams restrictions on those routes, or that do not use the App Router, are less exposed.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["next","nextjs","vercelnextjs"],"ptokens":["next","nextjs","vercel"],"labels":["cwe346","medium","nextjs","npm","package","selfhosted","vendor","vercel"],"campaign_type":null,"search_a":"'-2026':15A,23A '-94485':16A,24A '7p7x':21A 'app':6A 'bypass':13A 'cve':14A,22A 'disclosur':4A 'dynamicparam':12A 'f87g':19A 'ghsa':18A 'ghsa-f87g-xv8r-7p7x':17A 'imag':9A 'inform':3A 'metadata':8A 'next':25A,26A 'next.js':1A,28A 'rout':10A 'router':7A 'vercel':27A 'via':11A 'xv8r':20A","search_b":"'-346':30B 'app':39B,41B,72B 'attack':62B 'built':42B 'cwe':29B 'disclos':78B 'dynam':68B 'dynamicparam':59B 'exclud':75B 'generatestaticparam':77B 'hide':85B 'host':35B 'ignor':57B 'imag':46B,52B,56B,65B 'inform':79B 'meant':73B,83B 'metadata':45B 'next.js':31B,38B 'opengraph':51B 'opengraph-imag':50B 'packag':32B 'request':64B 'rout':47B,81B 'router':40B 'segment':69B 'self':34B 'self-host':33B 'set':60B 'twitter':55B 'twitter-imag':54B 'url':66B 'vercel':36B 'webpack':44B","search_c":"'16.0.0':99C '16.3.8':101C,162C 'applic':97C 'build':92C 'code':139C 'context':110C 'cross':117C 'cross-sit':116C 'deploy':150C 'dev':104C 'develop':105C,126C,147C 'disk':136C 'endpoint':112C,130C,155C 'error':142C 'expos':107C 'fix':159C 'framework':90C 'full':94C 'full-stack':93C 'inventori':145C 'issu':157C 'locat':137C 'log':148C 'malici':121C 'model':109C 'next':103C 'next.js':86C 'product':149C 'project':134C 'protocol':111C 'reach':128C 'react':89C 'read':132C 'reliabl':114C 'report':143C 'request':119C 'restrict':115C 'rout':144C 'serv':153C 'server':106C 'site':118C 'snippet':140C 'sourc':138C 'stack':95C 'version':161C 'visit':123C 'web':96C 'websit':122C 'without':113C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-09-30T16:14:44+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa-repo","external_id":"GHSA-f87g-xv8r-7p7x","url":"https://github.com/vercel/next.js/security/advisories/GHSA-f87g-xv8r-7p7x","severity":"medium","published_at":"2026-09-30T16:14:44+00:00","modified_at":"2026-09-30T16:14:44+00:00","first_seen_at":"2026-11-09T22:53:14+00:00","fetched_at":"2026-11-09T22:53:14+00:00","note":null},{"source":"ghsa","external_id":"GHSA-f87g-xv8r-7p7x","url":"https://github.com/advisories/GHSA-f87g-xv8r-7p7x","severity":"medium","published_at":"2026-10-07T20:31:33+00:00","modified_at":"2026-10-07T20:31:35+00:00","first_seen_at":"2026-11-09T22:57:50+00:00","fetched_at":"2026-11-09T22:57:50+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-94485","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-94485","severity":null,"published_at":"2026-10-02T16:16:51+00:00","modified_at":"2026-10-05T14:57:42+00:00","first_seen_at":"2026-11-09T23:10:12+00:00","fetched_at":"2026-11-09T23:10:12+00:00","note":null}],"documents":[{"id":110402,"url":"https://github.com/vercel/next.js/security/advisories/GHSA-f87g-xv8r-7p7x","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa-repo","publisher":"vendor","text":null,"published_at":"2026-09-30T16:14:44+00:00","relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":110767,"url":"https://api.github.com/repos/vercel/next.js/security-advisories/GHSA-f87g-xv8r-7p7x","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":110769,"url":"https://github.com/vercel/next.js/commit/2d9f50a409312696145b82b3157aadb6b1fef476","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":43051,"url":"https://github.com/vercel/next.js/releases/tag/v16.3.8","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"}],"disclosures":[],"exploit_sources":[{"type":"epss","score":0.00173,"url":"https://api.first.org/data/v1/epss?cve=CVE-2026-94485"}],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}