Aller au contenu

CVE-2025-58434 : Prise de contrôle complète non authentifiée FlowiseAI

La CVE-2025-58434 expose un défaut fondamental dans la gestion sécurisée des jetons au sein de FlowiseAI. Cette vulnérabilité permet à un attaquant distant et non authentifié de modifier le mot de passe de n’importe quel compte utilisateur, conduisant à une prise de contrôle totale du compte (Account Takeover - ATO).

La faille provient de la décision du serveur d’inclure le tempToken secret dans le corps de la réponse API. Dans une implémentation sécurisée, ce jeton devrait être transmis exclusivement via un canal hors-bande sécurisé, tel qu’un email vérifié. En contournant le besoin d’accéder à la boîte mail, un attaquant peut automatiser la prise de contrôle de tous les utilisateurs d’une instance.

Cette vulnérabilité est un exemple typique d’Exposition Directe d’Objet Insécurisée (Insecure Direct Object Exposure) et de divulgation d’informations. La logique de réinitialisation du mot de passe est fondamentalement compromise par l’exposition du jeton secret.

L’exploitation suit un chemin linéaire et prévisible via l’API : Requête non authentifiée/api/v1/account/forgot-passwordRecherche Utilisateur par EmailGénération du JetonRéponse API.

À l’étape finale, le backend inclut le tempToken dans la réponse JSON. Cela permet à l’attaquant d’obtenir l’identifiant nécessaire pour autoriser un changement de mot de passe sans jamais posséder les accès email de la victime.

L’attaque utilise deux endpoints spécifiques en chaîne :

  1. Fuite du Jeton : /api/v1/account/forgot-password — Cet endpoint accepte un email et retourne le jeton secret.
  2. Modification des Identifiants : /api/v1/account/reset-password — Cet endpoint accepte le jeton volé et un nouveau mot de passe pour finaliser la prise de contrôle.

L’exploit est mécanique et ne nécessite aucune interaction de l’utilisateur.

  1. Extraction du Jeton : l’attaquant envoie une requête POST à l’endpoint forgot-password avec l’email de la cible. curl -i -X POST https://<target>/api/v1/account/forgot-password -H "Content-Type: application/json" -d '{"user":{"email":"victim@example.com"}}'
  2. Identification du Jeton : l’attaquant analyse la réponse JSON pour extraire la valeur du tempToken.
  3. Détournement du Compte : l’attaquant soumet une requête POST à l’endpoint reset-password, combinant l’email de la victime, le jeton extrait et un nouveau mot de passe. curl -i -X POST https://<target>/api/v1/account/reset-password -H "Content-Type: application/json" -d '{"user":{"email":"victim@example.com", "tempToken":"<extracted-token>", "password":"AttackerPassword123!"}}'
  4. Vérification : l’attaquant se connecte avec le nouveau mot de passe et obtient le contrôle total du compte.

La détection de cette attaque repose sur l’analyse des schémas de trafic API, car l’exploit n’utilise ni malware ni payloads complexes.

Les analystes doivent rechercher les empreintes comportementales suivantes dans les logs du serveur web :

  • Séquençage : une requête POST vers /api/v1/account/forgot-password immédiatement suivie d’un POST vers /api/v1/account/reset-password provenant de la même adresse IP source.
  • Codes de Réponse : une réponse 201 Created pour l’endpoint forgot-password, indicateur principal d’une fuite de jeton réussie.
  • Timing : des intervalles extrêmement courts entre la demande de jeton et le changement de mot de passe, ce qui est atypique pour un utilisateur humain vérifiant ses emails.

Un compromis peut être confirmé en inspectant la base de données utilisateur :

  • Mise à jour des Identifiants : un changement inattendu du hash de mot de passe (colonne credential) pour un utilisateur.
  • Cycle de vie du Jeton : preuve d’un tempToken généré puis immédiatement marqué comme utilisé ou expiré en quelques secondes.

La règle suivante détecte la phase initiale de la tentative de prise de contrôle.

title: FlowiseAI Unauthenticated Account Takeover Attempt
id: 2025-58434-flowise-ato
description: Detects potential account takeover attempts via the CVE-2025-58434 password reset flaw.
logsource:
category: http_server
detection:
selection:
url|contains: '/api/v1/account/forgot-password'
method: 'POST'
condition: selection
level: high

Pour identifier des attaquants scannant plusieurs comptes : index=web_logs method="POST" uri="/api/v1/account/forgot-password" | stats count by src_ip, uri_path Cibler les IP sources qui sollicitent cet endpoint plusieurs fois pour des emails différents dans un court intervalle.

La mise à jour immédiate de FlowiseAI vers la dernière version est mandatory.

Correction API

S’assurer que le jeton de réinitialisation n’est JAMAIS retourné dans le corps de la réponse API et qu’il est uniquement envoyé via un email sécurisé.

Limitation de débit

Implémenter un rate limiting strict sur l’endpoint /forgot-password pour empêcher l’énumération massive de jetons.

Monitoring

Alerter sur les transitions rapides entre une demande de réinitialisation et une mise à jour du mot de passe provenant de la même IP.