{"id":"CVE-2026-25480","aliases":["EUVD-2026-6498","GHSA-vxqx-rh46-q2pg","PYSEC-2026-2197"],"status":"published","title":"FileStore key canonicalization collisions allow response cache mixup/poisoning (ASCII ord + Unicode NFKD)","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","severity":{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.0046,"percentile":0.40233,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-176","CWE-20"],"published":"2026-02-09T17:19:06Z","modified":"2026-10-28T02:30:52Z","fixes":[{"ecosystem":"PyPI","package":"litestar","fixed_in":["2.20.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"litestar","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.19.0"},{"last_affected":"2.19.0"},{"fixed":"2.20.0"}]}],"versions":["2.19.0"]},{"source":"osv","ecosystem":"PyPI","package":"litestar","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.19.0"},{"fixed":"2.20.0"}]}],"versions":["2.19.0"]},{"source":"osv","ecosystem":"PyPI","package":"litestar","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"2.20.0"}]}],"versions":["1.0.0a0","2.0.0","2.0.0a3","2.0.0a4","2.0.0a5","2.0.0a6","2.0.0a7","2.0.0b1","2.0.0b2","2.0.0b3","2.0.0b4","2.0.0rc1","2.0.1","2.1.0","2.1.1","2.10.0","2.11.0","2.12.0","2.12.1","2.13.0","2.14.0","2.15.0","2.15.1","2.15.2","2.16.0","2.17.0","2.18.0","2.19.0","2.2.0","2.2.1","2.3.0","2.3.1","2.3.2","2.4.0","2.4.1","2.4.2","2.4.3","2.4.4","2.4.5","2.5.0","2.5.1","2.5.2","2.5.3","2.5.4","2.5.5","2.6.0","2.6.1","2.6.2","2.6.3","2.6.4","2.7.0","2.7.1","2.7.2","2.8.0","2.8.1","2.8.2","2.8.3","2.9.0","2.9.1"]}],"products":[{"vendor":"litestar","product":"litestar"},{"vendor":"litestar-org","product":"litestar"}],"references":[{"url":"https://github.com/litestar-org/litestar/security/advisories/GHSA-vxqx-rh46-q2pg","tags":["x_refsource_CONFIRM","Exploit","Vendor Advisory","advisory","web","evidence"]},{"url":"https://github.com/litestar-org/litestar/commit/85db6183a76f8a6b3fd6ee3c88d860b9f37a2cca","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://docs.litestar.dev/2/release-notes/changelog.html#2.20.0","tags":["x_refsource_MISC","Release Notes","web","advisory"]},{"url":"https://github.com/litestar-org/litestar/releases/tag/v2.20.0","tags":["x_refsource_MISC","Release Notes","web","advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-25480","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-vxqx-rh46-q2pg"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/25xxx/CVE-2026-25480.json","tags":["advisory"]},{"url":"https://github.com/litestar-org/litestar","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-25480","title":"FileStore key canonicalization collisions allow response cache mixup/poisoning (ASCII ord + Unicode NFKD)","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","status":"published","published":"2026-02-09T18:49:34.305Z","modified":"2026-02-10T16:01:06.327Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"cna"}],"cwes":["CWE-176"],"updated_at":"2026-11-02T13:41:19.694734Z"}],"euvd":[{"id":"EUVD-2026-6498","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","status":"published","published":"2026-02-09T18:49:34Z","modified":"2026-02-10T16:01:06Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T19:48:42.087959Z"}],"ghsa":[{"id":"GHSA-vxqx-rh46-q2pg","title":"Litestar's FileStore key canonicalization collisions allow response cache mixup/poisoning (ASCII ord + Unicode NFKD)","description":"### Summary\nFileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup)\n\n### Details\nlitestar.stores.file._safe_file_name() normalizes input with unicodedata.normalize(\"NFKD\", name) and builds the filename by concatenating c if alphanumeric else str(ord(c)) (no delimiter).\nThis transformation is not injective, e.g.:\n\n- \"k-\" and \"k45\" both become \"k45\" (because - ord('-') == 45)\n- \"k/\\n\" becomes \"k4710\", colliding with \"k4710\"\n- \"K\" (Kelvin sign) normalizes to \"K\", colliding with \"K\"\n\nWhen used in response caching, the default cache key includes request path and sorted query params, which are attacker-controlled.\n\n### PoC\n\n```\nimport asyncio, tempfile\nfrom litestar.stores.file import FileStore\n\nasync def main():\n    d = tempfile.mkdtemp(prefix=\"ls_filestore_poc_\")\n    store = FileStore(d, create_directories=True)\n    await store.__aenter__()\n\n    # 1) ASCII ord-collision: \"-\" -\u003e 45\n    await store.set(\"k-\", b\"A\")\n    v = await store.get(\"k45\")\n    print(\"k-  -\u003e\", v)\n    print(\"k45 -\u003e\", await store.get(\"k45\"))\n    if v == b\"A\":\n        print(\"VULNERABLE: 'k-' collides with 'k45'\")\n\n    # 2) NFKD collision: Kelvin sign -\u003e K\n    await store.set(\"K\", b\"B\")   # U+212A\n    v2 = await store.get(\"K\")\n    print(\"K -\u003e\", await store.get(\"K\"))\n    print(\"K -\u003e\", v2)\n    if v2 == b\"B\":\n        print(\"VULNERABLE: 'K' collides with 'K' (NFKD)\")\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n### Impact\nVulnerability type: cache poisoning / cache key collision.\nImpacted deployments: applications using Litestar response caching with FileStore backend (or any attacker-influenced keying into FileStore).\nPossible impact: serving incorrect cached content across distinct URLs, potential confidentiality/integrity issues depending on what endpoints are cached.","status":"published","published":"2026-02-09T17:19:06Z","modified":"2026-02-09T22:38:16Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-20","CWE-176"],"updated_at":"2026-11-02T14:39:23.728882Z"}],"nvd":[{"id":"CVE-2026-25480","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","status":"published","published":"2026-02-09T20:15:57.33Z","modified":"2026-06-17T10:24:42.447Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium","assessor":"secondary"}],"cwes":["CWE-176"],"updated_at":"2026-11-02T14:12:05.52517Z"}],"osv":[{"id":"CVE-2026-25480","title":"FileStore key canonicalization collisions allow response cache mixup/poisoning (ASCII ord + Unicode NFKD)","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","status":"published","published":"2026-02-09T18:49:34.305Z","modified":"2026-10-28T02:30:52.48088958Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-176"],"updated_at":"2026-11-02T15:44:59.438965Z"},{"id":"GHSA-vxqx-rh46-q2pg","title":"Litestar's FileStore key canonicalization collisions allow response cache mixup/poisoning (ASCII ord + Unicode NFKD)","description":"### Summary\nFileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup)\n\n### Details\nlitestar.stores.file._safe_file_name() normalizes input with unicodedata.normalize(\"NFKD\", name) and builds the filename by concatenating c if alphanumeric else str(ord(c)) (no delimiter).\nThis transformation is not injective, e.g.:\n\n- \"k-\" and \"k45\" both become \"k45\" (because - ord('-') == 45)\n- \"k/\\n\" becomes \"k4710\", colliding with \"k4710\"\n- \"K\" (Kelvin sign) normalizes to \"K\", colliding with \"K\"\n\nWhen used in response caching, the default cache key includes request path and sorted query params, which are attacker-controlled.\n\n### PoC\n\n```\nimport asyncio, tempfile\nfrom litestar.stores.file import FileStore\n\nasync def main():\n    d = tempfile.mkdtemp(prefix=\"ls_filestore_poc_\")\n    store = FileStore(d, create_directories=True)\n    await store.__aenter__()\n\n    # 1) ASCII ord-collision: \"-\" -\u003e 45\n    await store.set(\"k-\", b\"A\")\n    v = await store.get(\"k45\")\n    print(\"k-  -\u003e\", v)\n    print(\"k45 -\u003e\", await store.get(\"k45\"))\n    if v == b\"A\":\n        print(\"VULNERABLE: 'k-' collides with 'k45'\")\n\n    # 2) NFKD collision: Kelvin sign -\u003e K\n    await store.set(\"K\", b\"B\")   # U+212A\n    v2 = await store.get(\"K\")\n    print(\"K -\u003e\", await store.get(\"K\"))\n    print(\"K -\u003e\", v2)\n    if v2 == b\"B\":\n        print(\"VULNERABLE: 'K' collides with 'K' (NFKD)\")\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n### Impact\nVulnerability type: cache poisoning / cache key collision.\nImpacted deployments: applications using Litestar response caching with FileStore backend (or any attacker-influenced keying into FileStore).\nPossible impact: serving incorrect cached content across distinct URLs, potential confidentiality/integrity issues depending on what endpoints are cached.","status":"published","published":"2026-02-09T17:19:06Z","modified":"2026-07-13T07:26:32.411208744Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"cwes":["CWE-176","CWE-20"],"updated_at":"2026-11-02T15:46:58.04805Z"},{"id":"PYSEC-2026-2197","description":"Litestar is an Asynchronous Server Gateway Interface (ASGI) framework. Prior to 2.20.0, FileStore maps cache keys to filenames using Unicode NFKD normalization and ord() substitution without separators, creating key collisions. When FileStore is used as response-cache backend, an unauthenticated remote attacker can trigger cache key collisions via crafted paths, causing one URL to serve cached responses of another (cache poisoning/mixup). This vulnerability is fixed in 2.20.0.","status":"published","published":"2026-02-09T20:15:57.33Z","modified":"2026-07-13T07:15:34.276090244Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N","level":"medium"}],"updated_at":"2026-11-02T15:52:55.537808Z"}]}}
