
Lecture arbitraire de fichiers non authentifiée dans Flowise (< 2.2.4) via un parcours de chemin dans getFileFromStorage (storageUtils.ts). Causée par un chemin de fichier non assaini combiné à une affectation massive dans PUT /api/v1/document-store/store/:id. Permet un compromis total via la lecture de /root/.flowise/encryption.key. Distinct de CVE-2025-71338 (corrigé dans 2.2.4).
getFileFromStorage) — nouvelle CVE proposéeUne vulnérabilité distincte de la CVE-2025-71338 (qui est le sink d'écriture). Il s'agit d'une lecture non authentifiée de fichiers arbitraires dans le chemin « rehydrate » du loader document-store de Flowise, affectant les versions 1.7.1 à 2.2.3, corrigée dans 2.2.4. La lecture de /root/.flowise/encryption.key fournit la clé qui déchiffre tous les identifiants de fournisseurs stockés → compromission totale des identifiants.
| Fichier | Objectif |
|---|---|
report.md | La soumission de la nouvelle CVE : cause racine, chemin de vulnérabilité, CVSS, impact, versions concernées, solution, PoC, distinction par rapport aux CVE existantes |
poc.py | PoC auto-vérifiable (stdlib uniquement) — forge les loaders via une assignation de masse, déclenche la lecture rehydrate FILE-STORAGE::, affiche le contenu du fichier in-band |
docker/Dockerfile | Image de laboratoire paramétrée par version (FROM l'image réelle du fournisseur ; aucun overlay) |
setup.sh | Construit/démarre le laboratoire (FLOWISE_VERSION, défaut 2.1.0) ; classe les versions concernées vs corrigées |
evidence.txt | Vérification en direct : exfiltration de encryption.key à l'octet près sur 2.1.0 et 2.2.3 ; NON-EXPLOITABLE sur 2.2.4 |
# start an affected lab (default 2.1.0):
bash setup.sh
# exfiltrate the credential-decryption key (self-proving; no listener):
python3 poc.py http://127.0.0.1:3510 --read-path /root/.flowise/encryption.key
# ground truth:
docker exec <container> cat /root/.flowise/encryption.key
getFileFromStorage(file, ...paths) effectue path.join(getStoragePath(), ...paths, file) + fs.readFileSync avec file non assaini (état brut ≤ 2.2.3 ; _sanitizeFilename ajouté dans 2.2.4) ; file est fourni par l'attaquant via la valeur du loader FILE-STORAGE::, et l'entrée loaders[].files[] qui conditionne l'accès est forgée par l'assignation de masse PUT /store/:id (Object.assign(entity, req.body)).