marimo - CVE-2026-39987

Date de publication :

Il s'agit d'une vulnérabilité d'absence d'authentification sur une fonction critique dans marimo.

marimo est un environnement de notebooks Python réactif et interactif, conçu pour le développement et le partage de scripts d'analyse de données et d'applications web légères directement depuis le navigateur.

L'endpoint WebSocket /terminal/ws ne fait appel ni au décorateur @requires() ni à la fonction validate_auth(), contrairement à l'endpoint /ws qui les implémente correctement. Le middleware AuthenticationMiddleware de Starlette marque les connexions non authentifiées comme UnauthenticatedUser sans les rejeter activement, laissant l'application de l'authentification à la charge de chaque endpoint. La connexion est acceptée via websocket.accept(), puis un shell PTY interactif est créé par pty.fork(), exposant un terminal système complet. Dans les déploiements Docker par défaut, le processus s'exécute en tant que root.

Elle permet à un attaquant non authentifié d'obtenir une exécution de code arbitraire à distance avec des privilèges root via une simple connexion WebSocket.

Informations

La faille est activement exploitée : Oui

Un correctif existe : Oui

Une mesure de contournement existe : Non

Risques

Exécution de code arbitraire (à distance)

Exploitation

La vulnérabilité exploitée est du type
CWE-306 : Missing Authentication for Critical Function

Détails sur l'exploitation
•   Vecteur d'attaque : Réseau
•   Complexité de l'attaque : Faible
•   Privilèges nécessaires pour réaliser l'attaque : Aucun
•   Interaction d'un utilisateur ayant accès au produit est-elle nécessaire : Non
•   L'exploitation de la faille permet d'obtenir des droits privilégiés : Oui

Preuve de concept
Une preuve de concept est disponible en sources ouvertes.

Systèmes ou composants affectés

marimo versions 0.20.4 et antérieures

Solutions ou recommandations

marimo version 0.23.0 et supérieures