Aller au contenu

CVE-2026-59822 : contournement d'authentification sur le Point de terminaison HTTP streamable MCP de LiteLLM

HTS

HERMES THREAT SCORE & EXPLOITABILITÉ OPÉRATIONNELLE

Cible : Passerelle HTTP Streamable LiteLLM MCP
Confiance : 98%
96 / 100
EXTRÊME

Mesure la pertinence opérationnelle réelle, la militarisation de l'exploit et la posture de menace active.

Décomposition des dimensions
Exploitabilité 20 / 20
Activité de menace 20 / 20
Militarisation 15 / 20
Exposition 15 / 20
Prévalence 10 / 20
Impact 10 / 20
⚖️ Divergence & Justification opérationnelle

Propulsé à 96 EXTRÊME par Hermes : inscription au catalogue CISA KEV, kits d'exploits publics armés dans la nature et forgeage d'authentification trivial accordant un accès immédiat aux outils MCP d'entreprise et aux clés d'API des LLM.

🕸️ Knowledge Graph & Voisinage de Menace

CVE-2026-59822: LiteLLM MCP Streamable HTTP Auth BypassVULNÉRABILITÉ

Nœuds connectés : 10
Relations sortantes actives
→ affectsCOMPOSANTLiteLLM Proxy & MCP Server
99% VERY_HIGH

Enterprise LLM proxy gateway supporting Model Context Protocol (MCP) streamable endpoints and unified LLM APIs.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Directly confirmed by vendor advisory GHSA-59822 and federal advisory in CISA KEV.”

Preuves vérifiées associées :
94% HIGH

Adversarial subversion of structured tool execution arguments (SQL, Shell, Filepath) passed from an LLM agent to host OS tools or MCP endpoints.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Hijacking MCP endpoints enables attackers to supply crafted tool execution parameters.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1552: Unsecured Credentials
92% HIGH

Adversaries search compromise victims for unsecured credentials in files, environment variables, or memory.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Unauthenticated MCP access allows scraping upstream model API keys and internal environment variables.”

Preuves vérifiées associées :
→ leaves_artifactARTEFACT FORENSIQUEForged MCP Authorization Header Log
97% VERY_HIGH

HTTP traffic logs demonstrating connections to /mcp/streamable with arbitrary Bearer tokens bypassing validation.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Access logs record HTTP POST requests with missing or dummy Authorization headers.”

Preuves vérifiées associées :
→ detected_byDÉTECTIONSigma: LiteLLM MCP Unauthenticated Session Spawn
95% VERY_HIGH

Detects anomalous streamable HTTP session initialization to LiteLLM endpoints with missing or dummy bearer tokens.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Sigma rule SIG-MCP-042 flags unauthenticated session establishment requests.”

Preuves vérifiées associées :
→ enablesMODÈLE D'ATTAQUEAAP-004: Semantic Tool Poisoning
92% VERY_HIGH

Attacker registers rogue MCP tools or skills with weaponized docstrings and deceptive metadata that trick the model into routing sensitive user tasks to attacker-controlled functions.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Unauthenticated MCP access allows registering rogue tool definitions with weaponized descriptions.”

Preuves vérifiées associées :
90% VERY_HIGH

Exploitation of unauthenticated, unsigned inter-agent communication channels to forge delegation directives, impersonate orchestrator agents, and command worker subagents.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Compromising the MCP streaming proxy allows injecting spoofed responses into peer agent message flows.”

Preuves vérifiées associées :
→ affectsCOMPOSANTLiteLLM Proxy & MCP Server
98% VERY_HIGH

Enterprise LLM proxy gateway supporting Model Context Protocol (MCP) streamable endpoints and unified LLM APIs.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Confirmed security vulnerability in LiteLLM Proxy & MCP Server documented in Hermes dossier.”

Preuves vérifiées associées :
Associations entrantes
LiteLLM Streamable MCP Token ForgerEXPLOIT → exploits → [Cette entité]
96% VERY_HIGH
ShadowAgent StealerMALWARE → exploits → [Cette entité]
87% HIGH

