En bref

  • CVE-2026-105192 : RCE non authentifiée CVSS 9.8 dans LMCache (couche KV cache pour vLLM) — désérialisation pickle non sécurisée sur socket ZeroMQ port 5555
  • Versions affectées : LMCache 0.3.9 à 0.5.5 en mode distribué — aucun patch disponible au 7 octobre 2026 ; PoC public disponible
  • Action urgente : bloquer le port TCP 5555 sur toutes les interfaces non de confiance ; ne jamais exposer LMCache sur un réseau public ou partagé

Les faits

Le 7 octobre 2026, l'équipe de recherche en sécurité de JFrog a publié un advisory révélant CVE-2026-105192, une vulnérabilité critique d'exécution de code à distance non authentifiée affectant LMCache en mode distribué. Avec un score CVSS 3.1 de 9.8 et un vecteur CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H, cette faille permet à tout attaquant capable d'atteindre le réseau de l'infrastructure d'exécuter du code arbitraire avec les privilèges du processus LMCache — typiquement root dans les environnements conteneurisés officiels.

LMCache est la couche de cache clé-valeur (KV cache) distribuée conçue pour accélérer les inférences du moteur vLLM, le framework d'inférence de modèles de langage de grande taille (LLM) le plus utilisé dans les déploiements de production. LMCache gère la persistance et le partage des KV caches entre plusieurs instances vLLM, permettant la réutilisation de préfixes calculés et réduisant significativement la latence d'inférence. Sa présence dans les stacks d'inférence de Google Cloud GKE Inference, CoreWeave, NVIDIA Dynamo et IBM LLM Serving illustre l'ampleur de son adoption dans les environnements de production IA à grande échelle.

La root cause de CVE-2026-105192 est une combinaison fatale de deux mauvaises pratiques de sécurité : l'absence totale d'authentification sur le socket ZeroMQ ROUTER ouvert par défaut sur le port 5555, et l'utilisation de pickle Python — un mécanisme de sérialisation notoirement dangereux — pour désérialiser les données contrôlées par l'attaquant. En mode multiprocessus, LMCache ouvre un socket ZeroMQ ROUTER sur 0.0.0.0:5555 sans aucun mécanisme d'authentification ou de chiffrement. Les messages reçus sont traités via msgpack ; lorsque le code d'extension 1 est fourni, la fonction DeviceIPCWrapper.Deserialize invoque directement pickle.loads() sur les données contrôlées par l'attaquant avant toute logique d'authentification ou de validation.

Pickle Python est un format de sérialisation qui permet l'exécution de code arbitraire lors de la désérialisation d'un objet malveillant. C'est une propriété intrinsèque et documentée de pickle : la documentation officielle Python avertit explicitement de ne jamais désérialiser des données pickle provenant de sources non de confiance. L'utilisation de pickle.loads() sur des données réseau non authentifiées constitue une vulnérabilité critique par construction. CVE-2026-105192 illustre un anti-pattern tristement commun dans l'écosystème ML/AI, où les développeurs priorisent la performance et la simplicité d'implémentation sur la sécurité opérationnelle.

JFrog Security Research a publié un proof-of-concept (PoC) complet simultanément avec l'advisory le 7 octobre 2026. Ce PoC démontre comment un unique message ZeroMQ DEALER envoyé au port 5555 permet d'exécuter des commandes shell arbitraires avec les privilèges du processus LMCache. La publication du PoC signifie que la barrière technique à l'exploitation est quasi nulle : n'importe quel attaquant avec un accès réseau au port 5555 peut reproduire l'exploitation en quelques minutes, sans nécessiter de connaissances avancées en exploitation de vulnérabilités.

La gravité de la situation est amplifiée par deux facteurs critiques. Premièrement, les images de conteneurs officiels de LMCache s'exécutent en tant que root, ce qui signifie qu'une exploitation réussie donne un accès root complet au conteneur et potentiellement à l'hôte via des techniques d'évasion de conteneur. Deuxièmement, aucun patch n'était disponible au moment de la divulgation le 7 octobre 2026 : JFrog a coordonné la divulgation avec les mainteneurs de LMCache, mais la correction n'avait pas encore été intégrée dans une version stable à la date de publication de l'advisory, créant une fenêtre d'exposition zero-day.

L'absence de patch combinée à la publication d'un PoC crée une fenêtre d'exposition critique particulièrement dangereuse. La vérification de l'exposition est simple : tester si le port 5555 est accessible depuis des réseaux non de confiance suffit à déterminer le risque immédiat. Les déploiements Kubernetes doivent vérifier les NetworkPolicies autorisant le trafic vers ce port — une configuration par défaut permissive (commune dans les environnements de développement IA) peut exposer des instances LMCache sans que les équipes d'infrastructure en soient conscientes.

