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é.

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

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-65320-fastcore — Documente CVE-2026-65320, une traversée de chemin de type tar-slip dans untar_dir() de fastcore, avec une preuve de concept inoffensive démontrant l'écriture arbitraire de fichiers et l'exécution de code. | Kitploit
Outils/GitHubGitHub/rahulreddykarne/cve-2026-65320-fastcore
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebArticles et RechercheApprentissage et Éducation
GitHubrahulreddykarne/cve-2026-65320-fastcore

CVE-2026-65320-fastcore

Documente CVE-2026-65320, une traversée de chemin de type tar-slip dans untar_dir() de fastcore, avec une preuve de concept inoffensive démontrant l'écriture arbitraire de fichiers et l'exécution de code.

Voir le dépôt
il y a 1 jourPas 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-65320 : Path Traversal (Tar Slip) dans fastcore via untar_dir()

Sévérité : Critique, CVSS 3.1 9.8

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

Affecté : fastcore <= 2.2.30

Corrigé dans : Non corrigé au moment de la rédaction

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

Composant : fastcore.xtras.untar_dir() → fastcore.xtras._unpack() → shutil.unpack_archive()

Runtime à haut risque : Python < 3.14 (Python 3.14 fait du filtre tar data sûr le comportement par défaut)

Signalé par : Rahul Karne

CNA : VulnCheck


Résumé

fastcore.xtras.untar_dir(fname, dest) est un utilitaire documenté qui extrait une archive « dans dest ».

En interne, il transmet l'archive à shutil.unpack_archive() de la bibliothèque standard sans filtre d'extraction, sans validation des chemins des membres de l'archive et sans aucune vérification de confinement après extraction.

Par conséquent, une archive TAR dont les membres contiennent des séquences de traversée ../ ou des chemins absolus peut écrire des fichiers en dehors du répertoire dans lequel l'appelant a demandé à fastcore d'extraire.

Un appelant qui s'attend raisonnablement à ce que untar_dir(fname, dest) confine tout à dest obtient à la place une écriture de fichier arbitraire partout où le processus peut écrire.


Impact

Écriture de fichier arbitraire sous l'autorité du processus appelant untar_dir().

Selon ce qui est écrasé, cela peut entraîner :

  • Exécution de code — écraser un fichier Python que l'application importe ultérieurement, tel qu'un plugin, un hook de démarrage ou un module importable, ou déposer un fichier dans un emplacement chargé automatiquement.
  • Falsification de données / configuration — écraser des fichiers de configuration, des identifiants ou des données applicatives.
  • Déni de service — corrompre des fichiers dont le service dépend.

La preuve de concept démontre la chaîne complète écriture → import → exécution de code de bout en bout, entièrement à l'intérieur d'un répertoire de démonstration inoffensif.


Portée

fastcore est une dépendance fondamentale dans tout l'écosystème fast.ai, notamment :

  • fastai
  • nbdev
  • ghapi
  • D'autres paquets associés

Il reçoit des dizaines de millions de téléchargements par mois.

untar_dir() est la primitive d'extraction derrière le flux de travail courant « télécharger une archive, puis la décompresser », qui suit le même schéma général que untar_data de fastai.

Tout chemin de code qui fournit à untar_dir() une archive dont le contenu n'est pas entièrement fiable est exposé.


Détail technique

Le code vulnérable se trouve dans fastcore/xtras.py :

root@kitploit:~
def _unpack(fname, out):
    import shutil
    shutil.unpack_archive(str(fname), str(out))   # <-- no filter, no validation
    ls = out.ls()
    return ls[0] if len(ls) == 1 else out


def untar_dir(fname, dest, rename=False, overwrite=False, uid=-1, gid=-1):
    "untar `file` into `dest` ..."
    import tempfile, shutil
    dest = Path(dest)

    with tempfile.TemporaryDirectory() as d:
        out = Path(d) / remove_suffix(Path(fname).stem, '.tar')
        out.mkdir()

        ...

        src = _unpack(fname, out)      # extraction escapes `out` here

        ...

        shutil.move(str(src), dest)

        ...

        return dest

untar_dir() crée un répertoire d'extraction temporaire interne :

root@kitploit:~
<tempdir>/<random>/<archive-stem>/

Il appelle ensuite _unpack(), qui transmet directement l'archive à :

