Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/a1ohadance/cve-2026-38360
Analyse des VulnérabilitésAnalyse de CodeExploitationSécurité WebTests d'IntrusionApprentissage et Éducation
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

Advisory : CVE-2026-38360 traversée de chemin (CWE-22) dans dash-uploader (Python/PyPI)

Voir le dépôt
23il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-38360: Path Traversal dans dash-uploader

CVE NVD CWE Severity Patch Auth Version PyPI Downloads

Total Downloads
License

Traversée de chemin non authentifiée dans fohrloop/dash-uploader (Python, PyPI) permettant l'écriture arbitraire de fichiers, conduisant à (sans s'y limiter) l'exécution de code à distance (RCE), l'écrasement du code source de l'application, le XSS stocké et l'installation de portes dérobées persistantes.

⚠️ Aucun correctif n'est disponible et aucun ne sera jamais publié

Le dépôt a été archivé le 19 juillet 2025 sans mainteneur actif. Toutes les versions publiées (0.1.0 à 0.7.0a2) sont affectées et le resteront. Le package totalise encore environ 28 000 téléchargements mensuels.

Quiconque exécute dash-uploader en production doit appliquer lui-même une mesure d'atténuation. La correction recommandée est de migrer vers le composant dcc.Upload intégré de Plotly Dash. Voir Atténuation pour toutes les options.

CVE IDCVE-2026-38360 (NVD)
VulnérabilitéPath Traversal (CWE-22)
CVSS 3.19,8 / Critique (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Produitdash-uploader
Versions affectées0.1.0 à 0.7.0a2 (toutes les 18 versions)
Version corrigéeaucune (projet archivé le 19 juillet 2025)
Vecteur d'attaquedistant, non authentifié
DécouvreurMuhammad Fitri Bin Mohd Sultan
Assigné parMITRE, 7 mai 2026
LiéCVE-2026-38361 (DoS dans la même bibliothèque)

Description

Trois paramètres contrôlés par l'utilisateur provenant de request.form.get() dans dash_uploader/httprequesthandler.py sont passés directement à os.path.join() et os.makedirs() sans aucune désinfection ni validation :

  1. upload_id (ligne 57 → ligne 161, BaseHttpRequestHandler.get_temp_root) : contrôle le répertoire de destination. Un attaquant peut envoyer upload_id=../../../../usr/local/lib/python3.10/site-packages et les fichiers sont écrits dans le répertoire des packages Python.

  2. resumableFilename (ligne 51 → ligne 108, BaseHttpRequestHandler._post) : contrôle le nom de fichier final. Un attaquant peut sortir du répertoire de téléchargement via le nom de fichier même avec un upload_id légitime.

  3. resumableIdentifier (ligne 54 → ligne 64, BaseHttpRequestHandler._post) : utilisé avec os.makedirs() pour créer le répertoire temporaire. Un attaquant peut créer des répertoires arbitraires n'importe où sur le système de fichiers.

Le point de terminaison de téléchargement (/API/dash-uploader par défaut) ne nécessite aucune authentification. Le hook http_request_handler ajouté dans v0.5.0 permet des vérifications pré-requête via post_before(), mais la méthode vulnérable _post() lit tous les paramètres directement depuis request.form après le retour du hook. Le hook ne peut pas nettoyer les paramètres avant que la bibliothèque ne les traite. Un développeur qui ajoute l'authentification via le hook reste vulnérable au path traversal de la part d'un utilisateur authentifié.

Code vulnérable

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

Trois puits d'attaque par traversée indépendants partagent la même cause racine : les valeurs du formulaire atteignent os.path.join et os.makedirs sans validation.

Vecteurs d'attaque

Un attaquant distant non authentifié envoie une requête HTTP POST multipart au point de terminaison de téléchargement. En injectant des séquences de traversée de chemin (../) dans le paramètre de formulaire upload_id, l'attaquant contrôle le répertoire de destination du fichier téléchargé. Par exemple, upload_id=../../../../usr/local/lib/python3.10/site-packages écrit des fichiers dans le répertoire de packages de Python, permettant une RCE au prochain démarrage de l'interpréteur via l'auto-exécution de .pth.

Aucun jeton d'authentification, de session ou CSRF n'est requis. Deux paramètres supplémentaires (resumableFilename et resumableIdentifier) fournissent des vecteurs de traversée indépendants via le même point de terminaison. La configuration par défaut de la bibliothèque, telle que présentée dans la documentation officielle de démarrage rapide, est exploitable avec une seule commande curl.

Impact

Écriture arbitraire de fichiers dans tout répertoire accessible en écriture par le processus serveur. Cela se traduit par l'exécution de code à distance (RCE) via plusieurs primitives bien connues :

Primitives RCE

  • Fichier .pth Python déposé dans site-packages. Exécute le code fourni par l'attaquant au prochain démarrage de l'interpréteur.
  • Injection sitecustomize.py ou usercustomize.py. S'exécute à chaque démarrage de Python.
  • Écrasement d'un module Python importable dans le répertoire de l'application. S'exécute à la prochaine importation ou au recyclage du worker.
  • Écrasement du point d'entrée WSGI/ASGI (par exemple app.wsgi, wsgi.py). S'exécute au prochain rechargement du worker.
  • Dépôt dans cron (/etc/cron.d/, /etc/cron.hourly/, spool crontab utilisateur) lorsque le processus dispose des privilèges nécessaires. Exécution planifiée.
  • Dépôt d'unité systemd ou unité utilisateur (/etc/systemd/system/, ~/.config/systemd/user/). S'exécute au prochain démarrage du service ou au redémarrage.
  • Injection /etc/ld.so.preload lorsque le processus s'exécute en tant que root. Précharge le code de l'attaquant dans chaque exécution binaire ultérieure.
  • Écrasement de fichier de démarrage du shell (~/.bashrc, ~/.profile, ~/.bash_profile). S'exécute à la prochaine connexion interactive de l'utilisateur de l'application.
  • Ajout dans ~/.ssh/authorized_keys. Accorde un accès SSH persistant à l'hôte en tant qu'utilisateur de l'application.

Impact sur la couche web

  • Cross-site scripting stocké sur le domaine hôte en écrasant le JavaScript fourni (par exemple, le framework Dash JS dans site-packages), affectant chaque utilisateur à chaque chargement de page jusqu'au redémarrage de l'application.
  • Écrasement du code source de l'application (une porte dérobée silencieuse et persistante qui survit aux déploiements normaux lorsque le mécanisme de déploiement n'écrase pas complètement les chemins affectés).

