Rapport CTI technique du 16 août 2026
Résumé exécutif
Odysseus, l'espace de travail IA open source publié par Félix Kjellberg (PewDiePie) le 31 mai 2026 et qui a dépassé 3,4 millions de vues sur sa vidéo de lancement et 62 000 étoiles GitHub, contenait une faille d'autorisation manquante permettant à n'importe quel compte non administrateur d'obtenir un shell sur le serveur hébergeant l'application. Manifold Security a signalé le défaut le 8 juin 2026 avec une reproduction Docker complète ; quatre autres chercheurs ont rapporté le même bug indépendamment dans les huit jours suivant le lancement. Le correctif a été fusionné le 5 juillet 2026 (commit 2826dcfc), et l'avis associé, GHSA-xwhc-f36c-v5vm, reste noté Critique à 9,9 sur l'échelle CVSS 3.1, en attente d'attribution d'un identifiant CVE au moment de la publication de Manifold le 30 juillet 2026.
Une seconde faille distincte, CVE-2026-70619, touche le même sous-système d'autorisation : les routes de configuration du backend d'embedding vérifient l'authentification de session mais omettent le contrôle de rôle administrateur, ce qui permet à un utilisateur authentifié non administrateur de rediriger le trafic d'embedding vers une URL contrôlée par l'attaquant et d'exfiltrer en clair messages de chat, requêtes RAG et entrées de mémoire. Publiée le 4 août 2026 avec un score CVSS de 8,8, elle a été corrigée dans la version 1.0.2 (commit bf325f6 ou ultérieur). Les deux failles partagent la même cause racine architecturale : Odysseus vérifie l'authentification de session sans revalider systématiquement le rôle administrateur à chaque point d'entrée qui manipule un état privilégié.
Chronologie
| Date | Événement |
|---|---|
| 31 mai 2026 | Lancement public d'Odysseus par PewDiePie, plus d'1,5 million de vues en 24 heures |
| 8 juin 2026 | Manifold Security signale la faille RCE (future GHSA-xwhc-f36c-v5vm) au projet avec reproduction Docker complète |
| 8-16 juin 2026 | Quatre autres chercheurs rapportent indépendamment le même défaut |
| 5 juillet 2026 | Fusion du correctif RCE dans PR #5235 (commit 2826dcfc), issue #5233 |
| 4 août 2026 | Publication de CVE-2026-70619 (autorisation manquante sur les routes de configuration d'embedding), CVSS 8,8, corrigée en version 1.0.2 |
| 30 juillet 2026 | Manifold Security publie l'analyse technique complète de la faille RCE, GHSA-xwhc-f36c-v5vm toujours en attente de CVE |
| 11 août 2026 | The Hacker News reprend le sujet dans son récapitulatif ThreatsDay ("Odysseus RCE") |
Fiche vulnérabilité (format fiche CTI)
GHSA-xwhc-f36c-v5vm (CVE en attente d'attribution) | CVSS 3.1 : 9,9 (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H) | Odysseus, versions jusqu'à 1.0.1 incluse
Description technique. Trois portions de code distinctes vérifient les champs task_type et action d'une tâche planifiée Odysseus sans jamais poser la même question. La porte de création (routes/task_routes.py) vérifie que le task_type de la requête vaut "action" avant de contrôler que l'action est réservée aux administrateurs ; la porte de mise à jour vérifie seulement si la requête contient un champ action ; le répartiteur du planificateur (src/task_scheduler.py) déclenche l'exécution dès que le task_type stocké en base vaut "action", sans revalider l'action associée. En créant d'abord une tâche de type research avec une action shell (run_local) attachée, l'action est persistée en base sans jamais être contrôlée puisque le task_type déclaré n'est pas "action". En envoyant ensuite une requête de mise à jour ne contenant que {"task_type": "action"}, le garde if req.action is not None reste faux (aucun champ action dans cette seconde requête), et la tâche bascule en type exécutable avec l'action shell posée lors du premier appel toujours attachée. Le déclenchement final (POST /api/tasks/<id>/run) exécute alors la commande via subprocess.run(script, shell=True) dans src/builtin_actions.py, avec interprétation shell complète (pipes, redirections, substitution de commande).
Conditions d'exploitation. Un compte authentifié non administrateur suffit, sans capacité can_use_bash ni jeton spécial. La seule précondition est l'existence d'un second compte sur l'instance, via inscription libre ou instance multi-utilisateurs ; une installation mono-utilisateur avec inscription désactivée n'est pas exposée. Le code s'exécute avec les privilèges du processus Odysseus (uid 1000 dans la reproduction Docker des chercheurs), donnant accès aux hashs de mots de passe, secrets TOTP, clés API des fournisseurs LLM configurées, à la base de données, et aux clés SSH que Odysseus utilise pour administrer les machines distantes qu'il gère.
PoC disponible : oui, reproduction Docker Compose complète documentée par Manifold Security (environnement avec inscription libre activée, script d'enregistrement d'un compte non admin, exécution du contrôle négatif, puis du contournement en deux requêtes, avec confirmation d'exécution en tant qu'uid 1000).
Patch/mitigation. Corrigé par PR #5235 (commit 2826dcfc), fusionné le 5 juillet 2026. Le correctif lie la décision d'autorisation à la paire finale effective (task_type, action) de la tâche plutôt que aux champs présents dans chaque requête individuelle, revalide l'état persisté aux points de reprise, d'exécution manuelle, de déclenchement webhook et de répartition par le planificateur, et met en pause les tâches privilégiées préexistantes appartenant à des comptes non administrateurs plutôt que de les exécuter silencieusement. Le projet ne publie pas de tags de version formels : les correctifs de sécurité arrivent sur la branche par défaut avant la branche main curée, il faut donc vérifier la présence du commit 2826dcfc plutôt que se fier à un numéro de version.
CVE-2026-70619 | CVSS 8,8 | Odysseus, backend de configuration d'embedding, versions antérieures au commit bf325f6
Description technique. Les routes qui exposent la configuration du backend d'embedding vérifient la session authentifiée mais omettent le contrôle du rôle administrateur. Tout utilisateur authentifié non administrateur peut donc invoquer des opérations normalement réservées à l'administration du sous-système d'embedding, notamment la redirection de l'endpoint d'embedding utilisé par l'ensemble du serveur vers une URL arbitraire.
Conditions d'exploitation. Compte authentifié, sans privilège administrateur requis. L'exploitation redirige le trafic d'embedding serveur vers une destination contrôlée par l'attaquant, exposant en clair messages de chat, requêtes RAG, entrées de mémoire et texte de coffre traité par le pipeline d'embedding, ou provoque un déni de service en supprimant la configuration.
PoC disponible : détails techniques publiés par VulnCheck et SentinelOne dans leurs bases de vulnérabilités respectives, sans script d'exploitation public identifié à ce stade.
Patch/mitigation. Corrigé au commit bf325f6, intégré en version 1.0.2. Mettre à jour vers cette version ou une version ultérieure.
Diagramme de la chaîne d'attaque

Chaîne reconstruite à partir de l'analyse technique publiée par Manifold Security le 30 juillet 2026.
Analyse technique
Étape 1 : obtention d'un compte non privilégié
L'attaquant s'inscrit sur une instance Odysseus dont l'inscription libre est activée, ou dispose déjà d'un compte non administrateur sur une instance d'équipe. Ce compte n'a par défaut accès ni au shell, ni à l'exécution Python, ni à la lecture/écriture de fichiers, conformément au tableau de capacités documenté dans le THREAT_MODEL.md du projet.
Étape 2 : création d'une tâche planifiée "propre" avec action shell attachée
Le compte non privilégié envoie une requête POST /api/tasks déclarant un task_type bénin (research) tout en y attachant malgré tout un champ action réservé aux administrateurs (run_local) et une commande shell. La porte de création ne contrôle le statut administrateur que lorsque le task_type déclaré vaut "action" ; comme ce n'est pas le cas ici, le contrôle est court-circuité et le champ action est persisté tel quel en base de données.
Étape 3 : bascule du type de tâche sans re-déclaration de l'action
Une seconde requête, PUT /api/tasks/<id>, ne contient que {"task_type": "action"}. Le garde de la route de mise à jour ne se déclenche que si action est explicitement présent dans le corps de la requête ; absent ici, il reste inactif. Le task_type stocké bascule donc à "action" sans qu'aucun contrôle d'autorisation n'ait examiné la tâche dans son état final.
Étape 4 : déclenchement et exécution shell
Le compte déclenche la tâche via POST /api/tasks/<id>/run. Le répartiteur du planificateur ne consulte que le task_type stocké, désormais "action", et transmet la tâche au point d'exécution src/builtin_actions.py, qui appelle subprocess.run(script, shell=True). La commande s'exécute avec interprétation shell complète, confirmée par les chercheurs via une charge id; hostname; whoami dont les points-virgules ont été correctement interprétés par /bin/sh.
Étape 5 : accès aux secrets et persistance
Le shell obtenu tourne avec les privilèges du processus Odysseus et donne accès direct à la base de données (hashs de mots de passe, secrets TOTP), aux clés API des fournisseurs LLM configurées, et aux clés SSH utilisées par Odysseus pour administrer des machines distantes. Le mécanisme de tâches planifiées offre également un moyen de persistance natif à l'attaquant, sans dépôt de fichier supplémentaire sur le disque.
Indicateurs de compromission
Aucun indicateur réseau ou fichier publié : il s'agit d'une recherche de vulnérabilité en boîte blanche menée par des chercheurs en sécurité, sans exploitation confirmée en conditions réelles avant correctif. Manifold Security déclare explicitement l'absence de preuve d'exploitation avant la fusion du correctif.
| Type | Valeur |
|---|---|
| Commit vulnérable (limite supérieure) | Toute version antérieure au commit 2826dcfc (RCE) et bf325f6 (CVE-2026-70619) |
| Commit corrigé (RCE) | 2826dcfc, présent depuis 1.0.2 |
| Commit corrigé (CVE-2026-70619) | bf325f6, présent depuis 1.0.2 |
| Signature comportementale | Séquence API : POST /api/tasks (task_type=research, action=run_local) suivie de PUT /api/tasks/<id> (task_type=action seul) puis POST /api/tasks/<id>/run sur un compte non administrateur |
MITRE ATT&CK
Aucune cartographie officielle n'a été publiée par Manifold Security ni par le projet Odysseus. Le tableau suivant est une lecture technique construite à partir de la description de l'exploitation, pas une attribution vendeur.
| Tactique | Technique | ID | Justification |
|---|---|---|---|
| Initial Access | |||
| Valid Accounts | T1078 | Un compte non administrateur légitime (auto-inscription) sert de point d'entrée à l'ensemble de la chaîne | |
| Privilege Escalation | Abuse Elevation Control Mechanism | T1548 | Contournement du contrôle de rôle administrateur en fractionnant la requête privilégiée sur deux appels API distincts |
| Execution | Scheduled Task/Job | T1053.005 | Le mécanisme légitime de tâches planifiées d'Odysseus est détourné comme vecteur d'exécution |
| Execution | Unix Shell | T1059.004 | Exécution finale via subprocess.run(script, shell=True) avec interprétation shell complète |
| Credential Access | Unsecured Credentials | T1552.001 | Accès direct aux hashs de mots de passe, secrets TOTP et clés API stockés en base une fois le shell obtenu |
| Lateral Movement | Remote Services: SSH | T1021.004 | Les clés SSH gérées par Odysseus pour administrer des machines distantes deviennent accessibles depuis le shell obtenu |
Remédiation : checklist opérationnelle
- Mettre à jour toute instance Odysseus vers une version contenant le commit 2826dcfc (correctif RCE) et le commit bf325f6 ou ultérieur (CVE-2026-70619), en vérifiant le commit exact plutôt que le numéro de version affiché.
- Désactiver l'inscription libre sur toute instance Odysseus exposée publiquement tant que la mise à jour n'est pas confirmée ; une instance mono-utilisateur sans inscription tierce n'est pas exposée à cette classe de bug.
- Auditer les journaux d'API pour la séquence caractéristique : création d'une tâche non-action avec un champ action privilégié attaché, suivie d'une mise à jour ne portant que sur task_type.
- Faire tourner l'ensemble des secrets exposés à l'application (clés API des fournisseurs LLM, clés SSH utilisées pour l'administration distante) sur toute instance ayant été exposée à des comptes non administrateurs avant application du correctif.
- Appliquer une isolation par conteneur avec filtrage de sortie réseau et confinement du système de fichiers pour tout processus exécutant des outils shell/Python, le propre modèle de menace du projet listant explicitement l'absence de sandboxing comme limite connue.
- Revoir tout mécanisme d'autorisation multi-étapes similaire (planification différée, webhooks, tâches en plusieurs requêtes) pour s'assurer que la décision d'autorisation porte sur l'état final persisté et non sur les champs présents dans chaque requête individuelle.
- Pour les déploiements d'équipe, restreindre la création de comptes non administrateurs aux utilisateurs de confiance jusqu'à validation complète du correctif en environnement de test.
- Suivre l'avis GHSA-xwhc-f36c-v5vm pour l'attribution d'un identifiant CVE définitif à la faille RCE, actuellement référencée uniquement par son identifiant GitHub Security Advisory.
Sources
- Manifold Security, "Anyone with an account could run commands on PewDiePie's AI workspace (CVSS 9.9)", 30 juillet 2026
- The Hacker News, ThreatsDay, "Odysseus RCE, Samsung One-Click Takeover, iCloud Backdoor Fight + 27 More Stories"
- VulnCheck, "Odysseus Missing Admin Authorization via Embedding Endpoint Routes"
- SentinelOne Vulnerability Database, "CVE-2026-70619: Odysseus Auth Bypass Vulnerability"
- TheHackerWire, "Odysseus Missing Authorization: Remote Embedding Backend Takeover"
- cvefeed.io, "CVE-2026-70619 - Odysseus Missing Admin Authorization via Embedding Endpoint Routes"