{"id":"CVE-2026-120213","kind":"vulnerability","aliases":["CVE-2026-120213"],"related":[],"title":"@fastify/http-proxy: route parameters can escape the pinned upstream path","description":"@fastify/http-proxy is a Fastify plugin that proxies HTTP requests to an upstream server under a configured prefix. In versions 9.0.0 through 11.6.5, when an application uses parameterized prefix and rewritePrefix options to pin clients to a fixed upstream path, the plugin substitutes URL-decoded route parameters into rewritePrefix without re-encoding them. A parameter value that encodes a path separator together with a fragment or query delimiter therefore decodes into real separators and delimiters that inject extra upstream path segments and strip the mandatory suffix the rewritePrefix was meant to enforce, without using any dot-dot traversal. An unauthenticated remote attacker can use this to reach upstream locations outside the intended prefix, leading to path-restriction bypass and, depending on the upstream, server-side request forgery or authorization bypass in the proxied service. The issue is fixed in @fastify/http-proxy 11.6.6, and users should upgrade to 11.6.6 or later. There is no workaround other than upgrading.","summary":"When an app uses parameterized prefix and rewritePrefix options, URL-decoded route parameters are inserted into the upstream path without re-encoding. A crafted parameter can inject path separators and query or fragment delimiters, letting an unauthenticated remote attacker reach upstream paths outside the intended prefix and bypass the enforced suffix, which can enable SSRF or authorization bypass in the proxied service.","severity":"critical","cvss":9.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["fastify","node","package","self-hosted"],"not_affected_if":["no-parameterized-rewriteprefix","versions-below-9.0.0-or-above-11.6.5"],"how_to_check":"- Check the installed version of `@fastify/http-proxy` in the lockfile or with `npm ls @fastify/http-proxy`.\n- Look for routes that use both `prefix` and `rewritePrefix` with route parameters in them.","fix":"- `@fastify/http-proxy` `11.6.6` or later (affected: `9.0.0` through `11.6.5`).\n- No workaround other than upgrading, per the advisory.","status":"open","published_at":"2026-11-02T11:17:31+00:00","first_seen_at":"2026-11-02T11:22:53+00:00","triaged_at":"2026-11-02T11:24:13+00:00","updated_at":"2026-11-02T11:24:13+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-02T11:24:13Z","model":"claude-haiku-5-5","output":{"fix":"- `@fastify/http-proxy` `11.6.6` or later (affected: `9.0.0` through `11.6.5`).\n- No workaround other than upgrading, per the advisory.","reach":"internet","title":"@fastify/http-proxy: route parameters can escape the pinned upstream path","impact":"medium","summary":"When an app uses parameterized prefix and rewritePrefix options, URL-decoded route parameters are inserted into the upstream path without re-encoding. A crafted parameter can inject path separators and query or fragment delimiters, letting an unauthenticated remote attacker reach upstream paths outside the intended prefix and bypass the enforced suffix, which can enable SSRF or authorization bypass in the proxied service.","audience":"developers","category":"package","nicknames":[],"who_cares":["fastify","node","self-hosted"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Attacker reaches unintended upstream paths, possibly SSRF or authorization bypass","analyst_note":"","how_to_check":"- Check the installed version of `@fastify/http-proxy` in the lockfile or with `npm ls @fastify/http-proxy`.\n- Look for routes that use both `prefix` and `rewritePrefix` with route parameters in them.","plain_action":"","needs_analyst":false,"not_affected_if":["versions-below-9.0.0-or-above-11.6.5","no-parameterized-rewritePrefix"],"who_is_affected":"Applications that use the @fastify/http-proxy plugin with parameterized prefix and rewritePrefix options to pin clients to a fixed upstream path. Exposure depends on the proxied upstream: SSRF or authorization bypass depends on what that service trusts. Apps that proxy with a fixed prefix and no route parameters in the rewrite are not described as affected.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"critical"},"cost_usd":0.00078,"input_tokens":4396,"output_tokens":681,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-120213':12A,15A '-2026':11A,14A '11.6.5':107C '11.6.6':230C,236C '9.0.0':105C 'app':24B 'applic':110C 'attack':62B,189C 'author':80B,218C 'bypass':71B,81B,206C,219C 'client':119C 'configur':101C 'craft':47B 'cve':10A,13A 'decod':33B,130C,156C 'delimit':57B,154C,161C 'depend':208C 'dot':183C,184C 'dot-dot':182C 'enabl':77B 'encod':45B,138C,144C 'enforc':73B,178C 'escap':5A 'extra':164C 'fastifi':16B,89C 'fastify/http-proxy':1A,86C,229C 'fix':122C,227C 'forgeri':216C 'fragment':56B,151C 'host':21B 'http':93C 'inject':50B,163C 'insert':37B 'intend':68B,199C 'issu':225C 'later':238C 'lead':201C 'let':58B 'locat':196C 'mandatori':171C 'meant':176C 'node':17B 'option':30B,116C 'outsid':66B,197C 'packag':18B 'paramet':3A,35B,48B,132C,141C 'parameter':26B,112C 'path':9A,41B,51B,65B,124C,146C,166C,204C 'path-restrict':203C 'pin':7A,118C 'plugin':90C,126C 'prefix':27B,69B,102C,113C,200C 'proxi':84B,92C,222C 'queri':54B,153C 're':44B,137C 're-encod':43B,136C 'reach':63B,194C 'real':158C 'remot':61B,188C 'request':94C,215C 'restrict':205C 'rewriteprefix':29B,115C,134C,174C 'rout':2A,34B,131C 'segment':167C 'self':20B 'self-host':19B 'separ':52B,147C,159C 'server':98C,213C 'server-sid':212C 'servic':85B,223C 'side':214C 'ssrf':78B 'strip':169C 'substitut':127C 'suffix':74B,172C 'therefor':155C 'togeth':148C 'travers':185C 'unauthent':60B,187C 'upgrad':234C,245C 'upstream':8A,40B,64B,97C,123C,165C,195C,211C 'url':32B,129C 'url-decod':31B,128C 'use':25B,111C,180C,191C 'user':232C 'valu':142C 'version':104C 'without':42B,135C,179C 'workaround':242C","nicknames":[],"mitigations":[],"who_affected":"Applications that use the @fastify/http-proxy plugin with parameterized prefix and rewritePrefix options to pin clients to a fixed upstream path. Exposure depends on the proxied upstream: SSRF or authorization bypass depends on what that service trusts. Apps that proxy with a fixed prefix and no route parameters in the rewrite are not described as affected.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["critical","fastify","node","package","selfhosted"],"first_public_at":"2026-11-02T08:55:12+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","cvss_by":"ce714d77-add3-4f53-aff5-83d477b104bb","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-120213","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-120213","severity":null,"published_at":"2026-11-02T11:17:31+00:00","modified_at":"2026-11-02T11:17:31+00:00","first_seen_at":"2026-11-02T11:22:53+00:00","fetched_at":"2026-11-02T11:22:53+00:00","note":null}],"documents":[{"id":51565,"url":"https://github.com/fastify/fastify-http-proxy/security/advisories/GHSA-h3vp-4jfr-v364","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-02T08:55:12+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}