LiteLLM fait office de proxy inverse, de répartiteur de charge et de passerelle de sécurité pour les modèles de langage (LLM). Afin de supporter l’exécution d’agents autonomes, les versions récentes ont intégré le support du standard Model context protocol (MCP) via des canaux de transport HTTP Streamable et SSE (Server-Sent Events).

La faille réside dans le middleware d’authentification contrôlant l’arborescence des routes /mcp (/mcp, /mcp/stream et les points de terminaison RPC associés). En temps normal, une requête entrante doit présenter une clé principale ou virtuelle LiteLLM valide dans l’en-tête Authorization.

Requête entrante -> /mcp/stream [Authorization: Bearer <token>]
│
▼
Vérification de la clé API LiteLLM (Échec)
│
▼
Bascule vers la routine de repli (OAuth2 Fallback)
│
▼
Capture de l'exception de validation
│
▼
[FAILLE CRITIQUE] Instanciation : user_auth = UserAPIKeyAuth()
│
▼
Routage aval : if user_auth: -> ACCÈS ACCORDÉ

Lorsqu’un jeton synthétique ou invalide est soumis, la routine de vérification principale déclenche une exception d’authentification. Au lieu de clore immédiatement l’échange par une réponse HTTP 401 Unauthorized, le gestionnaire de la route MCP redirige l’exécution vers une routine de vérification de type OAuth2 passthrough.

Dans ce bloc de secours, l’exception non traitée aboutit par défaut à l’instanciation d’une structure vide UserAPIKeyAuth(). Les mécanismes d’autorisation suivants évaluent l’identité de l’appelant en vérifiant simplement l’existence de cet objet :

# Modèle d'implémentation vulnérable (simplifié)
user_auth = None
try:
user_auth = await validate_litellm_key(token)
except Exception:
# Repli défaillant : renvoi d'un objet vide au lieu de lever une erreur 401
user_auth = UserAPIKeyAuth()
# Le portail d'accès vérifie l'existence de l'objet
if user_auth is not None:
return await handle_mcp_stream(request, user_auth)

En Python, une instance de dataclass instanciée s’évalue systématiquement à True. La requête franchit donc l’ensemble des vérifications ultérieures sans lever la moindre exception. Le système assigne un contexte permissif par défaut à la transaction, octroyant à l’appelant non authentifié un accès complet au sous-système MCP.

Le vecteur d’attaque est strictement distant (réseau) et ne requiert aucun privilège préalable ni identifiant valide.

L’attaquant envoie une requête HTTP POST vers le point d’accès Streamable HTTP avec un jeton Bearer arbitraire :

POST /mcp/stream HTTP/1.1
Host: litellm-proxy.target.corp
Authorization: Bearer invalid_synthetic_token_1337
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "tools/list",
"params": {},
"id": 1
}

Le serveur exécute la branche de repli défaillante et initialise une session MCP bidirectionnelle. La réponse renvoie l’inventaire complet des fonctions et outils enregistrés sur l’instance LiteLLM :

{
"jsonrpc": "2.0",
"result": {
"tools": [
{
"name": "corporate_sql_query",
"description": "Execute read queries on the production customer database",
"inputSchema": { "type": "object", "properties": { "query": { "type": "string" } } }
},
{
"name": "system_bash_exec",
"description": "Run diagnostic utilities on backend worker nodes",
"inputSchema": { "type": "object", "properties": { "cmd": { "type": "string" } } }
}
]
},
"id": 1
}

Une fois la session MCP initialisée :

  • Exécution arbitraire d’outils (kinetic execution) : l’attaquant invoque directement les fonctions déclarées via tools/call. Comme détaillé dans notre étude sur l’Architecture de l’Injection d’Outils (Tool Injection), les serveurs MCP disposent fréquemment d’accès aux bases de données internes, aux systèmes de fichiers ou à des consoles de commande (bash). L’accès direct à ces outils équivaut à une exécution de code à distance (RCE).
  • Vol de secrets et clés d’API : l’interaction avec les fonctions d’administration du proxy permet d’extraire les clés de fournisseurs tiers (clés API OpenAI, Anthropic, AWS Bedrock) stockées en mémoire vive.
  • Chaînage de vulnérabilités : cette faille peut être combinée avec des vulnérabilités documentées antérieurement sur LiteLLM, notamment CVE-2026-42208 (injection SQL sur la vérification des clés) et CVE-2026-30623 (exécution de commandes arbitraires via la configuration MCP).

