GHSA-X567-49G5-P4CF
Vulnerability from github – Published: 2026-10-28 21:14 – Updated: 2026-10-28 21:14Summary
vLLM'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.
When the server is run with the documented default trust_request_chat_template=False and no explicit --chat-template, a Responses request can pass:
{"chat_template_kwargs": {"chat_template": "<attacker Jinja template>"}}
That 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.
Technical Details
The 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"].
Responses is a separate serving path:
vllm/entrypoints/openai/responses/protocol.pyexposeschat_template_kwargs.ResponsesRequest.build_chat_params()merges request kwargs.OpenAIServingResponses._effective_chat_template_kwargs()uses those kwargs.ChatParams.get_apply_chat_template_kwargs()preserves a requestchat_templatekey when the server chat template isNone.vllm/renderers/hf.pyunpacks the result intosafe_apply_chat_template.
There is no equivalent trust gate in vllm/entrypoints/openai/responses/serving.py.
Impact
An 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.
Suggested Fix
- Add
trust_request_chat_templatetoOpenAIServingResponses. - Pass
args.trust_request_chat_templatewhen constructing the Responses serving object. - Reject
request.chat_template_kwargs["chat_template"]before rendering when trust is false. - Keep ordinary kwargs such as
enable_thinkingworking. - Add regression tests for default-deny and opt-in-allow behavior on
/v1/responses.
Affected Package/Versions
Source sweep found the affected shape in:
v0.16.0v0.18.0v0.20.0v0.21.0v0.22.0v0.22.1v0.23.0- current checkout
470229c37efaf69c86e8bc97482b0b1ff7551c65 - current
origin/mainb3f0a0a0df76dda92ec4b2c9335f77e84adad911
Suggested affected range:
>= 0.16.0, <= 0.23.0
Appendix: Duplicate Research
This is related to, but distinct from:
GHSA-6fvq-23cw-5628/CVE-2025-61620GHSA-69j4-grxj-j64p/CVE-2025-62426
Those 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.
Local prior submissions this report..029 do not cover this root cause.
This advisory was fixed in MR50300.
{
"affected": [
{
"package": {
"ecosystem": "PyPI",
"name": "vllm"
},
"ranges": [
{
"events": [
{
"introduced": "0.16.0"
},
{
"fixed": "0.32.0"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-115918"
],
"database_specific": {
"cwe_ids": [
"CWE-400",
"CWE-770"
],
"github_reviewed": true,
"github_reviewed_at": "2026-10-28T21:14:59Z",
"nvd_published_at": "2026-10-26T18:17:39Z",
"severity": "MODERATE"
},
"details": "## Summary\n\nvLLM\u0027s `/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).",
"id": "GHSA-x567-49g5-p4cf",
"modified": "2026-10-28T21:14:59Z",
"published": "2026-10-28T21:14:59Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/vllm-project/vllm/security/advisories/GHSA-x567-49g5-p4cf"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-115918"
},
{
"type": "WEB",
"url": "https://github.com/vllm-project/vllm/pull/50300"
},
{
"type": "WEB",
"url": "https://github.com/vllm-project/vllm/commit/cff08b461e086523cee8bba5bd3c66d302625134"
},
{
"type": "PACKAGE",
"url": "https://github.com/vllm-project/vllm"
},
{
"type": "WEB",
"url": "https://github.com/vllm-project/vllm/releases/tag/v0.32.0"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H",
"type": "CVSS_V3"
}
],
"summary": "vLLM: Responses API bypasses trust_request_chat_template for chat_template_kwargs"
}
Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
Loading timeline…
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.