Selon NVD/NIST et les analyses JFrog, les versions affectées sont LMCache 0.3.9 à 0.5.5 incluses. Les déploiements utilisant LMCache uniquement en mode single-process (sans le mode distribué multiprocessus) ne sont pas exposés par ce vecteur spécifique. Cependant, la documentation officielle de LMCache recommande le mode distribué pour les déploiements à scale, ce qui en fait la configuration la plus courante dans les environnements de production. Les organisations ayant migré vers LMCache depuis vllm-router ou d'autres solutions de cache pour LLM sont particulièrement concernées.

Impact et exposition

CVE-2026-105192 cible directement l'infrastructure d'inférence IA, un segment en forte croissance dont la posture de sécurité est souvent immature. Les organisations exposées sont celles ayant déployé vLLM avec LMCache en mode distribué pour des workloads d'inférence LLM en production : fournisseurs de services IA, entreprises ayant internalisé leurs modèles de langage, plateformes de génération de code, services de chatbot entreprise, et plateformes de recherche académique utilisant des clusters GPU partagés.

La condition d'exploitation est particulièrement préoccupante dans les environnements Kubernetes multi-tenant : si le port 5555 d'un pod LMCache est accessible depuis d'autres namespaces ou depuis Internet (via un LoadBalancer ou NodePort mal configuré), l'exploitation peut mener à une compromission complète du nœud hôte. Dans les clusters partagés, cela peut permettre une compromission latérale inter-tenant, exposant les données d'inférence de plusieurs clients à partir d'une seule exploitation.

L'impact direct d'une exploitation réussie comprend : exécution de code arbitraire avec privilèges root sur le serveur d'inférence, accès aux modèles IA propriétaires et aux données d'inférence potentiellement confidentielles, extraction des credentials d'accès aux services cloud sous-jacents via le metadata service (IMDSv1/v2), et pivot vers d'autres systèmes du réseau interne. Dans un contexte d'inférence de modèles propriétaires à forte valeur commerciale, la compromission peut aussi impliquer le vol du modèle lui-même et des données d'entraînement associées.

La surface d'attaque est particulièrement large car LMCache est souvent déployé dans des environnements réseau internes avec des politiques de sécurité moins strictes que les périmètres externes. Un attaquant ayant obtenu un foothold initial peut utiliser CVE-2026-105192 pour un mouvement latéral rapide vers l'infrastructure d'inférence IA, accédant ainsi aux actifs les plus précieux : les modèles, les données d'entraînement, et les pipelines de production IA.

Recommandations immédiates

  • Bloquer immédiatement le port TCP 5555 sur toutes les interfaces non de confiance via règles firewall (iptables, nftables) ou NetworkPolicies Kubernetes
  • Vérifier qu'aucune instance LMCache n'est exposée sur une interface publique ou un réseau non segmenté — tester avec nmap -p 5555 <host> depuis un réseau externe
  • Si LMCache est déployé dans Kubernetes, auditer immédiatement les NetworkPolicies autorisant le trafic entrant vers le port 5555 dans tous les namespaces concernés
  • Exécuter LMCache avec un utilisateur non-root : ajouter securityContext.runAsNonRoot: true et securityContext.runAsUser: <uid non-root> dans les manifests Kubernetes
  • Surveiller les connexions sortantes anormales depuis les pods ou hôtes LMCache (indicateur potentiel d'exploitation active)
  • Vérifier la disponibilité d'un patch sur le dépôt officiel LMCache et appliquer dès disponibilité d'une version corrigée
  • Considérer l'utilisation de mTLS ou d'un proxy authentifiant devant le port ZeroMQ en attendant le patch officiel

⚠️ Urgence

CVE-2026-105192 est une vulnérabilité non patchée avec PoC public, CVSS 9.8, exploitable sans authentification en quelques minutes. L'exécution s'effectue en root dans les déploiements officiels. Si vous utilisez LMCache en mode distribué, considérez votre infrastructure compromise jusqu'à vérification de l'isolation réseau du port 5555. Action immédiate requise — bloquer le port avant toute autre étape.

Comment savoir si je suis vulnérable ?

Exécutez ss -tlnp | grep 5555 ou netstat -tlnp | grep 5555 sur les hôtes exécutant LMCache. Si le port 5555 est en état LISTEN sur une interface non-loopback (0.0.0.0 ou une IP publique/interne), vous êtes vulnérable si la version LMCache est comprise entre 0.3.9 et 0.5.5. Pour vérifier la version : pip show lmcache ou pip3 show lmcache. Dans Kubernetes : kubectl exec -n <namespace> <pod> -- ss -tlnp | grep 5555. Une réponse vide signifie que le port n'est pas exposé sur ce pod.

Votre infrastructure IA est-elle sécurisée ?

Ayi NEDJIMI réalise des audits ciblés pour identifier et corriger vos vulnérabilités, y compris dans vos déploiements LLM et infrastructure IA.

Demander un audit