Les équipes de réponse aux incidents (DFIR) doivent examiner les artefacts suivants :

1. Journaux des serveurs mandataires inverses (reverse proxy)

Section intitulée « 1. Journaux des serveurs mandataires inverses (reverse proxy) »
  • Accès suspects aux routes MCP : requêtes POST vers /mcp, /mcp/stream, /mcp/v1/streamable ou /mcp/messages en provenance d’adresses IP publiques non autorisées.
  • Anomalies de codes d’état HTTP : présence de codes 200 OK sur ces chemins pour des requêtes comportant des chaînes d’authentification invalides (normalement rejetées en 401 Unauthorized).
  • Agents utilisateurs suspects : utilisation directe de bibliothèques clientes (curl/*, python-requests/*, Go-http-client/*) ciblant les routes d’écoute en continu.
  • Sessions d’utilisateurs sans identifiant : présence d’événements sans user_id ni clé identifiée dans les logs JSON :
    {"level": "INFO", "endpoint": "/mcp/stream", "user_id": null, "key_hash": null, "mcp_method": "tools/call"}
  • Traces d’avertissements de repli OAuth2 suivies de succès d’exécution dans les journaux d’audit.

3. Télémétrie des appels d’outils et consommations LLM

Section intitulée « 3. Télémétrie des appels d’outils et consommations LLM »
  • Déclenchements imprévus d’outils sensibles sans corrélation avec une activité utilisateur légitime dans le module de suivi des dépenses (LiteLLM Spend Tracking).
  • Trafic sortant anormal depuis le conteneur du proxy vers des ressources internes (bases de données PostgreSQL/MySQL, partages de fichiers).
title: Tentative d'exploitation du contournement d'authentification LiteLLM MCP (CVE-2026-59822)
id: 5a7e6b21-4f89-4c23-92ef-d3b194f59822
status: experimental
description: Détecte les tentatives d'accès non autorisé au point de terminaison Streamable HTTP MCP de LiteLLM exploitant la faille de repli OAuth2.
references:
- https://github.com/BerriAI/litellm/security/advisories/GHSA-7488-6r32-c95q
- https://nvd.nist.gov/vuln/detail/CVE-2026-59822
author: Hermes Codex CTI
date: 2026-09-06
logsource:
category: webserver
product: litellm
detection:
selection_mcp_paths:
cs-method: 'POST'
cs-uri-stem|startswith:
- '/mcp/'
- '/mcp'
selection_headers:
cs-header_authorization|contains: 'Bearer '
filter_status:
sc-status: 200
condition: selection_mcp_paths and selection_headers and filter_status
falsepositives:
- Sessions de clients automatisés légitimes utilisant des clés valides (corréler avec les identifiants déclarés).
level: high
tags:
- attack.initial_access
- attack.t1190
- cve.2026.59822

Mettre à jour immédiatement LiteLLM vers la version 1.84.0 ou ultérieure. Cette version refond la séquence d’authentification des routes MCP, neutralise le contournement de repli et émet une exception 401 Unauthorized stricte dès qu’une clé est invalide.

2. Isolation réseau et filtrage d’urgence (virtual patching)

Section intitulée « 2. Isolation réseau et filtrage d’urgence (virtual patching) »

Dans l’attente du déploiement du correctif :

  • Blocage au niveau du mandataire inverse : interdire l’accès externe au préfixe /mcp/ au niveau de la passerelle d’entrée (Nginx, Envoy, Cloudflare, Traefik) :
    location ^~ /mcp/ {
    deny all;
    return 403;
    }
  • Durcissement de configuration : si les fonctionnalités MCP ne sont pas exploitées en production, désactiver les routes MCP dans le fichier config.yaml de LiteLLM et isoler le service sur un sous-réseau interne restreint.