Impact sur le système de fichiers

  • Création de répertoires arbitraires partout où le processus peut accéder, via os.makedirs() avec le paramètre non nettoyé resumableIdentifier (utilisable pour l'épuisement des inodes ou pour préparer des écritures dans des arborescences de répertoires inexistantes).
  • Remplacement de fichiers entre utilisateurs dans les répertoires de téléchargement partagés, conduisant à l'empoisonnement des données entre les locataires d'une même application.

Composant affecté

  • dash_uploader/httprequesthandler.py
  • BaseHttpRequestHandler.get_temp_root()
  • BaseHttpRequestHandler._post()

Atténuation

⚠️ Aucun correctif n'est disponible et le projet est archivé

Options pour les utilisateurs actuellement déployés, par ordre de préférence :

  1. Migrer vers dcc.Upload, le composant de téléchargement officiel fourni avec Plotly Dash. Les fichiers arrivent au callback sous forme de chaîne base64 ; aucun gestionnaire d'écriture sur le système de fichiers n'est exposé et aucun chemin de destination contrôlé par le client n'existe, donc la classe de bug ici ne s'applique pas. Idéal pour les fichiers petits et moyens. Pour les très gros téléchargements, voir point 2.
  2. Créer un petit gestionnaire de téléchargement Flask en utilisant werkzeug.utils.secure_filename() et un répertoire de destination côté serveur codé en dur. N'acceptez jamais les valeurs upload_id, nom de fichier ou identifiant fournies par le client comme composants de chemin.
  3. Si vous continuez à utiliser dash-uploader, placez le point de terminaison de téléchargement derrière une authentification ET validez upload_id, resumableFilename et resumableIdentifier par rapport à une liste blanche stricte (par exemple, UUID uniquement) à une couche qui réécrit ou rejette la requête avant que le gestionnaire de la bibliothèque ne la voie. Le hook http_request_handler de la bibliothèque n'EMPÊCHE PAS la traversée car les paramètres sont lus depuis request.form après le retour du hook ; la désinfection doit avoir lieu au-dessus de la bibliothèque.
  4. Au niveau du proxy inverse ou du WAF, rejetez toute requête vers le point de terminaison de téléchargement où un champ de formulaire contient .., des variantes encodées (%2e%2e, ..%2f, %2e%2e%2f), ou des chemins absolus.

Calendrier de divulgation

DateÉvénement
2026-03-17Vulnérabilité découverte lors de recherches en sécurité sur un déploiement de production.
2026-03-19Demande de CVE soumise à MITRE.
2026-05-07CVE-2026-38360 assigné par MITRE.
2026-05-07Avis public publié.
2026-05-09Enregistrement CVE publié sur la base de données CVE de MITRE et le NVD.

Contexte du package

  • Environ 28 000 téléchargements mensuels sur PyPI (27 756 dans les 30 jours précédant le 7 mai 2026, avec un volume quotidien soutenu malgré l'archivage du dépôt). Source : pypistats.org.
  • Dernière version publiée : 0.6.1 (ligne stable). Les pré-versions vont jusqu'à 0.7.0a2.
  • Dépendance requise : dash. Dépendance optionnelle : pyyaml. Licence : MIT.
  • 11 packages dépendants, 6 dépôts dépendants.
  • 153 étoiles GitHub.
  • Dépôt archivé le 19 juillet 2025 (Issue #153).
  • Aucun CVE antérieur (vérifié sur NVD, GitHub Advisory Database, Snyk, OSV le 19 mars 2026).

Références

  • https://www.cve.org/CVERecord?id=CVE-2026-38360
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38360
  • https://github.com/fohrloop/dash-uploader
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/blob/dev/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://cwe.mitre.org/data/definitions/22.html

Découvreur

Muhammad Fitri Bin Mohd Sultan

Télécharger l’outil