root@kitploit:~
shutil.unpack_archive()

Pour les archives TAR, cela appelle finalement tarfile.extractall().

Sur Python < 3.14, le comportement d'extraction par défaut est fully_trusted, ce qui signifie que les membres de traversée peuvent être honorés.

Par exemple, un membre d'archive tel que :

root@kitploit:~
../../../some/other/dir/file

est écrit relativement au répertoire d'extraction et peut donc s'en échapper.

Rien dans fastcore :

  • Ne passe filter="data" là où c'est pris en charge.
  • Ne rejette les chemins absolus.
  • Ne rejette les chemins avec lettre de lecteur.
  • Ne rejette les chemins UNC.
  • Ne rejette les composants de chemin ...
  • Ne rejette les membres symlink ou hardlink.
  • Ne vérifie que chaque chemin extrait est resté sous la racine d'extraction prévue avant de retourner un succès.

Cause racine

untar_dir() traite shutil.unpack_archive() comme s'il s'agissait d'un extracteur d'archive sûr et isolé.

Ce n'est pas le cas.

La documentation de la bibliothèque standard de Python avertit que l'extraction d'archives non fiables peut créer des fichiers en dehors de la destination demandée et recommande un filtrage d'extraction sûr pour les archives TAR.

fastcore ne passe ni filtre d'extraction approprié ni n'implémente de garde de confinement équivalente pour les versions de Python qu'il prend en charge.

Il n'avertit pas non plus les appelants de untar_dir() de ce comportement sensible à la sécurité.


Pourquoi spécifiquement le chemin TAR

Les membres TAR peuvent contenir des chaînes de chemin arbitraires.

Sur les versions de Python affectées, tarfile.extractall() ne neutralise pas automatiquement les séquences de traversée .. par défaut.

Écrire un membre de traversée relativement au répertoire d'extraction temporaire de fastcore est donc suffisant pour s'échapper de ce répertoire et écrire partout où le processus a la permission d'écrire.

Une primitive fiable est la traversée relative telle que :

root@kitploit:~
../../../target/file

C'est la technique utilisée par la preuve de concept.


Livraison via le réseau

L'entrée dangereuse est le contenu de l'archive, et non le chemin de destination choisi par le développeur.

Les archives sont fréquemment obtenues depuis des emplacements externes ou semi-fiables, notamment :

  • Lots de modèles
  • Archives de jeux de données
  • Lots de plugins
  • Artefacts CI/CD
  • Téléversements d'utilisateurs
  • Téléversements de partenaires
  • Téléchargements HTTP distants

Tout service ou outil qui télécharge une archive depuis une source non fiable ou semi-fiable et la traite ensuite à l'aide de untar_dir() peut donc être atteignable.

Le PoC inclut également une variante qui sert l'archive forgée depuis un point de terminaison HTTP contrôlé par l'attaquant pour démontrer ce chemin de livraison.


Préconditions d'exploitation

Une exploitation réussie nécessite :

  1. Que l'application appelle fastcore.xtras.untar_dir() sur une archive dont le contenu est influencé par l'attaquant, telle qu'une archive téléversée, téléchargée ou autrement non fiable.

  2. Que le runtime utilise Python < 3.14, ou une autre configuration où un filtre d'extraction TAR sûr n'est pas appliqué.

  3. Pour l'escalade d'une écriture de fichier arbitraire vers une exécution de code, que le processus importe ou charge ultérieurement un fichier depuis un emplacement atteignable par la traversée, tel que :

    • Un répertoire de plugins
    • Un module Python importable
    • Un hook de démarrage
    • Un autre emplacement de fichier chargé automatiquement

L'écriture de fichier arbitraire et la modification de configuration/données ne nécessitent que les conditions 1 et 2.


Preuve de concept

poc_fastcore_cna_demo.py invoque l'API réelle fastcore.xtras.untar_dir().

La démonstration est intentionnellement inoffensive.

Chaque fichier créé par le PoC reste à l'intérieur d'un unique répertoire de démonstration spécifié à l'aide de :

root@kitploit:~
--demo-root

Le PoC ne modifie pas de fichiers système réels et n'accède pas à des services cloud ni à des identifiants.

