Files
vuln-osv/data/PyPI/GHSA-2p2x-hpg8-cqp2.json
T

1 line
3.4 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"schema_version":"1.9.0","id":"GHSA-2p2x-hpg8-cqp2","published":"2026-02-09T17:18:52Z","modified":"2026-07-13T07:26:21.863580114Z","aliases":["CVE-2026-25478","PYSEC-2026-2195"],"summary":"Litestar's CORS origin allowlist has a bypass due to unescaped regex metacharacters in allowed origins","details":"### Summary\nCORS origin validation can be bypassed because the allowed-origins allowlist is compiled into a regex without escaping metacharacters (notably .). An allowed origin like https://good.example can match https://goodXexample, resulting in Access-Control-Allow-Origin being set for an untrusted origin\n\n### Details\nCORSConfig.allowed_origins_regex is constructed using a regex built from configured allowlist values and used with fullmatch() for validation. Because metacharacters are not escaped, a malicious origin can match unexpectedly. The check relies on allowed_origins_regex.fullmatch(origin).\n\n### PoC\nServer (poc_cors_server.py)\n\n```\nfrom litestar import Litestar, get\nfrom litestar.config.cors import CORSConfig\n\n@get(\"/c\")\nasync def c() -> str:\n return \"ok\"\n\ncors = CORSConfig(\n allow_origins=[\"https://good.example\"],\n allow_credentials=True,\n)\napp = Litestar([c], cors_config=cors)\n```\n\n`uvicorn poc_cors_server:app --host 127.0.0.1 --port 8002`\n\nClient (poc_cors_client.py)\n\n```\nimport http.client\n\ndef req(origin: str) -> tuple[int, str | None]:\n c = http.client.HTTPConnection(\"127.0.0.1\", 8002, timeout=3)\n c.request(\"GET\", \"/c\", headers={\"Origin\": origin, \"Host\": \"example.com\"})\n r = c.getresponse()\n r.read()\n acao = r.getheader(\"Access-Control-Allow-Origin\")\n c.close()\n return r.status, acao\n\nprint(\"evil:\", req(\"https://evil.example\"))\nprint(\"bypass:\", req(\"https://goodXexample\")) \n```\n\nExpected (vulnerable behavior):\n\nOrigin: https://evil.example → no ACAO\nOrigin: https://goodXexample → ACAO: https://goodxexample/ (bypass)\n\n### Impact\nType: CORS policy bypass (cross-origin data exposure risk)\nWho is impacted: apps using CORS allowlists to restrict browser cross-origin reads. If allow_credentials=True and authenticated endpoints return sensitive data, an attacker-controlled site can potentially read responses in a victim’s browser session.","affected":[{"package":{"name":"litestar","ecosystem":"PyPI","purl":"pkg:pypi/litestar"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"2.19.0"},{"fixed":"2.20.0"}]}],"versions":["2.19.0"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/02/GHSA-2p2x-hpg8-cqp2/GHSA-2p2x-hpg8-cqp2.json"}}],"references":[{"type":"WEB","url":"https://github.com/litestar-org/litestar/security/advisories/GHSA-2p2x-hpg8-cqp2"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-25478"},{"type":"WEB","url":"https://github.com/litestar-org/litestar/commit/eb87703b309efcc0d1b087dcb12784e76b003d5a"},{"type":"WEB","url":"https://docs.litestar.dev/2/release-notes/changelog.html#2.20.0"},{"type":"PACKAGE","url":"https://github.com/litestar-org/litestar"},{"type":"WEB","url":"https://github.com/litestar-org/litestar/releases/tag/v2.20.0"}],"database_specific":{"cwe_ids":["CWE-942"],"github_reviewed":true,"github_reviewed_at":"2026-02-09T17:18:52Z","nvd_published_at":"2026-02-09T20:15:57Z","severity":"HIGH"},"severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N"}]}