// threat brief
vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in a malicious model runs even when you turned it off
- CVSS
- 7.8 HIGH
- CISA KEV
- Not listed
- Weakness
- CWE-94 · CWE-829
- Topics
- AI security · Supply chain
Human review 2026-09-24Command tests: none yetReproduced: not yetVerification record ↓
vLLM before 0.28.0 ignores trust_remote_code=False for LlavaOnevision2 models, so code bundled in a malicious model can still run.
| Who is affected | People and organizations running vLLM before 0.28.0 who load LlavaOnevision2 models from untrusted sources and rely on trust_remote_code=False to stop model code from running. |
|---|---|
| What happens | If you load a model an attacker prepared, the Python code bundled with it runs with the full privileges of the vLLM process, and could read, change or destroy whatever vLLM can reach on that machine. No source reports exploitation in the wild. |
| What to do now | Upgrade vLLM to 0.28.0 or later. Until then, don't load LlavaOnevision2 models from untrusted sources, and restrict the permissions of the environment vLLM runs in.View evidence(3)
|
| Affected versions | 0.25.0 up to (not including) 0.28.0 (the official range is "< 0.28.0"; LlavaOnevision2 was added in 0.25.0, so earlier versions do not have this model)View evidence(4)
|
| Fixed versions | 0.28.0 or laterView evidence(4)
|
| CVSS vector | Show full vectorCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Timeline |
|
| CISA KEV | Not listed(Not being in KEV does not mean it has not been exploited)View evidence(2)
|
Blue team playbook
Check, fix / mitigate, respond, harden. Matching the affected versions does not mean you were compromised, and a check that finds nothing does not prove you are safe; each item says what it can and cannot show. Tagged steps point to where the attack flow below can be stopped.
- 01Check your vLLM version
You need to worry only if the version is below 0.28.0 and you load LlavaOnevision2 models. This check is derived from the affected range; it is not an official check.
Read-only checkpip show vllm | grep -i '^version' - 02Find LlavaOnevision2 processor files in your local model cache
The advisory says the malicious code sits in these two files; reviewing them is PlainCVE's suggestion based on how the flaw works, not official advice. Finding them does not mean they are malicious, since legitimate models may ship them too; the point is to confirm they come from a source you trust and to review their contents. The command assumes the default Hugging Face cache location; adjust to your actual path.
Read-only checkfind "${HF_HOME:-$HOME/.cache/huggingface}" \( -name 'processing_llava_onevision2.py' -o -name 'video_processing_llava_onevision2.py' \)
- 01Upgrade to 0.28.0 or later
The fix (PR #52952) checks trust_remote_code before importing anything and raises a ValueError when it is off.
Changes your environmentpip install -U "vllm>=0.28.0" - 02Can't upgrade yet: don't load untrusted LlavaOnevision2 models
PlainCVE's suggestion based on how the flaw works (no official workaround has been published): load LlavaOnevision2 models only from trusted sources, and manually review the two processor Python files before loading.
- 01Loaded a suspicious model on an old version: treat the host as possibly compromised
No indicators of compromise (IoCs) or detection guidance have been published. PlainCVE's precautionary suggestion: remove the model, rotate keys and credentials the vLLM process could read, and consider rebuilding the environment from a clean image. This is not a confirmation that anything leaked.
- 01Restrict the permissions of the vLLM environment
PlainCVE's suggestion based on how the flaw works, not official advice. Even if model code runs, what it can reach stays limited.
- 02Treat models as code
Model repositories can contain executable Python, not just weights. Don't treat trust_remote_code as your only defense; vetting the source matters just as much.
- 03For developers: check safety flags yourself
A safety flag passed to a function that doesn't declare it can be silently absorbed by **kwargs. Check it yourself before the dangerous call, as vLLM's MiniCPM-V loader already did.
Full remediation steps and notes
| Current version | What to do |
|---|---|
| < 0.28.0 | pip install -U "vllm>=0.28.0", or update to the matching container image |
| ≥ 0.28.0 | Fixed; the loader raises ValueError when trust_remote_code is off |
- Order matters: if you have already loaded a LlavaOnevision2 model of unknown origin on an old version, upgrading does not undo code that already ran. Handle the host first (see the respond items above), then upgrade.
- Getting a
ValueErrorafter upgrading? It means the model you’re loading needs to run its bundled code. Only consider enablingtrust_remote_codeafter you’ve confirmed the source is trustworthy and reviewed the files. - No official detection guidance, indicators of compromise (IoCs) or workarounds have been published. The version and file checks above, and the advice to load only trusted models, review the processor files and restrict permissions, are PlainCVE’s suggestions based on how the flaw works, not official advice.
Attack flow
Read left to right: this is the order the attack happens in. A blue shield means the step can be stopped; the earlier, the better. Click an icon for details.
- Attacker
The attacker publishes a LlavaOnevision2 model with malicious processor code
Besides weights, a model repository can contain Python files, such as processing_llava_onevision2.py and video_processing_llava_onevision2.py.
Defense: Don't load LlavaOnevision2 models from untrusted sources.
- Your system
The operator loads the model in vLLM with trust_remote_code=False
vLLM treats the architecture as built-in, so the config loads without the remote-code check. The operator believes the switch keeps them safe.
Defense: Before loading, manually review processing_llava_onevision2.py and video_processing_llava_onevision2.py in the model repository.
- Your system
When multimodal processing starts, the trust_remote_code setting is swallowed by **kwargs
The processor loader passes trust_remote_code to a Transformers function that has no such parameter; the value lands in **kwargs and is ignored without any error. Whether this fires at startup or on the first multimodal request is unconfirmed.
Defense: Upgrade to 0.28.0+: the setting is checked before loading, and a ValueError is raised when it is off.
- Your system
The model's Python module is imported and its code runs with vLLM's privileges
According to the advisory, the code sits at the top level of the module, so it runs the moment the module is imported, with the full privileges of the vLLM process.
Defense: Restrict the permissions of the vLLM environment to limit the damage if code does run.
Who is affected
| Condition | Affected? |
|---|---|
vLLM before 0.28.0 + loading a LlavaOnevision2 model from an untrusted source + relying on trust_remote_code=False | Affected |
| vLLM 0.28.0 or later | Fixed |
| Old vLLM, but only loading models from trusted sources | An attacker has no way to plant code, but upgrading is still recommended |
| Old vLLM, but never loading LlavaOnevision2 models | The advisory describes the LlavaOnevision2 processor loading path |
| Sending ordinary API requests to a server running a trusted model | Cannot trigger it |
The official range is ”< 0.28.0”. LlavaOnevision2 support was added in 0.25.0 (2026-07-11, PR #44785). We checked the 0.25.0 source: the processor loader already passed trust_remote_code to a function that does not take that parameter, and fix PR #52952 changes that same file. Earlier versions do not have this model, so the versions actually affected are 0.25.0 up to, but not including, 0.28.0.
According to the advisory, all of these must hold: the user loads a LlavaOnevision2 model with vLLM; the model comes from an untrusted source; the user relies on trust_remote_code=False for protection; vLLM treats the architecture as built-in, so the config loads without the remote-code check; and multimodal processing (handling images, video and text together) is triggered. Whether the malicious code runs at startup or on the first multimodal request is unconfirmed.
How it works
An AI model repository can contain more than weights: it can also ship Python files that prepare inputs such as images or video. trust_remote_code is the switch that decides whether that bundled code may run. Setting it to False means it should not.
vLLM’s function for loading the LlavaOnevision2 processor, _load_ov2_processor(), called the Transformers function get_class_from_dynamic_module() directly and passed trust_remote_code to it. The problem: that function has no such parameter. The value was accepted by **kwargs (Python syntax for “accept any extra arguments”), and nothing ever read it or raised an error. So whatever the user had set, the model’s processor module was imported. According to the advisory, the code sits at the top level of the module, so it runs the moment the module is imported, with the full privileges of the vLLM process.
vLLM already had a safe wrapper, try_get_class_from_dynamic_module(), which calls resolve_trust_remote_code() first. The MiniCPM-V loader used it correctly; the LlavaOnevision2 path skipped it.
The flawed approach (conceptual illustration, not the original source code):
Show code example(python)
def get_class_from_dynamic_module(ref, repo, **kwargs):
# trust_remote_code isn't declared; nothing reads the value in kwargs
return import_from_repo(ref, repo)
cls = get_class_from_dynamic_module(ref, repo, trust_remote_code=False) # still importsThe fixed approach:
Show code example(python)
if not resolve_trust_remote_code(trust_remote_code, ...):
raise ValueError("trust_remote_code is off") # stop before importing
cls = get_class_from_dynamic_module(ref, repo)What does “remote code execution” mean here? The CVE description uses the phrase, but both score vectors say Attack Vector Local (AV:L) plus User Interaction. “Remote” refers to code arriving with a downloaded model, not to someone attacking a running server over the network.
Weakness types: the GHSA lists CWE-94 (code injection) and CWE-829 (inclusion of functionality from an untrusted source); the CVE record, NVD and VulnCheck list only CWE-94.
Timeline
| Date | Event |
|---|---|
| Not published | NLx64 reports the issue (date not published) |
| 2026-07-11 | vLLM 0.25.0 released with LLaVA-OneVision-2 support (PR #44785); the flawed code ships with it |
| 2026-08-19 | Fix PR #52952 opened |
| 2026-08-20 | PR #52952 merged |
| 2026-08-26 | vLLM 0.28.0 released on PyPI |
| 2026-08-28 | GitHub security advisory GHSA-3c86-2m5g-59q7 published |
| 2026-09-12 | CVE-2026-90553 published by VulnCheck |
| 2026-09-14 | CVE record updated |
| 2026-09-16 | NVD last modified; status “Analyzed” |
Per the input record, this vulnerability is not in CISA’s Known Exploited Vulnerabilities (KEV) catalog, and none of the sources read for this page mention exploitation in the wild.
Further reading
- Scoring differences: the vLLM maintainers’ GitHub advisory rates it CVSS 3.1 7.8 (High). The CVE record, published by VulnCheck, adds CVSS 4.0 8.5 (High) and also carries the 3.1 score of 7.8. NVD labels both scores as “Secondary” scores supplied by VulnCheck and shows no score of its own. The two scores use different CVSS versions; neither is wrong.
- Compared with CVE-2026-5241 (Transformers): that flaw is in Transformers’ LightGlue model loading path, where config data inside the model overrides the user’s
trust_remote_code=False; it is fixed in Transformers 5.5.0 (the CVE record’s range is “before 5.5.0”). Here the setting was ignored, because it went to a function that doesn’t accept it. The result is the same in both cases: the user turned the switch off, and the model’s Python code ran anyway. - Lesson for developers: don’t count on a downstream function to honor a safety flag for you. Check it yourself before the dangerous call, and stop if the check fails.
- Reporter: NLx64; coordinator: jperezdealgaba. “ov2” means LlavaOnevision2, not another product.
Verification Reviewed and checked against sources; not yet reproduced in our lab
| Reviewed | 2026-09-24 |
|---|
Verification records describe the environment and the result only, never reproduction steps or code that could attack other people’s systems. See our policy.
Sources
- OthervLLM 0.25.0 released, first to add LLaVA-OneVision-2 · github.com · accessed 2026-09-24
- Patch / releasevLLM PR #44785: add LLaVA-OneVision-2 · GitHub / vLLM, 2026-07-02 · accessed 2026-09-24The new-model PR listed in the 0.25.0 release notes; it adds llava_onevision2.py, the file fix PR
- Patch / releasellava_onevision2.py in vLLM v0.25.0 · GitHub / vLLM · accessed 2026-09-24In 0.25.0 the processor loader already passes trust_remote_code to get_class_from_dynamic_module.
- AdvisoryGHSA-3c86-2m5g-59q7: LlavaOnevision2 processor loader executes attacker model code with trust_remote_code=False · vLLM project (GitHub), 2026-08-28 · accessed 2026-09-24
- AdvisoryCVE-2026-90553 record (CVE Services API) · CVE Program / VulnCheck (CNA), 2026-09-12 · accessed 2026-09-24
- CVE / NVD / OSVNVD CVE-2026-90553 (API) · NIST NVD, 2026-09-12 · accessed 2026-09-24
- AdvisoryvLLM before 0.28.0 Remote Code Execution via LlavaOnevision2 processor · VulnCheck, 2026-09-12 · accessed 2026-09-24
- Patch / release[Bugfix][Security] Guard _load_ov2_processor with resolve_trust_remote_code (PR #52952) · vLLM project (GitHub), 2026-08-20 · accessed 2026-09-24
- Patch / releasevLLM v0.28.0 release · vLLM project (GitHub), 2026-08-26 · accessed 2026-09-24
- Vendorvllm 0.28.0 · PyPI, 2026-08-26 · accessed 2026-09-24
- AdvisoryCVE-2026-5241 record (CVE Services API) · CVE Program / Huntr (CNA), 2026-06-03 · accessed 2026-09-24
Press brief
In one sentence
vLLM is widely used open-source software for serving AI models. Versions before 0.28.0 ignored the user's "don't run code bundled with the model" setting when loading LlavaOnevision2 multimodal models, so Python code hidden in a malicious model would still run. The victim has to load the attacker's model; ordinary API requests cannot trigger it on their own. The fixed version, 0.28.0, was released on August 26, 2026, and no source reports exploitation in the wild.
Key facts
- Severity (vLLM advisory)
- CVSS 3.1 7.8 (High) github.com
- Severity (CVE record, VulnCheck)
- CVSS 4.0 8.5 (High) cveawg.mitre.org
- Fixed version
- 0.28.0 (released 2026-08-26) pypi.org
- Advisory published
- 2026-08-28 (GHSA-3c86-2m5g-59q7) github.com
- CVE published
- 2026-09-12, published by VulnCheck cveawg.mitre.org
Confirmed
- LlavaOnevision2 support was added in vLLM 0.25.0 (2026-07-11, PR
- In vLLM before 0.28.0, trust_remote_code=False has no effect when the LlavaOnevision2 processor loads, and the model's bundled Python module is still imported.
- The attacker must get the victim to load their model; ordinary requests to a server running a trusted model cannot trigger it.
- 0.28.0 fixes it: when trust_remote_code is off, a ValueError is raised before anything is imported.
Unconfirmed / disputed
- Exactly when the malicious code runs (at startup, or on the first multimodal request) is unconfirmed.
- No source reports exploitation, and no indicators of compromise have been published; per the input record it is not in CISA KEV (not independently checked here).
- On CWE, the GHSA lists CWE-94 and CWE-829 while the CVE record and NVD list only CWE-94.
Quotable line
The switch was there, but it wasn't wired to anything: users turned it off, and the code never looked at it.
Images
Download the share image (PNG) · Attack flow diagram (downloadable)
Please credit "PlainCVE" and link to this page. Full citation format is under "How to cite" below. Found a factual error? Report it.
vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in a malicious model runs even when you turned it off vLLM is widely used open-source software for serving AI models. Versions before 0.28.0 ignored the user's "don't run code bundled with the model" setting when loading LlavaOnevision2 multimodal models, so Python code hidden in a malicious model would still run. The victim has to load the attacker's model; ordinary API requests cannot trigger it on their own. The fixed version, 0.28.0, was released on August 26, 2026, and no source reports exploitation in the wild. Key facts: - Severity (vLLM advisory):CVSS 3.1 7.8 (High)(https://github.com/vllm-project/vllm/security/advisories/GHSA-3c86-2m5g-59q7) - Severity (CVE record, VulnCheck):CVSS 4.0 8.5 (High)(https://cveawg.mitre.org/api/cve/CVE-2026-90553) - Fixed version:0.28.0 (released 2026-08-26)(https://pypi.org/project/vllm/0.28.0/) - Advisory published:2026-08-28 (GHSA-3c86-2m5g-59q7)(https://github.com/vllm-project/vllm/security/advisories/GHSA-3c86-2m5g-59q7) - CVE published:2026-09-12, published by VulnCheck(https://cveawg.mitre.org/api/cve/CVE-2026-90553) Confirmed: - LlavaOnevision2 support was added in vLLM 0.25.0 (2026-07-11, PR - In vLLM before 0.28.0, trust_remote_code=False has no effect when the LlavaOnevision2 processor loads, and the model's bundled Python module is still imported. - The attacker must get the victim to load their model; ordinary requests to a server running a trusted model cannot trigger it. - 0.28.0 fixes it: when trust_remote_code is off, a ValueError is raised before anything is imported. Unconfirmed / disputed: - Exactly when the malicious code runs (at startup, or on the first multimodal request) is unconfirmed. - No source reports exploitation, and no indicators of compromise have been published; per the input record it is not in CISA KEV (not independently checked here). - On CWE, the GHSA lists CWE-94 and CWE-829 while the CVE record and NVD list only CWE-94. 「The switch was there, but it wasn't wired to anything: users turned it off, and the code never looked at it.」— PlainCVE https://plaincve.date/en/vulns/cve-2026-90553-vllm-llavaonevision2-remote-code-ignored
How to cite this page
This article is CC BY 4.0. Please keep the attribution and link when republishing.
PlainCVE Team (2026). "vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in a malicious model runs even when you turned it off". PlainCVE. https://plaincve.date/en/vulns/cve-2026-90553-vllm-llavaonevision2-remote-code-ignored (accessed YYYY-MM-DD)BibTeX
@misc{cve202690553vllmllavaonevision2remotecodeignored2026,
title = {vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in a malicious model runs even when you turned it off},
author = {PlainCVE Team},
year = {2026},
howpublished = {PlainCVE},
url = {https://plaincve.date/en/vulns/cve-2026-90553-vllm-llavaonevision2-remote-code-ignored},
note = {Updated 2026-09-24}
}