Ce que fait le PoC

  1. Affiche les détails de l'environnement et le code source vulnérable pour _unpack() et untar_dir().

  2. Crée une disposition de démonstration contenant :

    • Une racine d'extraction prévue
    • Un répertoire d'application séparé :
      root@kitploit:~
      service_app/plugins/
      
  3. Crée :

root@kitploit:~
attacker_supplied_upload.tar

contenant des membres d'archive conçus pour pointer en dehors de la racine d'extraction prévue, notamment des membres de traversée et :

root@kitploit:~
service_app/plugins/startup_hook.py
  1. Appelle un gestionnaire de téléversement simulé :
root@kitploit:~
def auto_extract_uploaded_archive(received_archive):
    return untar_dir(
        received_archive,
        intended_root,
        overwrite=True
    )
  1. Vérifie que des fichiers ont été écrits en dehors du répertoire d'extraction prévu.

  2. Simule un rechargement du service en important le fichier écrit par l'archive :

root@kitploit:~
startup_hook.py

Le hook de démarrage inoffensif crée :

root@kitploit:~
SERVICE_RELOAD_MARKER

Cela démontre la chaîne complète :

root@kitploit:~
Attacker-controlled archive
        ↓
Path traversal during extraction
        ↓
Arbitrary file write
        ↓
Write into importable / auto-loaded location
        ↓
Application loads attacker-controlled file
        ↓
Code execution

Configuration

Installez le paquet affecté :

root@kitploit:~
pip install fastcore

Le problème a été confirmé avec :

root@kitploit:~
fastcore 2.2.30

La démonstration peut s'exécuter contre :

  • Une copie de fastcore installée via pip
  • Une arborescence source extraite localement sélectionnée à l'aide de --source

Toutes les écritures du PoC restent à l'intérieur du répertoire spécifié via --demo-root.


Exécution

Nettoyez toute sortie précédente du PoC :

root@kitploit:~
python poc_fastcore_cna_demo.py --demo-root ./poc_fastcore --clean

Lancez la démonstration :

root@kitploit:~
python poc_fastcore_cna_demo.py \
  --demo-root ./poc_fastcore \
  --source latest \
  --no-pause

Sortie attendue

Exemple de sortie abrégée :

root@kitploit:~
fastcore version:  2.2.30

Outside marker exists after extraction? True
Is outside marker inside intended extraction root? False

Relative traversal marker exists after extraction? True
Is relative traversal marker inside intended extraction root? False

Service plugin file exists after extraction? True
Service reload marker exists? True

POC WORKED: fastcore extracted attacker-controlled tar members outside the intended root.

Remédiation

Pour les mainteneurs de fastcore

1. Utiliser un filtrage d'extraction TAR sûr

Sur les versions de Python prises en charge, utilisez un filtre d'extraction sûr tel que :

root@kitploit:~
filter="data"

avec shutil.unpack_archive() ou l'opération d'extraction tarfile correspondante.


2. Valider les membres de l'archive avant extraction

Chaque membre de l'archive doit être vérifié avant extraction.

Rejetez :

  • Les chemins absolus
  • Les chemins Windows avec lettre de lecteur
  • Les chemins UNC
  • Les chemins contenant ..
  • Les liens symboliques non sûrs
  • Les liens physiques non sûrs

Les cibles des liens doivent également être résolues et validées avant extraction.


3. Appliquer le confinement de l'extraction

Résolvez chaque chemin de destination avant écriture et vérifiez qu'il reste sous la racine d'extraction prévue.

Conceptuellement :

root@kitploit:~
resolved_member_path
        ↓
must remain inside
        ↓
resolved_extraction_root

L'extraction doit échouer si la destination résolue s'échappe de la racine d'extraction.


4. Ajouter des tests de non-régression

Les tests de non-régression doivent couvrir au minimum :

root@kitploit:~
../ traversal
absolute paths
Windows drive-letter paths
UNC paths
symbolic links
hard links

5. Documenter les attentes de sécurité

Documentez clairement si untar_dir() est destiné à traiter en toute sécurité des archives non fiables.

Si une extraction non sûre est intentionnellement prise en charge, le comportement sécurisé doit tout de même être le comportement par défaut.

Le comportement non sûr doit nécessiter une adhésion explicite plutôt que de faire silencieusement confiance au contenu de l'archive.


Conseils temporaires pour les utilisateurs

