CVE
CVE-2026-65145, CVE-2026-114612, CVE-2026-35002, CVE-2026-65151, CVE-2026-65119, CVE-2026-114053
CWE
CWE-95, CWE-502, CWE-269, CWE-306, CWE-89, CWE-73
Affected Surface
- PyPI `agno` (`agno-agi/agno`) versions `< 2.3.24` (`CVE-2026-35002` / `GHSA-m4w4-3r8h-jw98` / `PYSEC-2026-256`, CVSS 9.8 Critical)
- PyPI `litellm` (`BerriAI/litellm`) versions `>= 1.91.0` (and `1.87.0`..`1.90.x` with `EXPERIMENTAL_UI_LOGIN=true`) before `1.100.4`, `1.101.3`, `1.102.2`, `1.103.1` (`CVE-2026-114612` / `GHSA-7hp6-4w63-5g45`, CVSS 9.9), and `< 1.95.0` (`GHSA-g5ff-637f-6q2m`, CVSS 8.1)
- PyPI `hydra-core` (`hydra-ecosystem/hydra`) versions `>= 1.3.6, < 1.3.8` and `>= 1.4.0.dev9, < 1.4.0rc3` (`GHSA-wf6j-7hvr-gr93` / `GHSA-757g-8w3h-hp29`, CVSS 7.8 High)
- PyPI `vllm` (`vllm-project/vllm`) versions `>= 0.7.3, < 0.31.0` when `--trust-remote-code` is enabled on multimodal models (`CVE-2026-114053` / `GHSA-h3rc-6mm3-gc2m`, CVSS 8.1 High)
- NVIDIA NeMo Agent Toolkit (`NVIDIA/NeMo-Agent-Toolkit`) versions `1.0` through `1.8.0` (`CVE-2026-65145`, CVSS 10.0 Critical) and `1.4` through `1.6` (`CVE-2026-65151`, CVSS 8.4 High)
TL;DR
On 27 October 2026, seven high- and critical-severity vulnerabilities were published across Python AI agent SDKs, LLM proxy gateways, and configuration/serving libraries:
- Agno
< 2.3.24(CVE-2026-35002/GHSA-m4w4-3r8h-jw98, CVSS 9.8 Critical): Inlibs/agno/agno/models/base.py(run_function_calls()) andlibs/agno/agno/tools/function.py(UserInputField.from_dict()), Agno converted thefield_typestring on aFunctionCalluser-input field into a Python type by callingeval(field_type). Any caller, prompt-injected model output, or deserialized tool call that controlledfield_typecould execute arbitrary Python code in the Agno process. - LiteLLM Proxy (
CVE-2026-114612/GHSA-7hp6-4w63-5g45, CVSS 9.9 Critical, andGHSA-g5ff-637f-6q2m, CVSS 8.1 High):CVE-2026-114612: LiteLLM’s proxy usedencrypt_value_helper()(keyed byLITELLM_SALT_KEYorLITELLM_MASTER_KEYwithout AES-GCM associated data) for two separate tasks: encrypting user-supplied secret values inside API key metadata and mintingExperimentalUIJWTTokenbearer session tokens. An authenticatedinternal_usercould generate an API key whose metadata contained a JSON payload matching aproxy_adminsession token ({"user_id": ..., "user_role": "proxy_admin", ...}), receive the encryptedv2:gcm:...blob in the API response, and present that ciphertext as a bearer token to becomeproxy_admin(which can execute arbitrary commands via the MCP stdio endpoint). Note that the LiteLLM1.107.0postmortem on 21 October specifically referenced an embargoed enterprise vulnerability scheduled for disclosure on 27 October.GHSA-g5ff-637f-6q2m(< 1.95.0): The/utils/transform_requestrequest-body blocklist blockedvertex_credentialsbut omitted its aliasvertex_ai_credentials, letting a low-privilegeinternal_user_viewerread local files (including/proc/self/environcontainingLITELLM_MASTER_KEY) and send them to an attacker-controlled URL.
- Meta Hydra (
hydra-core1.3.6..1.3.7and1.4.0.dev9..1.4.0rc2,GHSA-wf6j-7hvr-gr93, CVSS 7.8 High): Hydra’s legacyUNCONTROLLED_EXECUTION_TARGETSblocklist blockedpickle.,marshal.,shelve., andpydoc., but omittedyaml.. When an application passed a third-party model or checkpoint config (for example from Hugging Face) to legacyhydra.utils.instantiate(), setting_target_: yaml.unsafe_loadexecuted arbitrary Python code via!!python/object/applytags. - vLLM
0.7.3to< 0.31.0(CVE-2026-114053/GHSA-h3rc-6mm3-gc2m, CVSS 8.1 High): When serving a multimodal model with--trust-remote-code, vLLM allowed per-requestmm_processor_kwargsto overridecode_revisioninAutoProcessor.from_pretrained(). Even when the operator pinned--revisionto an audited commit, an untrusted API caller could pointmm_processor_kwargs.code_revisionat an unreviewed branch or PR revision in the same model repo and execute arbitrary Python code on import. - NVIDIA NeMo Agent Toolkit
< 1.9.0(CVE-2026-65145, CVSS 10.0 Critical, andCVE-2026-65151, CVSS 8.4 High): In Security Bulletin 5912, NVIDIA disclosed a missing-authentication vulnerability (CVE-2026-65145,1.0to1.8.0) enabling unauthenticated code execution and privilege escalation, plus a SQL injection flaw (CVE-2026-65151,1.4to1.6), both fixed inv1.9.0.
Affected packages and projects
| Ecosystem | Package / Project | CVE / Advisory | Severity | Affected versions | Fixed version | Vulnerable component |
|---|---|---|---|---|---|---|
| PyPI / GitHub | NVIDIA NeMo Agent Toolkit (NVIDIA/NeMo-Agent-Toolkit) | CVE-2026-65145, CVE-2026-65151 | CVSS 10.0 Critical / 8.4 High | 1.0..1.8.0 (65145); 1.4..1.6 (65151) | 1.9.0 | NeMo Agent Toolkit authentication & SQL query handling (NVIDIA Bulletin 5912) |
| PyPI | litellm | CVE-2026-114612 (GHSA-7hp6-4w63-5g45) | CVSS 9.9 Critical | >= 1.91.0 (and 1.87.0..1.90.x with EXPERIMENTAL_UI_LOGIN=true) | 1.100.4, 1.101.3, 1.102.2, 1.103.1 (1.106.4 current safe) | litellm/proxy/auth/auth_checks.py (ExperimentalUIJWTToken), encrypt_decrypt_utils.py |
| PyPI | litellm | GHSA-g5ff-637f-6q2m | CVSS 8.1 High | < 1.95.0 | 1.95.0 (1.106.4 current safe) | litellm/proxy/auth/auth_utils.py (/utils/transform_request vertex_ai_credentials) |
| PyPI | agno | CVE-2026-35002 (GHSA-m4w4-3r8h-jw98, PYSEC-2026-256) | CVSS 9.8 Critical | < 2.3.24 | 2.3.24 (3.1.10 current) | libs/agno/agno/models/base.py (run_function_calls), agno/tools/function.py (UserInputField.from_dict) |
| PyPI | vllm | CVE-2026-114053 (GHSA-h3rc-6mm3-gc2m) | CVSS 8.1 High | >= 0.7.3, < 0.31.0 | 0.31.0 (0.32.0 current) | Multimodal request mm_processor_kwargs / --trust-request-mm-kwargs |
| PyPI | hydra-core | GHSA-wf6j-7hvr-gr93 (GHSA-757g-8w3h-hp29) | CVSS 7.8 High | >= 1.3.6, < 1.3.8; >= 1.4.0.dev9, < 1.4.0rc3 | 1.3.8, 1.4.0rc3 | hydra/_internal/execution_policy.py (UNCONTROLLED_EXECUTION_TARGETS) |
Technical analysis
1. CVE-2026-35002: eval(field_type) in Agno FunctionCall user-input schemas
When an Agno agent processes a tool call that requests structured user input (user_input_fields), both run_function_calls() in libs/agno/agno/models/base.py and UserInputField.from_dict() in libs/agno/agno/tools/function.py resolved the string type name ("str", "int", "bool", etc.) by passing it straight to Python’s built-in eval():
--- a/libs/agno/agno/models/base.py
+++ b/libs/agno/agno/models/base.py
@@ -2030,10 +2030,20 @@ def run_function_calls(
user_input_schema = []
for input_field in fc.arguments.get("user_input_fields", []):
field_type = input_field.get("field_type")
- try:
- python_type = eval(field_type) if isinstance(field_type, str) else field_type
- except (NameError, SyntaxError):
- python_type = str # Default to str if type is invalid
+ if isinstance(field_type, str):
+ type_mapping = {
+ "str": str,
+ "int": int,
+ "float": float,
+ "bool": bool,
+ "list": list,
+ "dict": dict,
+ }
+ python_type = type_mapping.get(field_type, str)
Because fc.arguments comes from model tool-call output or serialized FunctionCall payloads, an attacker who influenced the model’s FunctionCall arguments (via prompt injection, an untrusted MCP/tool definition, or an API request) could set "field_type": "__import__('os').system('...')" and execute arbitrary Python code. Commit cbf675521d (v2.3.24) replaces both eval() calls with a static type_mapping dictionary lookup.
2. CVE-2026-114612 and GHSA-g5ff-637f-6q2m in LiteLLM Proxy
In CVE-2026-114612 (GHSA-7hp6-4w63-5g45, CVSS 9.9), ExperimentalUIJWTToken.get_experimental_ui_login_jwt_auth_token() in litellm/proxy/auth/auth_checks.py minted session tokens by serializing a LiteLLM_JWTAuth object to JSON and encrypting it with encrypt_value_helper():
# litellm/proxy/auth/auth_checks.py (vulnerable)
return encrypt_value_helper(valid_token.model_dump_json(exclude_none=True))
Inside litellm/proxy/common_utils/encrypt_decrypt_utils.py, _encrypt_aes_gcm() encrypted plaintext under AESGCM(_derive_key(signing_key)).encrypt(nonce, value.encode("utf-8"), None) with aad=None. Because the proxy used the exact same encrypt_value_helper() function to seal user-controlled secret fields stored in API key metadata (such as logging callback variables) and returned the sealed ciphertext to the caller, an authenticated internal_user could use the key-generation endpoint as an encryption oracle. By placing a JSON string with "user_role": "proxy_admin" into a field that LiteLLM encrypts at rest, the user received back a valid v2:gcm:... ciphertext that the bearer-token authentication path decrypted and trusted as a proxy_admin session token. Once promoted to proxy_admin, the attacker could register or invoke an MCP stdio server to run arbitrary OS commands.
Commit 1d5fdc87fe binds session tokens to a dedicated AES-GCM Additional Authenticated Data (aad) context and litellm_login_ prefix via encrypt_bearer_token() / decrypt_bearer_token(), so ciphertexts produced by encrypt_value_helper() (aad=None) fail GCM tag verification when presented as bearer tokens.
Separately, in GHSA-g5ff-637f-6q2m (commit 065faf6e69, fixed in 1.95.0), the /utils/transform_request endpoint blocked vertex_credentials in request bodies from low-privilege internal_user_viewer callers, but missed the alias vertex_ai_credentials. Passing a file path in vertex_ai_credentials alongside an attacker-controlled api_base caused the Vertex AI credential loader to read the local file and transmit its contents outbound.
3. GHSA-wf6j-7hvr-gr93 in Meta Hydra and CVE-2026-114053 in vLLM
- PyYAML gadget gap in Hydra’s legacy blacklist (
GHSA-wf6j-7hvr-gr93, commit9a7a9a287d): Inhydra-core1.3.6and1.3.7,hydra/_internal/execution_policy.pymaintainedUNCONTROLLED_EXECUTION_TARGETSto block dangerous_target_callables (eval,exec,pickle.*,marshal.*,shelve.*,trace.*,pydoc.*,bdb.*) whenhydra.utils.instantiate()ran without an explicit execution whitelist. However,yaml.was omitted from the prefix denylist. An attacker who controlled a Hydra configuration file bundled inside a model checkpoint could specify_target_: yaml.unsafe_load(oryaml.loadwith_target_: yaml.UnsafeLoader) and pass a string containing!!python/object/apply:os.system ["..."]. Hydra1.3.8and1.4.0rc3add"yaml."toUNCONTROLLED_EXECUTION_TARGETSwhile excepting onlyyaml.safe_load,yaml.safe_load_all,yaml.safe_dump, andyaml.safe_dump_all. - Per-request
mm_processor_kwargs.code_revisionRCE in vLLM (CVE-2026-114053, commit31f2e70cd3): When a vLLM operator serves a multimodal model that requires--trust-remote-codeand pins--revision <commit-sha>so only audited model code runs, vLLM’s multimodal processor loader previously merged per-requestmm_processor_kwargsfrom the OpenAI-compatible API request directly intoAutoProcessor.from_pretrained(..., **mm_processor_kwargs). A client that sent"mm_processor_kwargs": {"code_revision": "refs/pull/123/head"}overrode thecode_revisionargument passed to Hugging Facetransformers, causing the vLLM server to fetch andimportdynamicauto_mapPython code from an unreviewed revision. Starting invLLM0.31.0, non-empty per-requestmm_processor_kwargsandmedia_io_kwargsare rejected by default unless--trust-request-mm-kwargsis explicitly passed on the CLI.
Detection and remediation
# 1. Check Python environments and dependency lockfiles for affected versions
pip show agno litellm hydra-core vllm nvidia-nat 2>/dev/null || true
rg -n -i '"?(agno|litellm|hydra-core|vllm|nvidia-nat|nemo-agent-toolkit)"?\s*([~=!<>]=|:)' \
requirements*.txt pyproject.toml uv.lock poetry.lock Pipfile.lock 2>/dev/null
# 2. Search model/checkpoint YAML configs for suspicious Hydra _target_: yaml.* entries
rg -n '_target_\s*:\s*["'\'']?yaml\.' --glob '*.{yaml,yml}' . 2>/dev/null
# 3. Check LiteLLM deployment configs for EXPERIMENTAL_UI_LOGIN=true
rg -n 'EXPERIMENTAL_UI_LOGIN' . --glob '*.{yaml,yml,env,sh,py}' 2>/dev/null
- Upgrade affected packages:
- Agno: Upgrade to
agno >= 2.3.24(3.1.10is current on PyPI). - LiteLLM: Upgrade to a patched release (
>= 1.103.1, or1.106.4on the current branch; never install1.107.0, which was a compromised supply-chain release on 21 October). If you cannot upgrade immediately, setEXPERIMENTAL_UI_LOGIN=falseto mitigateCVE-2026-114612. - Hydra: Upgrade to
hydra-core >= 1.3.8(or1.4.0rc3on the 1.4 pre-release track). - vLLM: Upgrade to
vllm >= 0.32.0(which includes both0.31.0’sCVE-2026-114053fix and the0.32.0fixes forCVE-2026-115912andCVE-2026-115915), and keep--trust-request-mm-kwargsdisabled when serving untrusted clients. - NVIDIA NeMo Agent Toolkit: Update to
v1.9.0or later fromNVIDIA/NeMo-Agent-Toolkit.
- Agno: Upgrade to
Timeline
- 2026-09-10: NVIDIA releases NeMo Agent Toolkit
v1.9.0. - 2026-10-21: During the LiteLLM
1.107.0supply-chain incident, LiteLLM notes that its private enterprise registry carried an embargoed security patch scheduled for public disclosure on 27 October. - 2026-10-27 (
13:16to17:08 UTC): NVIDIA publishes Security Bulletin5912(CVE-2026-65145,CVE-2026-65151), and the GitHub Advisory Database and NVD publishGHSA-m4w4-3r8h-jw98(CVE-2026-35002in Agno),GHSA-7hp6-4w63-5g45(CVE-2026-114612in LiteLLM),GHSA-g5ff-637f-6q2m(LiteLLM),GHSA-h3rc-6mm3-gc2m(CVE-2026-114053in vLLM), andGHSA-wf6j-7hvr-gr93(Hydra).
From research to remediation
Check whether this pattern exists in your codebase
Turn this research into a remediation workflow. Scan dependencies and package manifests for similar supply-chain risk, then prioritize fixes with reachability context.
References
- Agno advisory GHSA-m4w4-3r8h-jw98 and commit cbf675521d (CVE-2026-35002: eval() on FunctionCall field_type)
- LiteLLM advisory GHSA-7hp6-4w63-5g45 and commit 1d5fdc87fe (CVE-2026-114612: salt key cross-domain privilege escalation)
- LiteLLM advisory GHSA-g5ff-637f-6q2m and commit 065faf6e69 (vertex_ai_credentials local file read)
- Hydra advisory GHSA-wf6j-7hvr-gr93 and commit 9a7a9a287d (block PyYAML unsafe load targets in legacy blacklist)
- vLLM advisory GHSA-h3rc-6mm3-gc2m and commit 31f2e70cd3 (CVE-2026-114053: mm_processor_kwargs.code_revision RCE)
- NVIDIA Security Bulletin 5912 (27 October 2026): NeMo Agent Toolkit CVE-2026-65145 and CVE-2026-65151