CVE-2026-105760
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
vLLM is an inference and serving engine for large language models. Prior to 0.30.0, a caller can use the request-level media_io_kwargs field to select the GLMGA video backend and supply large values for the fps and max_frames options without a strict work ceiling. GLMGA constructs and deduplicates an attacker-sized pre-decode frame-index list, allowing a compact request and tiny valid video to consume disproportionate CPU time and memory in the shared media-loading executor. This issue is fixed in version 0.30.0.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- None
- Integrity
- None
- Availability
- Low
Exploit likelihood
What each source reports
CVE List Score used
5.3
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
vLLM is an inference and serving engine for large language models. Prior to 0.30.0, a caller can use the request-level media_io_kwargs field to select the GLMGA video backend and supply large values for the fps and max_frames options without a strict work ceiling. GLMGA constructs and deduplicates an attacker-sized pre-decode frame-index list, allowing a compact request and tiny valid video to consume disproportionate CPU time and memory in the shared media-loading executor. This issue is fixed in version 0.30.0.
- Record
CVE-2026-105760- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
EUVDEUVD-2026-92851
5.3
vLLM is an inference and serving engine for large language models. Prior to 0.30.0, a caller can use the request-level media_io_kwargs field to select the GLMGA video backend and supply large values for the fps and max_frames options without a strict work ceiling. GLMGA constructs and deduplicates an attacker-sized pre-decode frame-index list, allowing a compact request and tiny valid video to consume disproportionate CPU time and memory in the shared media-loading executor. This issue is fixed in version 0.30.0.
- Record
EUVD-2026-92851- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-58v5-2m8f-94pr
5.3
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
Summary
The OpenAI-compatible chat endpoint accepts request-level video loader options through media_io_kwargs. A caller can select the GLMGA sampler and provide large fps and max_frames values. GLMGA first constructs an attacker-sized Python index list and then deduplicates it, even when the supplied video contains only a few frames. This work occurs in the shared media-loading executor before frame reads, allowing a tiny valid video and compact JSON options to consume disproportionate CPU time and memory and delay unrelated media requests.
The demonstrated impact is partial denial of service. No memory corruption, data disclosure, or code execution is claimed.
Affected configuration
The server must expose chat completions for a video-capable model and accept request-level media_io_kwargs. The model does not need to use GLMGA by default because the request value overrides the model's loader mapping. The proof of concept uses an inline two-frame video and explicitly selects the OpenCV decoder, so no external media host or GPU decoder is required.
The request is reachable without vLLM credentials when no API key is configured. With API-key authentication enabled, any caller holding a valid key can reach the same path.
Attack surface
A remote caller submits a valid chat-completion request with a small video and the following request-level options:
{
"media_io_kwargs": {
"video": {
"video_backend": "glmga",
"backend": "opencv",
"fps": 500000,
"max_frames": 500000
}
}
}
Increasing both numeric values increases temporary list construction and deduplication work even when the final decoded frame set remains unchanged.
Root cause
ChatCompletionRequestexposesmedia_io_kwargsas request-controlled nested values:protocol.py#L365-L371.- The request options are carried into chat parameters without a numeric work bound on GLMGA's
fpsormax_frames:protocol.py#L571-L599. - Media options are merged so request values override configured defaults, including
video_backend:connector.py#L577-L605. - The connector selects a registered video loader and runs media loading through the shared executor:
video.py#L28-L66andconnector.py#L44-L47. - GLMGA calculates
extract_t = min(int(duration * fps), max_frames), builds a list with that many entries, and deduplicates it before decoding frames:video.py#L667-L740. - The OpenCV decoder receives the already-deduplicated indices, so a two-frame file can trigger a large intermediate allocation while producing only two decoded frames:
opencv.py#L28-L50.
The missing invariant is a strict upper bound on sampling work before the index list is constructed. Bounding decoded output after deduplication does not bound the vulnerable intermediate computation.
Suggested remediation
Validate request-level video sampling options before dispatching work to the media executor. Enforce conservative absolute limits for fps, max_frames, and especially the computed candidate…
- Record
GHSA-58v5-2m8f-94pr- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
NVD
5.3
vLLM is an inference and serving engine for large language models. Prior to 0.30.0, a caller can use the request-level media_io_kwargs field to select the GLMGA video backend and supply large values for the fps and max_frames options without a strict work ceiling. GLMGA constructs and deduplicates an attacker-sized pre-decode frame-index list, allowing a compact request and tiny valid video to consume disproportionate CPU time and memory in the shared media-loading executor. This issue is fixed in version 0.30.0.
- Record
CVE-2026-105760- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
OSV
5.3
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
vLLM is an inference and serving engine for large language models. Prior to 0.30.0, a caller can use the request-level media_io_kwargs field to select the GLMGA video backend and supply large values for the fps and max_frames options without a strict work ceiling. GLMGA constructs and deduplicates an attacker-sized pre-decode frame-index list, allowing a compact request and tiny valid video to consume disproportionate CPU time and memory in the shared media-loading executor. This issue is fixed in version 0.30.0.
- Record
CVE-2026-105760- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-04
OSVGHSA-58v5-2m8f-94pr
5.3
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
Summary
The OpenAI-compatible chat endpoint accepts request-level video loader options through media_io_kwargs. A caller can select the GLMGA sampler and provide large fps and max_frames values. GLMGA first constructs an attacker-sized Python index list and then deduplicates it, even when the supplied video contains only a few frames. This work occurs in the shared media-loading executor before frame reads, allowing a tiny valid video and compact JSON options to consume disproportionate CPU time and memory and delay unrelated media requests.
The demonstrated impact is partial denial of service. No memory corruption, data disclosure, or code execution is claimed.
Affected configuration
The server must expose chat completions for a video-capable model and accept request-level media_io_kwargs. The model does not need to use GLMGA by default because the request value overrides the model's loader mapping. The proof of concept uses an inline two-frame video and explicitly selects the OpenCV decoder, so no external media host or GPU decoder is required.
The request is reachable without vLLM credentials when no API key is configured. With API-key authentication enabled, any caller holding a valid key can reach the same path.
Attack surface
A remote caller submits a valid chat-completion request with a small video and the following request-level options:
{
"media_io_kwargs": {
"video": {
"video_backend": "glmga",
"backend": "opencv",
"fps": 500000,
"max_frames": 500000
}
}
}
Increasing both numeric values increases temporary list construction and deduplication work even when the final decoded frame set remains unchanged.
Root cause
ChatCompletionRequestexposesmedia_io_kwargsas request-controlled nested values:protocol.py#L365-L371.- The request options are carried into chat parameters without a numeric work bound on GLMGA's
fpsormax_frames:protocol.py#L571-L599. - Media options are merged so request values override configured defaults, including
video_backend:connector.py#L577-L605. - The connector selects a registered video loader and runs media loading through the shared executor:
video.py#L28-L66andconnector.py#L44-L47. - GLMGA calculates
extract_t = min(int(duration * fps), max_frames), builds a list with that many entries, and deduplicates it before decoding frames:video.py#L667-L740. - The OpenCV decoder receives the already-deduplicated indices, so a two-frame file can trigger a large intermediate allocation while producing only two decoded frames:
opencv.py#L28-L50.
The missing invariant is a strict upper bound on sampling work before the index list is constructed. Bounding decoded output after deduplication does not bound the vulnerable intermediate computation.
Suggested remediation
Validate request-level video sampling options before dispatching work to the media executor. Enforce conservative absolute limits for fps, max_frames, and especially the computed candidate…
- Record
GHSA-58v5-2m8f-94pr- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Weakness
- CWE-400
- Updated
- 2026-11-02
OSVPYSEC-2026-4307
5.3
vLLM: GLMGA video sampling permits request-driven CPU and memory exhaustion
Summary
The OpenAI-compatible chat endpoint accepts request-level video loader options through media_io_kwargs. A caller can select the GLMGA sampler and provide large fps and max_frames values. GLMGA first constructs an attacker-sized Python index list and then deduplicates it, even when the supplied video contains only a few frames. This work occurs in the shared media-loading executor before frame reads, allowing a tiny valid video and compact JSON options to consume disproportionate CPU time and memory and delay unrelated media requests.
The demonstrated impact is partial denial of service. No memory corruption, data disclosure, or code execution is claimed.
Affected configuration
The server must expose chat completions for a video-capable model and accept request-level media_io_kwargs. The model does not need to use GLMGA by default because the request value overrides the model's loader mapping. The proof of concept uses an inline two-frame video and explicitly selects the OpenCV decoder, so no external media host or GPU decoder is required.
The request is reachable without vLLM credentials when no API key is configured. With API-key authentication enabled, any caller holding a valid key can reach the same path.
Attack surface
A remote caller submits a valid chat-completion request with a small video and the following request-level options:
{
"media_io_kwargs": {
"video": {
"video_backend": "glmga",
"backend": "opencv",
"fps": 500000,
"max_frames": 500000
}
}
}
Increasing both numeric values increases temporary list construction and deduplication work even when the final decoded frame set remains unchanged.
Root cause
ChatCompletionRequestexposesmedia_io_kwargsas request-controlled nested values:protocol.py#L365-L371.- The request options are carried into chat parameters without a numeric work bound on GLMGA's
fpsormax_frames:protocol.py#L571-L599. - Media options are merged so request values override configured defaults, including
video_backend:connector.py#L577-L605. - The connector selects a registered video loader and runs media loading through the shared executor:
video.py#L28-L66andconnector.py#L44-L47. - GLMGA calculates
extract_t = min(int(duration * fps), max_frames), builds a list with that many entries, and deduplicates it before decoding frames:video.py#L667-L740. - The OpenCV decoder receives the already-deduplicated indices, so a two-frame file can trigger a large intermediate allocation while producing only two decoded frames:
opencv.py#L28-L50.
The missing invariant is a strict upper bound on sampling work before the index list is constructed. Bounding decoded output after deduplication does not bound the vulnerable intermediate computation.
Suggested remediation
Validate request-level video sampling options before dispatching work to the media executor. Enforce conservative absolute limits for fps, max_frames, and especially the computed candidate…
- Record
PYSEC-2026-4307- CVSS 3.1
- 5.3 Medium
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L - Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| facts | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-105760 is a medium vulnerability (CVSS 5.3) in Vllm, published October 5, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.30%, the 22nd percentile. Fixed in vllm 0.30.0.
References
github.com/vllm-project/vllm/security/advisories/GHSA-58v5-2m8f-94pr
github.com/vllm-project/vllm/pull/54935
github.com/vllm-project/vllm/commit/8b6de0eb9a09ef53f20cf06bd4d17ee264b9c2a7
github.com/vllm-project/vllm/releases/tag/v0.30.0
github.com/advisories/GHSA-58v5-2m8f-94pr
github.com/CVEProject/cvelistV5/tree/main/cves/2026/105xxx/CVE-2026-105760.json
nvd.nist.gov/vuln/detail/CVE-2026-105760
github.com/vllm-project/vllm
pypi.org/project/vllm
Left out here: the rest of 3 source descriptions. The JSON record has them.