édition quotidiennecurated dispatchespas de rewritediffusion à l'aubelecture longuepublication rarearchivé à viesilence, puis signal
security2026.04.24il y a 14 jours2 min de lecture

CVE-2026-39987 : RCE pré-authentifiée dans Marimo exploitée en 9h41, 662 attaques et déploiement de NKAbuse

CVE-2026-39987 (CVSS 9.3) : l'endpoint /terminal/ws de Marimo < 0.23.0 n'authentifie pas les connexions WebSocket, donnant un shell root sans credential. Premier exploit observé 9h41 après la divulgation, 662 événements enregistrés, malware NKAbuse déployé.

#rce#supply-chain#python#cve#websocket
§

Contexte

Marimo est un notebook Python open source adopté dans les environnements data science et ML, notamment pour sa capacité à s'exécuter comme application web partagée. Cette dernière fonctionnalité — lancer marimo run app.py et exposer le notebook en HTTP — a créé une surface d'attaque critique que CVE-2026-39987 matérialise pleinement.

Divulguée le 8 avril 2026, la faille a été exploitée en production en moins de 10 heures. Il n'existait aucun proof-of-concept public au moment des premières attaques : l'attaquant a reconstruit un exploit fonctionnel directement à partir du texte de l'advisory.

Points clés

  • CVE : CVE-2026-39987 · CVSS v4.0 : 9.3 (Critical)
  • Composant vulnérable : endpoint WebSocket /terminal/ws dans Marimo ≤ 0.20.4
  • Cause racine : l'endpoint ouvre un terminal PTY complet et n'appelle jamais validate_auth() — contrairement à /ws qui applique correctement l'authentification
  • Vecteur : réseau, sans authentification, sans interaction utilisateur
  • Impact : shell interactif complet sur le système hôte, exécution de commandes arbitraires avec les droits du processus Marimo
  • Patch : Marimo 0.23.0 (publié le 8 avril 2026, simultanément à l'advisory)

Exploitation in the wild

L'équipe Sysdig Threat Research a documenté la chaîne d'exploitation complète :

  1. 9h41 après la divulgation : première tentative d'exploitation enregistrée — aucun PoC public n'existait
  2. < 3 minutes : une opération complète de vol de credentials exécutée après accès initial
  3. 11 au 14 avril : 662 événements d'exploitation comptabilisés depuis 11 adresses IP uniques dans 10 pays

Le vecteur d'accès initial est trivial — une seule requête WebSocket suffit :

# Connexion unauthentifiée au terminal Marimo
wscat -c "ws://target:2718/terminal/ws"
# → shell PTY interactif immédiat

Après accès, les attaquants ont utilisé une commande curl pour télécharger un script depuis un espace Hugging Face nommé vsccode-modetx (typosquatting de VS Code), déposant un binaire baptisé kagent — un nom choisi pour imiter le framework légitime Kubernetes AI Agent.

NKAbuse : C2 décentralisé via NKN

Le malware déployé est une nouvelle variante de NKAbuse, un threat multi-plateforme qui utilise le protocole NKN (New Kind of Network) pour ses communications de commande et contrôle. NKN est un réseau P2P décentralisé, ce qui rend le C2 très difficile à bloquer par des règles de firewall classiques ciblant des IP ou des domaines fixes.

L'usage de NKAbuse sur des environnements data science présente un risque particulier : ces environnements ont souvent accès aux bases de données internes, aux secrets d'API et aux buckets de stockage cloud, ce qui fait de l'accès initial un point de pivot idéal.

Exposition et mitigation

Qui est exposé : toute instance Marimo exposée sur un réseau (LAN ou internet) avec une version antérieure à 0.23.0. Les notebooks exécutés localement avec marimo edit en mode localhost uniquement ne sont pas affectés.

Actions immédiates :

  • Mettre à jour vers Marimo ≥ 0.23.0 (pip install --upgrade marimo)
  • Vérifier les processus actifs sur les hôtes hébergeant Marimo pour détecter kagent ou des connexions NKN sortantes
  • Auditer les logs WebSocket sur le port 2718 (port par défaut) pour des connexions sur /terminal/ws

Analyse Sysdig (source primaire) · NVD CVE-2026-39987 · PoC GitHub (fevar54)