{"id":"CVE-2026-115918","aliases":["EUVD-2026-110039","GHSA-x567-49g5-p4cf","PYSEC-2026-4349"],"status":"published","title":"vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","severity":{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-12","score":0.0035,"percentile":0.29104,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-400","CWE-770"],"published":"2026-10-26T17:21:49Z","modified":"2026-11-10T02:45:49Z","fixes":[{"ecosystem":"PyPI","package":"vllm","fixed_in":["0.32.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"vllm","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.16.0"},{"fixed":"0.32.0"}]}]},{"source":"osv","ecosystem":"PyPI","package":"vllm","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.16.0"},{"fixed":"0.32.0"}]}],"versions":["0.16.0","0.17.0","0.17.1","0.18.0","0.18.1","0.19.0","0.19.1","0.20.0","0.20.1","0.20.2","0.21.0","0.22.0","0.22.1","0.23.0","0.24.0","0.25.0","0.25.1","0.26.0","0.27.0","0.27.1","0.28.0","0.29.0","0.30.0","0.31.0"]},{"source":"osv","ecosystem":"PyPI","package":"vllm","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0.16.0"},{"fixed":"0.32.0"}]}],"versions":["0.16.0","0.17.0","0.17.1","0.18.0","0.18.1","0.19.0","0.19.1","0.20.0","0.20.1","0.20.2","0.21.0","0.22.0","0.22.1","0.23.0","0.24.0","0.25.0","0.25.1","0.26.0","0.27.0","0.27.1","0.28.0","0.29.0","0.30.0","0.31.0"]}],"products":[{"vendor":"vllm","product":"vllm"},{"vendor":"vllm-project","product":"vllm"}],"references":[{"url":"https://github.com/vllm-project/vllm/security/advisories/GHSA-x567-49g5-p4cf","tags":["x_refsource_CONFIRM","Patch","Vendor Advisory","advisory","web","fix"]},{"url":"https://github.com/vllm-project/vllm/pull/50300","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://github.com/vllm-project/vllm/commit/cff08b461e086523cee8bba5bd3c66d302625134","tags":["x_refsource_MISC","Patch","fix","web"]},{"url":"https://github.com/vllm-project/vllm/releases/tag/v0.32.0","tags":["x_refsource_MISC","Release Notes","web","advisory"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-115918","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-x567-49g5-p4cf"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/115xxx/CVE-2026-115918.json","tags":["advisory"]},{"url":"https://github.com/vllm-project/vllm","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-115918","title":"vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","status":"published","published":"2026-10-26T17:21:49.719Z","modified":"2026-10-30T14:22:20.698Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"cna"}],"cwes":["CWE-400","CWE-770"],"updated_at":"2026-11-02T14:20:01.618694Z"}],"euvd":[{"id":"EUVD-2026-110039","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","status":"published","published":"2026-10-26T17:21:49Z","modified":"2026-10-30T14:22:20Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"updated_at":"2026-11-02T16:59:06.607412Z"}],"ghsa":[{"id":"GHSA-x567-49g5-p4cf","title":"vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs","description":"## Summary\n\nvLLM's `/v1/responses` endpoint accepts request-level `chat_template_kwargs`, but does not apply the `--trust-request-chat-template` gate that protects Chat Completions, render, tokenize, and pooling paths.\n\nWhen the server is run with the documented default `trust_request_chat_template=False` and no explicit `--chat-template`, a Responses request can pass:\n\n```json\n{\"chat_template_kwargs\": {\"chat_template\": \"\u003cattacker Jinja template\u003e\"}}\n```\n\nThat key is preserved by `ChatParams.get_apply_chat_template_kwargs()` and then bound as the `chat_template` parameter to the shared HF renderer. Prior vLLM advisories establish that request-controlled Jinja chat templates can cause CPU/memory exhaustion. This report covers the current-head Responses sibling path missed by the earlier fixes.\n\n## Technical Details\n\nThe shared OpenAI frontend has a validation helper that rejects request-supplied chat templates unless the trust flag is enabled. It explicitly checks both top-level `chat_template` and `chat_template_kwargs[\"chat_template\"]`.\n\nResponses is a separate serving path:\n\n- `vllm/entrypoints/openai/responses/protocol.py` exposes `chat_template_kwargs`.\n- `ResponsesRequest.build_chat_params()` merges request kwargs.\n- `OpenAIServingResponses._effective_chat_template_kwargs()` uses those kwargs.\n- `ChatParams.get_apply_chat_template_kwargs()` preserves a request `chat_template` key when the server chat template is `None`.\n- `vllm/renderers/hf.py` unpacks the result into `safe_apply_chat_template`.\n\nThere is no equivalent trust gate in `vllm/entrypoints/openai/responses/serving.py`.\n\n## Impact\n\nAn authenticated caller who can submit `/v1/responses` requests can supply a request-controlled Jinja chat template despite the trust flag being disabled. The expected fixed behavior is the same as Chat Completions: reject `chat_template_kwargs[\"chat_template\"]` unless the server was started with `--trust-request-chat-template`.\n\n## Suggested Fix\n\n- Add `trust_request_chat_template` to `OpenAIServingResponses`.\n- Pass `args.trust_request_chat_template` when constructing the Responses serving object.\n- Reject `request.chat_template_kwargs[\"chat_template\"]` before rendering when trust is false.\n- Keep ordinary kwargs such as `enable_thinking` working.\n- Add regression tests for default-deny and opt-in-allow behavior on `/v1/responses`.\n\n## Affected Package/Versions\n\nSource sweep found the affected shape in:\n\n- `v0.16.0`\n- `v0.18.0`\n- `v0.20.0`\n- `v0.21.0`\n- `v0.22.0`\n- `v0.22.1`\n- `v0.23.0`\n- current checkout `470229c37efaf69c86e8bc97482b0b1ff7551c65`\n- current `origin/main` `b3f0a0a0df76dda92ec4b2c9335f77e84adad911`\n\nSuggested affected range:\n\n```text\n\u003e= 0.16.0, \u003c= 0.23.0\n```\n\n## Appendix: Duplicate Research\n\nThis is related to, but distinct from:\n\n- `GHSA-6fvq-23cw-5628` / `CVE-2025-61620`\n- `GHSA-69j4-grxj-j64p` / `CVE-2025-62426`\n\nThose advisories establish the security impact of request-controlled Jinja templates and `chat_template_kwargs`, but they cover older Chat Completions/tokenize implementations. This report covers a current `/v1/responses` sibling path that still lacks the trust gate.\n\nLocal prior submissions this report..029 do not cover this root cause.\n\nThis advisory was fixed in [MR50300](https://github.com/vllm-project/vllm/pull/50300).","status":"published","published":"2026-10-28T21:14:59Z","modified":"2026-10-28T21:15:00Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"cwes":["CWE-400","CWE-770"],"updated_at":"2026-11-02T14:41:39.926569Z"}],"nvd":[{"id":"CVE-2026-115918","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","status":"published","published":"2026-10-26T18:17:39.44Z","modified":"2026-10-30T15:16:46.123Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium","assessor":"secondary"}],"cwes":["CWE-400","CWE-770"],"updated_at":"2026-11-02T14:13:03.452847Z"}],"osv":[{"id":"CVE-2026-115918","title":"vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","status":"published","published":"2026-10-26T17:21:49.719Z","modified":"2026-11-10T02:45:49.444649991Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"cwes":["CWE-400","CWE-770"],"updated_at":"2026-11-10T03:16:41.950556Z"},{"id":"GHSA-x567-49g5-p4cf","title":"vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs","description":"## Summary\n\nvLLM's `/v1/responses` endpoint accepts request-level `chat_template_kwargs`, but does not apply the `--trust-request-chat-template` gate that protects Chat Completions, render, tokenize, and pooling paths.\n\nWhen the server is run with the documented default `trust_request_chat_template=False` and no explicit `--chat-template`, a Responses request can pass:\n\n```json\n{\"chat_template_kwargs\": {\"chat_template\": \"\u003cattacker Jinja template\u003e\"}}\n```\n\nThat key is preserved by `ChatParams.get_apply_chat_template_kwargs()` and then bound as the `chat_template` parameter to the shared HF renderer. Prior vLLM advisories establish that request-controlled Jinja chat templates can cause CPU/memory exhaustion. This report covers the current-head Responses sibling path missed by the earlier fixes.\n\n## Technical Details\n\nThe shared OpenAI frontend has a validation helper that rejects request-supplied chat templates unless the trust flag is enabled. It explicitly checks both top-level `chat_template` and `chat_template_kwargs[\"chat_template\"]`.\n\nResponses is a separate serving path:\n\n- `vllm/entrypoints/openai/responses/protocol.py` exposes `chat_template_kwargs`.\n- `ResponsesRequest.build_chat_params()` merges request kwargs.\n- `OpenAIServingResponses._effective_chat_template_kwargs()` uses those kwargs.\n- `ChatParams.get_apply_chat_template_kwargs()` preserves a request `chat_template` key when the server chat template is `None`.\n- `vllm/renderers/hf.py` unpacks the result into `safe_apply_chat_template`.\n\nThere is no equivalent trust gate in `vllm/entrypoints/openai/responses/serving.py`.\n\n## Impact\n\nAn authenticated caller who can submit `/v1/responses` requests can supply a request-controlled Jinja chat template despite the trust flag being disabled. The expected fixed behavior is the same as Chat Completions: reject `chat_template_kwargs[\"chat_template\"]` unless the server was started with `--trust-request-chat-template`.\n\n## Suggested Fix\n\n- Add `trust_request_chat_template` to `OpenAIServingResponses`.\n- Pass `args.trust_request_chat_template` when constructing the Responses serving object.\n- Reject `request.chat_template_kwargs[\"chat_template\"]` before rendering when trust is false.\n- Keep ordinary kwargs such as `enable_thinking` working.\n- Add regression tests for default-deny and opt-in-allow behavior on `/v1/responses`.\n\n## Affected Package/Versions\n\nSource sweep found the affected shape in:\n\n- `v0.16.0`\n- `v0.18.0`\n- `v0.20.0`\n- `v0.21.0`\n- `v0.22.0`\n- `v0.22.1`\n- `v0.23.0`\n- current checkout `470229c37efaf69c86e8bc97482b0b1ff7551c65`\n- current `origin/main` `b3f0a0a0df76dda92ec4b2c9335f77e84adad911`\n\nSuggested affected range:\n\n```text\n\u003e= 0.16.0, \u003c= 0.23.0\n```\n\n## Appendix: Duplicate Research\n\nThis is related to, but distinct from:\n\n- `GHSA-6fvq-23cw-5628` / `CVE-2025-61620`\n- `GHSA-69j4-grxj-j64p` / `CVE-2025-62426`\n\nThose advisories establish the security impact of request-controlled Jinja templates and `chat_template_kwargs`, but they cover older Chat Completions/tokenize implementations. This report covers a current `/v1/responses` sibling path that still lacks the trust gate.\n\nLocal prior submissions this report..029 do not cover this root cause.\n\nThis advisory was fixed in [MR50300](https://github.com/vllm-project/vllm/pull/50300).","status":"published","published":"2026-10-28T21:14:59Z","modified":"2026-10-29T11:10:53.778002992Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"cwes":["CWE-400","CWE-770"],"updated_at":"2026-11-02T15:46:59.484835Z"},{"id":"PYSEC-2026-4349","description":"vLLM is an inference and serving engine for large language models. From 0.16.0 until 0.32.0, the /v1/responses endpoint allows an authenticated caller to place an attacker-controlled template in chat_template_kwargs[chat_template] when no server template is configured. ChatParams.get_apply_chat_template_kwargs() preserves that value without enforcing trust_request_chat_template, so the request can bypass the intended trust policy and cause CPU or memory exhaustion through Jinja rendering. This issue is fixed in version 0.32.0.","status":"published","published":"2026-10-26T18:17:39.44Z","modified":"2026-10-29T11:00:02.781048532Z","cvss":[{"version":"3.1","score":6.5,"vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H","level":"medium"}],"updated_at":"2026-11-02T15:52:57.671918Z"}]}}
