{"schemaVersion":3,"id":"CVE-2026-15074","aliases":["GHSA-83w8-p2f5-377r"],"status":"published","duplicateOf":null,"title":null,"description":"@fastify/static up to and including version 10.1.0 fails to reject dot-dot path segments in request pathnames before the file-resolution stage. This is a bypass of the earlier fix for CVE-2026-6414, which only covered encoded forward slashes. Because the underlying send library normalizes dot segments before applying its own path-traversal guard, an unauthenticated attacker can bypass any route-scoped middleware and read files inside the static root that live under the guarded URL prefix. The bypass does not allow access outside the configured static root by itself, it defeats route-guard filtering only. The issue is patched in @fastify/static 10.1.1.","dates":{"published":"2026-07-23T03:01:47.887Z","modified":"2026-07-23T14:14:46.933Z","reserved":null,"kevAdded":[],"kevDue":[]},"cvss":{"headline":{"score":7.5,"severity":"high","version":"3.1","versionLabel":"v3.1","source":"CVE.org","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N","computed":false,"selection":"backend-summary"},"metrics":[{"version":"3.1","versionLabel":"v3.1","source":"CVE.org","score":7.5,"severity":"high","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N","exploitability":null,"impact":null,"computed":false},{"version":"3.1","versionLabel":"v3.1","source":"OSV · Npm","score":7.5,"severity":"high","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N","exploitability":10,"impact":6,"computed":true},{"version":"3.1","versionLabel":"v3.1","source":"NVD","score":7.5,"severity":"high","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N","exploitability":null,"impact":null,"computed":false}]},"epss":{"probability":0.00672,"percentile":0.51191,"severity":"low","asOf":"2026-10-20T00:00:00.000Z","change":{"pp":0,"baselineDate":"2026-09-20T00:00:00.000Z","baselineScore":0.00672},"history":[{"date":"2026-09-14T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-15T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-16T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-17T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-18T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-19T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-20T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-21T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.00672,"percentile":0.51191}],"last30":[{"date":"2026-09-20T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-21T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-22T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-23T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-24T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-25T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-26T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-27T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-28T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-29T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-09-30T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-01T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-02T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-03T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-04T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-05T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-06T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-07T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-08T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-09T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-10T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-11T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-12T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-13T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-14T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-15T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-16T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-17T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-18T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-19T00:00:00.000Z","score":0.00672,"percentile":null},{"date":"2026-10-20T00:00:00.000Z","score":0.00672,"percentile":0.51191}]},"kev":{"state":"not-listed","entries":[],"listedCount":0,"totalCatalogs":3,"catalogs":[{"source":"cisa","label":"CISA","listed":false,"entry":null},{"source":"enisa","label":"ENISA","listed":false,"entry":null},{"source":"circl","label":"CIRCL","listed":false,"entry":null}]},"ransomware":{"state":"none-recorded","sources":[]},"exploits":[],"exploitCount":0,"weaknesses":[{"id":"CWE-22","name":"Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')","description":"The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.","type":"weakness","status":"Stable","abstraction":"Base","likelihoodOfExploit":"High","url":"https://cwe.mitre.org/data/definitions/22.html"}],"affected":[{"vendor":"fastify","product":"fastify-static","name":"fastify-static","label":"fastify-static","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 10.1.1","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 10.1.1","eol":null,"hubHref":"/vendor/fastify/fastify-static"},{"vendor":"@fastify/static","product":"@fastify/static","name":"@fastify/static","label":"@fastify/static","ecosystem":null,"cpePart":"a","purl":null,"purlType":null,"versions":[{"text":"< 10.1.1","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 10.1.1","eol":null,"hubHref":"/vendor/fastifystatic/fastifystatic"},{"vendor":"@fastify","product":"static","name":"@fastify/static","label":"static","ecosystem":"Npm","cpePart":null,"purl":"pkg:npm/@fastify/static","purlType":"npm","versions":[{"text":"< 10.1.1","noFixRecorded":false,"fixedIn":null}],"versionsText":"< 10.1.1","eol":null,"hubHref":null}],"affectedCount":3,"eol":{"hasEol":false,"count":0},"references":[{"url":"https://github.com/fastify/fastify-static/security/advisories/GHSA-83w8-p2f5-377r","label":"github.com/fastify/fastify-static/security/advisories/GHSA-83w8-p2f5-377r","hostname":"github.com","tags":["WEB","Vendor Advisory"]},{"url":"https://cna.openjsf.org/security-advisories.html","label":"cna.openjsf.org/security-advisories.html","hostname":"cna.openjsf.org","tags":["WEB","Vendor Advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-15074","label":"nvd.nist.gov/vuln/detail/CVE-2026-15074","hostname":"nvd.nist.gov","tags":["Advisory"]},{"url":"https://github.com/fastify/fastify-static/commit/db4276f846ba56b21f93768cd6636ee5e2fc58b1","label":"github.com/fastify/fastify-static/commit/db4276f846ba56b21f93768cd6636ee5e2fc58b1","hostname":"github.com","tags":["WEB"]},{"url":"https://github.com/fastify/fastify-static","label":"github.com/fastify/fastify-static","hostname":"github.com","tags":["PACKAGE"]},{"url":"https://github.com/fastify/fastify-static/releases/tag/v10.1.1","label":"github.com/fastify/fastify-static/releases/tag/v10.1.1","hostname":"github.com","tags":["WEB"]}],"lineage":{"upstream":[],"downstream":[],"duplicates":[],"related":[]},"timeline":[{"kind":"published","date":"2026-07-23T03:01:47.887Z","label":"Published","detail":"Vulnerability first disclosed.","source":null},{"kind":"modified","date":"2026-07-23T14:14:46.933Z","label":"Last modified","detail":"Vulnerability information updated.","source":null}],"risk":{"score":30,"level":"medium","profile":"Default","thresholds":{"critical":75,"high":50,"medium":25,"low":10}},"meta":{"dataAsOf":"2026-10-20T16:57:18.695Z","stale":false,"partial":false}}