Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-43637-cornac — Traversée de chemin (Tar Slip) dans Cornac via _extract_archive (CVE-2026-43637) | Kitploit
Outils/GitHubGitHub/rahulreddykarne/cve-2026-43637-cornac
Analyse des VulnérabilitésExploitationSécurité de la Chaîne LogistiqueApprentissage et ÉducationRed Teaming
GitHubrahulreddykarne/cve-2026-43637-cornac

CVE-2026-43637-cornac

Traversée de chemin (Tar Slip) dans Cornac via _extract_archive (CVE-2026-43637)

Voir le dépôt
25il y a 2 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-43637 : Traversée de chemin (Tar Slip) dans Cornac via _extract_archive

Sévérité : Élevée, CVSS 4.0 8.8, Critique, CVSS 3.1 9.1 (attribué par VulnCheck, la CNA)

Vecteur (v4.0) : CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N

Vecteur (v4.0) : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:H

Versions concernées : cornac < 2.6.0

Corrigé dans : 2.6.0

CWE : CWE-22 (Limitation incorrecte d'un nom de chemin à un répertoire restreint, 'Path Traversal')

Signalé par : Rahul Karne et Bharath Kumar Reddy Janumpally

CNA : VulnCheck

Publié : 15 juillet 2026


Résumé

Les chargeurs de jeux de données de Cornac téléchargent et décompressent automatiquement les archives, et le décompresseur faisait confiance à chaque chemin contenu dans l'archive.

Cornac est un framework d'apprentissage automatique pour les systèmes de recommandation. Ses chargeurs de jeux de données intégrés récupèrent des archives sur le réseau et les extraient sans aucune étape de confirmation. La routine d'extraction _extract_archive() de cornac/utils/download.py appelle archive.extractall() sans validation des chemins des membres. Une archive TAR dont les membres contiennent des séquences ../, des chemins absolus ou des entrées de type lien symbolique et lien physique écrit donc des fichiers à des emplacements arbitraires du système de fichiers, partout où le processus en cours peut écrire, entièrement en dehors du répertoire de cache prévu. Plusieurs chargeurs récupèrent les données via du HTTP non chiffré ; un attaquant positionné sur le réseau peut donc substituer une archive malveillante en transit et la faire extraire dès qu'un chargeur est appelé.

Impact

Écriture de fichier arbitraire avec chemin et contenu entièrement contrôlés par l'attaquant, limitée uniquement par les permissions du processus exécutant Cornac. Il s'agit d'une primitive d'écriture, et non de lecture, donc il n'y a pas de divulgation directe, mais l'écriture de fichier arbitraire est une voie bien établie vers l'exécution de code et le déni de service :

  • Exécution de code. L'écrasement d'un fichier .py dans site-packages, d'un fichier de démarrage de shell ou d'une entrée de tâche planifiée fait exécuter le code de l'attaquant lors de l'importation, du shell ou de la tâche suivants.
  • Déni de service. L'écrasement des modules ou de la configuration d'une application les remplace par le contenu de l'attaquant. Dans la preuve de concept vérifiée, un module cible est remplacé par un module qui lève une exception à l'importation, et l'application ne peut plus démarrer. La situation est permanente jusqu'à la restauration du fichier, et non un crash transitoire.
  • Altération de la configuration. Le remplacement d'un fichier de configuration peut rediriger une connexion de base de données, désactiver un contrôle d'authentification ou injecter des paramètres.

Qui est concerné : toute utilisation de cornac < 2.6.0 qui appelle un chargeur de jeu de données qui télécharge et extrait une archive que l'attaquant peut contrôler ou intercepter. Comme les chargeurs extraient automatiquement, aucune étape au-delà de l'appel ordinaire du chargeur n'est requise.

Qui n'est pas concerné :

  • Toute personne utilisant 2.6.0 ou une version ultérieure, où l'extraction valide chaque chemin de membre.
  • Le code qui n'invoque jamais un chargeur de jeu de données qui télécharge, ou qui n'extrait des archives que depuis une source entièrement fiable, à l'intégrité vérifiée, via un canal de confiance.
  • Les entrées ZIP ne sont pas exploitables via ce chemin (voir la note dans Détails techniques) ; le chemin TAR est celui qui est exploitable.

Portée

MétriqueValeurSource
Téléchargements, au total4.1Mpepy.tech/projects/cornac
Téléchargements, 30 derniers jours67.8Kpepy.tech
Utilisation typiqueRecherche et enseignement sur les systèmes de recommandation ; les chargeurs de jeux de données récupèrent automatiquement les données sur le réseau, certains en HTTP non chiffréinhérent au framework

Détails techniques

Cause racine

_extract_archive() de cornac/utils/download.py extrait les entrées ZIP et TAR via un chemin de code unique et, pour le cas TAR, appelle extractall() sans vérification des chemins :

# cornac/utils/download.py — _extract_archive(), lines 50-71 (v2.3.5)
def _extract_archive(file_path, extract_path="."):
    """Extracts an archive."""
    for archive_type in ["zip", "tar"]:
        if archive_type == "zip":
            open_fn = zipfile.ZipFile
            is_match_fn = zipfile.is_zipfile
        elif archive_type == "tar":
            open_fn = tarfile.open
            is_match_fn = tarfile.is_tarfile

        if is_match_fn(file_path):
            with open_fn(file_path) as archive:
                try:
                    archive.extractall(extract_path)   # <-- no member-path validation
                except (tarfile.TarError, RuntimeError, KeyboardInterrupt):
                    if os.path.exists(extract_path):
                        if os.path.isfile(extract_path):
                            os.remove(extract_path)
                        else:
                            shutil.rmtree(extract_path)
                    raise

Rien ne contraint les noms des membres ; un membre nommé ../../somewhere/file se résout donc en dehors de extract_path et y est écrit.

La chaîne d'appels est entièrement automatique à partir d'un appel de chargeur :

cornac.datasets.<name>.load_feedback()
    -> cornac.utils.download.cache()            # downloads via urllib.request.urlretrieve
        -> cornac.utils.download._extract_archive()
            -> tarfile.extractall()             # writes attacker-named paths

Pourquoi le chemin TAR en particulier

Le module zipfile de Python assainit les séquences ../ lors de l'extraction ; la branche ZIP de cette même fonction n'est donc pas exploitable sur Python moderne. Le module tarfile de Python n'assainit pas les chemins des membres (avant la 3.12, et uniquement avec un filtre explicite ensuite). Comme Cornac fait passer les deux formats par le même appel extractall(), la branche ZIP est sûre et la branche TAR est entièrement exploitable via les mêmes lignes. L'asymétrie est facile à manquer précisément parce que le code paraît uniforme entre les deux formats.

Distribution via le réseau

Cornac télécharge avec urllib.request.urlretrieve(), sans épinglage de certificat ni vérification de l'intégrité de l'archive, et plusieurs chargeurs intégrés utilisent des URL http://. Un attaquant positionné sur le réseau peut intercepter le téléchargement en HTTP non chiffré et renvoyer un TAR malveillant sans compromettre le serveur en amont ; c'est pourquoi le vecteur est distant et ne requiert aucune interaction de l'utilisateur au-delà de l'appel du chargeur.

Conditions d'exploitation

Un attaquant a besoin de :

  1. Une cible utilisant cornac < 2.6.0.
  2. Que la cible invoque un chargeur de jeu de données qui télécharge et extrait une archive.
  3. Contrôler le contenu de l'archive, soit en exploitant le serveur en amont auprès duquel le chargeur récupère les données, soit en interceptant un téléchargement en HTTP non chiffré en transit.

Aucun privilège sur la cible et aucune interaction de l'utilisateur au-delà de l'appel du chargeur ne sont requis.

Preuve de concept

Ce qui suit a été exécuté contre le paquet réel, non modifié, en appelant directement la fonction _extract_archive de Cornac.

Version vulnérable (2.3.5). Un TAR contenant un membre ../../ est extrait dans un répertoire de cache ; le membre atterrit en dehors de ce répertoire et écrase un fichier appartenant à une application distincte :

import cornac.utils.download as d
import io, os, tarfile, tempfile
Télécharger l’outil