Recherche SentinelOne
CVE-2026-7141 : RCE sur le gestionnaire de KV Cache de vLLM
Résumé exécutif
Section intitulée « Résumé exécutif »La CVE-2026-7141 (CVSS 9.8) identifie une vulnérabilité architecturale sévère au sein de vLLM, l’un des moteurs d’inférence LLM à haut débit et économes en mémoire les plus largement utilisés. La faille réside dans la façon dont l’algorithme PagedAttention de vLLM gère et recycle les blocs de mémoire GPU (VRAM) utilisés pour le cache Key-Value (KV).
Lorsqu’une requête de génération est brusquement annulée ou échoue, le système renvoie les blocs de cache KV alloués au pool disponible sans écraser de manière sécurisée (mise à zéro) les données résiduelles des tenseurs. En exploitant cette “utilisation d’une ressource non initialisée” (Use of Uninitialized Resource), un attaquant peut récupérer des prompts sensibles appartenant à d’autres locataires. De plus, en concevant des charges utiles adverses spécifiques qui corrompent les métadonnées de forme (shape metadata) des tenseurs au sein de ces blocs recyclés, les attaquants peuvent déclencher une écriture mémoire hors limites dans les liaisons (bindings) C++/CUDA sous-jacentes, réussissant ainsi à s’échapper de l’environnement d’exécution Python pour obtenir une exécution de code à distance (RCE) sur la machine hôte.
Analyse technique
Section intitulée « Analyse technique »Composant vulnérable : PagedAttention KV Cache
Section intitulée « Composant vulnérable : PagedAttention KV Cache »Pour surmonter les goulots d’étranglement de la mémoire lors de l’inférence LLM, vLLM utilise PagedAttention, qui partitionne le cache KV en blocs de taille fixe (similaires aux pages de mémoire virtuelle d’un système d’exploitation).
La vulnérabilité se situe dans le composant BlockAllocator. Pour des raisons d’optimisation des performances, lorsqu’une séquence se termine ou est interrompue, ses blocs sont libérés en les dissociant simplement du groupe de séquences actif. La mémoire GPU sous-jacente (torch.Tensor) n’est pas écrasée par des zéros.
Le vecteur RCE (Corruption de tenseur)
Section intitulée « Le vecteur RCE (Corruption de tenseur) »Bien que la lecture de données obsolètes (stale data) constitue une violation massive de la confidentialité, obtenir une RCE nécessite d’exploiter le backend C++ (ex: vllm/csrc/).
Si un attaquant inonde le serveur de charges utiles de tenseurs malformées et de taille précise, puis interrompt intentionnellement la connexion, il laisse des blocs “sales” (dirty) dans la VRAM. Lorsque l’attaquant initie une requête ultérieure spécialement conçue, vLLM alloue exactement ces mêmes blocs sales. En raison de l’absence de validations des limites dans le chemin d’exécution du noyau CUDA lors du traitement des clés d’attention non initialisées, l’attaquant peut écraser des régions mémoire adjacentes dans la VRAM.
Cette écriture hors limites finit par corrompre les structures d’objets de l’API C de Python résidant dans la mémoire mappée, permettant à l’attaquant de détourner le pointeur d’instruction du processus python hébergeant le serveur API vLLM.
Flux d’exploitation
Section intitulée « Flux d’exploitation »Le processus d’exploitation nécessite un timing précis mais aucune authentification, rendant les points de terminaison de l’API vLLM exposés sur Internet hautement vulnérables.
- Préparation du cache (Cache Grooming) : l’attaquant envoie des centaines de requêtes d’inférence simultanées contenant une charge utile de shellcode sérialisée et hautement spécifique, encodée sous forme de jetons de texte.
- Interruption brutale : avant que le modèle ne termine la génération, l’attaquant coupe toutes les connexions TCP, forçant vLLM à annuler les séquences et à renvoyer les blocs corrompus au pool libre du
BlockAllocator. - Requête de déclenchement : l’attaquant envoie une nouvelle requête, soigneusement calculée, conçue pour allouer exactement les blocs précédemment corrompus.
- Corruption de métadonnées : le noyau CUDA
PagedAttentiontraite les blocs corrompus. L’absence de mise à zéro amène le noyau à mal interpréter les données résiduelles de l’attaquant comme des métadonnées de forme de tenseur valides, déclenchant une écriture mémoire hors limites. - Exécution : l’espace mémoire de l’interpréteur Python est corrompu, détournant le flux d’exécution pour lancer le shellcode de l’attaquant, aboutissant à un reverse shell sous l’identité de l’utilisateur exécutant le service vLLM.
Investigation forensique
Section intitulée « Investigation forensique »L’investigation de la CVE-2026-7141 est particulièrement difficile car l’exploit principal se produit dans la mémoire volatile du GPU (VRAM), laissant des traces minimales sur le système de fichiers traditionnel de l’hôte.
Analyse des journaux
Section intitulée « Analyse des journaux »- Journaux du moteur vLLM : inspectez les journaux de l’application à la recherche d’un pic massif d’avertissements
Sequence abortedouConnection dropped, immédiatement suivis deCUDA_ERROR_ILLEGAL_ADDRESSouRuntimeError: CUDA error: an illegal memory access was encountered. - Journaux système : recherchez des erreurs de segmentation inattendues (
segfault) dans le processuspythonou des journauxdmesgmontrant le pilote NVIDIA (nvidia-smi) réinitialisant l’état du GPU.
Artefacts système
Section intitulée « Artefacts système »- Surveillance des processus : comme pour l’analyse de filiation des processus standard, surveillez le processus Python
vllm. Si le processus de service de l’IA génère/bin/sh,curlouwget, l’hôte a été compromis. - Swap VRAM : si la VRAM du GPU a été saturée pendant l’attaque, le système d’exploitation a pu déplacer des parties du cache KV vers le disque (fichiers d’échange). Les analystes peuvent utiliser
bstringspour extraire (carve) le fichierpagefile.sysou la partition Linuxswapà la recherche du shellcode en texte clair de l’attaquant ou des charges utiles d’injection de prompt.
Détection
Section intitulée « Détection »Détection SIEM (Format Sigma)
Section intitulée « Détection SIEM (Format Sigma) »Logique de détection : surveiller le moteur d’inférence IA (Python) générant de manière inattendue des shells interactifs ou des utilitaires réseau.
title: Processus enfant suspect généré par vLLMid: 8c9d0e1f-2a3b-4c5d-6e7f-8a9b0c1d2e3fstatus: experimentaldescription: Détecte le moteur d'inférence vLLM générant des shells suspects, indiquant une RCE réussie via la CVE-2026-7141.logsource: category: process_creation product: linuxdetection: selection: ParentImage|endswith: - '/python' - '/python3' ParentCommandLine|contains: 'vllm.entrypoints' Image|endswith: - '/bin/sh' - '/bin/bash' - '/usr/bin/curl' - '/usr/bin/wget' condition: selectionlevel: criticaltags: - attack.execution - cve.2026-7141Atténuation
Section intitulée « Atténuation »Remédiation immédiate
Section intitulée « Remédiation immédiate »- Mise à jour : mettez à niveau vLLM vers la version 0.8.4 ou ultérieure immédiatement. Ce correctif implémente une mise à zéro sécurisée des blocs de cache KV lors de l’annulation de séquences et durcit les vérifications de limites du noyau CUDA.
Mesures de durcissement
Section intitulée « Mesures de durcissement »- Imposer l’isolation des locataires : ne servez pas des modèles hautement sensibles et des points de terminaison publics depuis la même instance vLLM. Implémentez une séparation physique ou par conteneur stricte pour prévenir la fuite inter-locataires (Cross-Tenant Leakage).
- Sandboxing de conteneurs : exécutez le conteneur Docker vLLM avec un système de fichiers racine en lecture seule (
--read-only), supprimez toutes les capacités (--cap-drop=ALL), et bloquez l’accès réseau sortant pour empêcher les reverse shells de se connecter à l’attaquant.
Avis de sécurité GitHub vLLM
NDSS 2025 : Fuite de prompt via KV-Cache
- SentinelOne : vLLM KV Cache Handler RCE Vulnerability (Avril 2026)
- Symposium NDSS (2025) : I Know What You Asked: Prompt Leakage via KV-Cache Sharing in Multi-Tenant LLM Serving
- Avis de sécurité GitHub : vLLM-2026-7141
- Forensique de la mémoire GPU et chasse dans le KV Cache