Jusqu'à la publication d'un correctif au niveau du paquet :

  • Préférez Python 3.14+ lorsque c'est applicable.
  • Ne passez pas directement d'archives non fiables à untar_dir().
  • Validez tous les membres de l'archive avant extraction.
  • Assurez-vous que les chemins extraits ne peuvent pas s'échapper du répertoire de destination prévu.
  • Traitez les archives téléchargées à distance ou fournies par l'utilisateur comme des entrées contrôlées par l'attaquant.

Considérations CVSS

Le défaut technique sous-jacent est une vulnérabilité d'écriture de fichier arbitraire causée par une traversée de chemin dans l'archive.

Cependant, la sévérité finale dépend de l'environnement de déploiement et de la manière dont untar_dir() est exposé.

Scénario de service exposé au réseau

Un vecteur représentatif peut approcher :

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Résultat :

root@kitploit:~
9.8 — Critical

Scénario développeur / CLI

Si l'exploitation nécessite plutôt qu'un développeur télécharge et extraie manuellement une archive, l'interaction utilisateur et la complexité d'attaque peuvent être plus élevées.

Le score CVSS résultant serait donc sensiblement plus faible.


Mises en garde

Deux facteurs importants doivent être pris en compte lors de l'évaluation du problème.

Classe de vulnérabilité existante

Il s'agit d'une instance de la classe de vulnérabilité d'extraction TAR non sûre connue de longue date, associée à :

root@kitploit:~
CVE-2007-4559

Les versions modernes de Python ont introduit un comportement d'extraction d'archive plus sûr.

Python 3.14 fait du filtre d'extraction sûr data le comportement par défaut.

Par conséquent, l'environnement principalement affecté est Python < 3.14.

Cependant, ces runtimes restent largement déployés.

Exigence d'archive non fiable

La vulnérabilité devient exploitable lorsqu'un appelant fournit à untar_dir() une archive dont le contenu est contrôlé par l'attaquant ou autrement non fiable.

Ce rapport traite donc le contenu de l'archive comme la frontière de sécurité non fiable.

Un utilitaire robuste d'extraction d'archive devrait échouer de manière sûre quelle que soit la manière dont l'archive a été obtenue.


Chronologie de divulgation

Remplacez les dates fictives ci-dessous par les dates réelles de divulgation.

  • YYYY-MM-DD — Vulnérabilité signalée aux mainteneurs.
  • YYYY-MM-DD — Réponse du fournisseur / accusé de réception / absence de réponse.
  • 2026-09-26 — Confirmé toujours non corrigé dans la dernière version (2.2.30) ; le code d'extraction est resté inchangé.

Crédit

Découvert et signalé par Rahul Karne.


Références

  • Documentation de untar_dir() de fastcore
    https://fastcore.fast.ai/xtras.html

  • Source de xtras.py de fastcore
    https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/xtras.py

  • fastcore sur PyPI
    https://pypi.org/project/fastcore/

  • Documentation de shutil.unpack_archive() de Python
    https://docs.python.org/3/library/shutil.html#shutil.unpack_archive

  • Filtres d'extraction tarfile de Python
    https://docs.python.org/3/library/tarfile.html#extraction-filters

  • PEP 706 — Filtre pour tarfile.extractall
    https://peps.python.org/pep-0706/

  • CWE-22 — Limitation incorrecte d'un nom de chemin à un répertoire restreint
    https://cwe.mitre.org/data/definitions/22.html

  • CVE-2007-4559 — Classe de vulnérabilité d'extraction TAR non sûre
    https://nvd.nist.gov/vuln/detail/CVE-2007-4559


À propos

Ce dépôt documente une découverte de sécurité en divulgation coordonnée et fournit une preuve de concept inoffensive et autonome.

Le PoC n'écrit qu'à l'intérieur du répertoire --demo-root spécifié par l'utilisateur et n'effectue aucune action destructive.

Toute fonctionnalité réseau incluse dans la démonstration se limite à une démonstration locale optionnelle.

Ce matériel est fourni à des fins de recherche en sécurité défensive et d'éducation.


Presse

Demandes des médias : [email protected]. PoC complet (serveur attaquant, archive de traversée, application victime) et détails techniques supplémentaires disponibles sur demande.

Télécharger l’outil