// 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

PlainCVE Team · Published 2026-09-24 · AI-assisted · Press brief ↓

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 affectedPeople 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 happensIf 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 nowUpgrade 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)
  • Vendor / maintainervLLM's advisory: upgrade to 0.28.0 or latergithub.com
  • Our assessmentLoading only trusted models, checking the two processor Python files before loading, and limiting the vLLM environment's privileges are our own suggestions based on how the flaw works; the vendor provides no workaround, detection method or IoCs
  • Our assessmentIf you loaded a suspicious model on an old version, removing it, rotating the secrets vLLM could read and rebuilding from a clean image is our precautionary advice, not a sign of a confirmed leak
Affected versions0.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)
  • CVE recordThe CVE record (VulnCheck) gives the official range: before 0.28.0vLLM before 0.28.0 contains a remote code execution vulnerability in the LlavaOnevision2 processor loadercveawg.mitre.org
  • Vendor / maintainervLLM's advisory: loading a crafted LlavaOnevision2 model runs its code with the vLLM process's authority even with trust_remote_code=False; the official range is < 0.28.0Loading/serving a crafted LlavaOnevision2 model with the safety opt-out enabled runs arbitrary code with the vLLM process's authority.github.com
  • Vendor / maintainerThe vLLM 0.25.0 release notes list LLaVA-OneVision-2 as a new modelNew models: LLaVA-OneVision-2 (#44785)github.com
  • Our assessmentWe checked the 0.25.0 source: the processor loader already had the flawed code; earlier versions do not include this model, so the versions actually affected are 0.25.0 up to before 0.28.0
Fixed versions0.28.0 or later
View evidence(4)
  • Vendor / maintainervLLM's advisory: fixed in 0.28.0 and latergithub.com
  • Vendor / maintainerFix PR #52952: with trust_remote_code off, the loader raises ValueError before any remote code is importedWhen trust_remote_code=False, resolve_trust_remote_code now raises ValueError and blocks the load before any remote code is imported.github.com
  • Vendor / maintainerThe vLLM 0.28.0 release notes include this fix_load_ov2_processor guarded with resolve_trust_remote_code (#52952).github.com
  • Vendor / maintainervLLM 0.28.0 was released on PyPI on 2026-08-26pypi.org
CVSS vector
Show full vectorCVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
Timeline
  • Introduced 2026-07-11 · vLLM 0.25.0 released, first to add LLaVA-OneVision-2 source
  • First public 2026-08-28
CISA KEVNot listed(Not being in KEV does not mean it has not been exploited)
View evidence(2)
  • Our assessmentOur 2026-09-24 CISA KEV snapshot does not list this CVE; not being listed does not mean it has not been exploited
  • CERT / governmentCISA's assessment in the CVE record: exploitation status is none"Exploitation":"none"cveawg.mitre.org

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.

DETECTCheckAm I affected? Any signs of compromise?
  1. 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 check
    pip show vllm | grep -i '^version'
  2. 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 check
    find "${HF_HOME:-$HOME/.cache/huggingface}" \( -name 'processing_llava_onevision2.py' -o -name 'video_processing_llava_onevision2.py' \)
MITIGATEFix / mitigatePatch; block it if you cannot patch yet
  1. 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 environment
    pip install -U "vllm>=0.28.0"
  2. 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.

RESPONDRespondIf you find signs of compromise
  1. 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.

HARDENHardenPrevent the next one
  1. 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.

  2. 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.

  3. 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 versionWhat to do
< 0.28.0pip install -U "vllm>=0.28.0", or update to the matching container image
≥ 0.28.0Fixed; 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 ValueError after upgrading? It means the model you’re loading needs to run its bundled code. Only consider enabling trust_remote_code after 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.

vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in a malicious model runs even when you turned it off: 1. The attacker publishes a LlavaOnevision2 model with malicious processor code → 2. The operator loads the model in vLLM with trust_remote_code=False → 3. When multimodal processing starts, the trust_remote_code setting is swallowed by **kwargs → 4. The model's Python module is imported and its code runs with vLLM's privilegesCVE-2026-90553 · vLLM LlavaOnevision2 ignores trust_remote_code: code bundled in amalicious model runs even when you turned it offAttackerYour systemThe 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. 1The attackerpublishes aLlavaOnevision2model wit…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. 2The operator loadsthe model in vLLMwithtrust_remote_code=FalseWhen 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. 3When multimodalprocessing starts,thetrust_remote_cod…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. 4The model's Pythonmodule is importedand its code runswith vLLM'…Attack pathCan be stopped herePlainCVE · plaincve.date/en/vulns/cve-2026-90553-vllm-llavaonevision2-remote-code-ignored · CC BY 4.0
Free to use in reporting and teaching under CC BY 4.0. Attribution is already on the image.
  1. 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.

  2. 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.

  3. 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.

  4. 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

ConditionAffected?
vLLM before 0.28.0 + loading a LlavaOnevision2 model from an untrusted source + relying on trust_remote_code=FalseAffected
vLLM 0.28.0 or laterFixed
Old vLLM, but only loading models from trusted sourcesAn attacker has no way to plant code, but upgrading is still recommended
Old vLLM, but never loading LlavaOnevision2 modelsThe advisory describes the LlavaOnevision2 processor loading path
Sending ordinary API requests to a server running a trusted modelCannot 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 imports

The 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

DateEvent
Not publishedNLx64 reports the issue (date not published)
2026-07-11vLLM 0.25.0 released with LLaVA-OneVision-2 support (PR #44785); the flawed code ships with it
2026-08-19Fix PR #52952 opened
2026-08-20PR #52952 merged
2026-08-26vLLM 0.28.0 released on PyPI
2026-08-28GitHub security advisory GHSA-3c86-2m5g-59q7 published
2026-09-12CVE-2026-90553 published by VulnCheck
2026-09-14CVE record updated
2026-09-16NVD 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

Reviewed2026-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

  1. OthervLLM 0.25.0 released, first to add LLaVA-OneVision-2 · github.com · accessed 2026-09-24
  2. Patch / releasevLLM PR #44785: add LLaVA-OneVision-2 · GitHub / vLLM, 2026-07-02 · accessed 2026-09-24
    The new-model PR listed in the 0.25.0 release notes; it adds llava_onevision2.py, the file fix PR
  3. Patch / releasellava_onevision2.py in vLLM v0.25.0 · GitHub / vLLM · accessed 2026-09-24
    In 0.25.0 the processor loader already passes trust_remote_code to get_class_from_dynamic_module.
  4. 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
  5. AdvisoryCVE-2026-90553 record (CVE Services API) · CVE Program / VulnCheck (CNA), 2026-09-12 · accessed 2026-09-24
  6. CVE / NVD / OSVNVD CVE-2026-90553 (API) · NIST NVD, 2026-09-12 · accessed 2026-09-24
  7. AdvisoryvLLM before 0.28.0 Remote Code Execution via LlavaOnevision2 processor · VulnCheck, 2026-09-12 · accessed 2026-09-24
  8. 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
  9. Patch / releasevLLM v0.28.0 release · vLLM project (GitHub), 2026-08-26 · accessed 2026-09-24
  10. Vendorvllm 0.28.0 · PyPI, 2026-08-26 · accessed 2026-09-24
  11. 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.

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}
}