En bref

  • CVE-2026-39987 (CVSS 9.3) : endpoint WebSocket /terminal/ws de Marimo sans authentification, aboutissant à un shell PTY non authentifié sur toutes les versions <= 0.20.4.
  • Sysdig a mesuré une exploitation 9 h 41 après publication de l'avis, avec 662 événements observés entre le 11 et le 14 avril 2026 et dépôt du backdoor NKAbuse.
  • Correctif disponible en Marimo 0.23.0 ; l'attaque s'est propagée via des Spaces Hugging Face publics faisant tourner des notebooks vulnérables.

Les faits

Le 8 avril 2026, les mainteneurs de Marimo — un notebook Python réactif très populaire dans les workflows data et IA — ont publié un avis décrivant CVE-2026-39987, une faille de contrôle d'authentification sur l'endpoint WebSocket /terminal/ws. Cotée 9.3 en CVSS, la vulnérabilité laisse un attaquant non authentifié ouvrir un terminal PTY complet sur la machine hébergeant le notebook, là où tous les autres endpoints WebSocket appellent bien la fonction validate_auth(). L'équipe de réponse de Sysdig Threat Research Team a documenté le premier tir observé exactement 9 heures et 41 minutes après publication — un attaquant a reconstruit l'exploit à partir du seul texte de l'advisory, sans aucun code public disponible, et a obtenu un shell racine en moins de trois minutes.

Les honeypots Sysdig ont ensuite enregistré 662 tentatives d'exploitation entre le 11 et le 14 avril 2026. Plusieurs opérateurs distincts se partagent la campagne : l'un d'eux héberge son payload sur Hugging Face Spaces, ce qui permet à un domaine de confiance de servir le téléchargement de second étage. Le binaire livré est une variante non documentée de NKAbuse, un backdoor Go qui utilise le réseau pair-à-pair NKN (blockchain) pour ses communications command-and-control. Cette architecture rend le C2 difficile à bloquer par adresse IP ou DNS, puisque chaque pair relaie anonymement les messages sur la chaîne.

Impact et exposition

Sont exposées toutes les instances Marimo <= 0.20.4 accessibles depuis le réseau avec le mode run ou edit actif. La vulnérabilité ne requiert aucun compte, aucune interaction utilisateur et aucune condition race : un simple ws://cible/terminal/ws suffit. Les environnements à risque élevé combinent trois profils courants : les déploiements internes où les équipes ML partagent des notebooks derrière un reverse-proxy sans authentification supplémentaire ; les hôtes cloud publiant Marimo sur un port exposé pour des démos ; et les Hugging Face Spaces en mode dev dont la configuration par défaut expose l'interface.

La vitesse d'exploitation observée — 9 h 41 — représente un jalon. Elle dépasse les fenêtres historiques de Log4Shell (< 24 h) et confirme la compression massive du cycle disclosure-to-exploit sur les logiciels open source utilisés dans l'IA. À cet égard, l'écosystème notebook partage désormais la même pression opérationnelle que les serveurs web classiques, comme l'a déjà illustré l'affaire MCPwn sur nginx-ui.

Recommandations

  • Migrer immédiatement vers Marimo 0.23.0 ; la branche 0.22 reste vulnérable.
  • Bloquer en ingress toute route contenant /terminal/ws sur le reverse-proxy devant Marimo, même après patch.
  • Imposer une authentification mutuelle (mTLS ou token) sur l'intégralité de l'interface Marimo exposée publiquement.
  • Auditer les processus hôtes à la recherche de binaires NKAbuse ; l'IOC principal est un processus Go établissant des connexions vers des nœuds NKN sur le port 30003.
  • Surveiller les Spaces Hugging Face internes ou autohébergés pour détecter les workspaces contenant un Marimo non patché.

Alerte critique

L'exploitation est active, automatisée et entraîne la compromission complète de l'hôte. Toute instance Marimo exposée sur Internet ou sur un réseau multi-utilisateur doit être considérée comme potentiellement compromise tant que le patch et un audit n'ont pas été menés.

Notre Marimo tourne derrière un reverse-proxy avec Basic Auth : sommes-nous protégés ?

Oui, si le Basic Auth est configuré sur l'intégralité des routes y compris les WebSockets. Un grand nombre de configurations Nginx laissent passer les upgrades WebSocket sans réapplication du filtre d'authentification. Vérifiez explicitement que la directive auth_basic s'applique aussi au bloc gérant l'upgrade HTTP.

Comment savoir si NKAbuse a déjà été déployé sur notre hôte ?

Recherchez tout binaire Go inconnu établissant des connexions sortantes vers des nœuds NKN (port 30003/tcp et 30020/tcp), ainsi que les processus nommés de façon générique (systemd-worker, kdaemon). Sysdig fournit des règles Falco publiques couvrant ce comportement ; sur un système sans EDR adapté, un simple ss -tnp combiné à une analyse des connexions sortantes récurrentes suffit souvent à repérer l'implant.

Ce qu'il faut retenir

La chaîne d'attaque Marimo résume la nouvelle norme : un avis public honnête mais minimal, un attaquant qui reconstruit l'exploit en quelques heures, et un vecteur de distribution malveillant greffé sur une plateforme légitime comme Hugging Face. Pour les équipes sécurité, les notebooks et outils de développement IA ne peuvent plus être traités comme des bacs à sable de second ordre : ils sont désormais des serveurs exposés à part entière. Voir aussi notre analyse de la situation du NVD côté NIST et notre dossier sur les outils de sécurité eux-mêmes devenus vecteurs d'attaque.

Votre infrastructure est-elle exposée ?

Ayi NEDJIMI réalise des audits de sécurité ciblés pour identifier et corriger vos vulnérabilités avant qu'elles ne soient exploitées.

Demander un audit