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-2025-66249-POC — Une preuve de concept pour la vulnérabilité de contournement de la liste blanche de traversée de chemin d'Apache Livy | Kitploit
Outils/GitHubGitHub/sid6224/cve-2025-66249-poc
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubsid6224/cve-2025-66249-poc

CVE-2025-66249-POC

Une preuve de concept pour la vulnérabilité de contournement de la liste blanche de traversée de chemin d'Apache Livy

Voir le dépôt
2il y a 6 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-2025-66249 — Contournement de la liste blanche de traversal de chemin Apache Livy

CVE Livy Severity CWE Type License Platform Language

À des fins éducatives et de recherche en sécurité uniquement. Ne pas utiliser contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite. → Clause de non-responsabilité complète


Aperçu

ChampDétail
ID CVECVE-2025-66249
SévéritéImportant (CVSS N/A — évaluation NVD en attente au 15/03/2026)
AffectéApache Livy 0.3.0-incubating jusqu'à 0.8.0-incubating — uniquement lorsque livy.file.local-dir-whitelist est défini sur une valeur non par défaut
Corrigé dansApache Livy 0.9.0-incubating
CWECWE-22 : Limitation incorrecte d'un chemin d'accès à un répertoire restreint ('Traversal de chemin')
Divulgué2026-03-12 (OSS-Sec) / 2026-03-13 (NVD)
RapporteurHiroki Egawa (découvreur)

Description de la vulnérabilité

Un utilisateur authentifié ayant accès à l'interface REST ou JDBC de Livy peut soumettre une session Spark ou un job batch avec une valeur de configuration de chemin de fichier conçue pour échapper à la liste blanche des répertoires autorisés.

Cause racine — Contournement du traversal de chemin dans le contrôle de la liste blanche (Session.scala)

Lorsque livy.file.local-dir-whitelist est configuré, Livy 0.8.0 valide les chemins soumis en appelant String.startsWith() de Java sur le chemin brut, non normalisé. Ce contrôle peut être contourné en utilisant des séquences de traversal ../ :

/opt/safe-data/../sensitive/secret.txt

La chaîne brute commence par /opt/safe-data, donc le contrôle passe — mais le chemin se résout en /opt/sensitive/secret.txt, qui est totalement en dehors du répertoire autorisé.

Condition de déclenchement : La vulnérabilité ne peut être exploitée que lorsque livy.file.local-dir-whitelist est défini sur une valeur non par défaut (non vide). Si la liste blanche est vide (par défaut), la validation de chemin est totalement ignorée et le problème n'est pas actif.

Impact : Un attaquant qui soumet une session via l'API REST de Livy peut référencer des fichiers locaux arbitraires sur le serveur Livy hôte. Dans un cluster d'analyse partagé, cela se traduit par une exposition potentielle des identifiants, clés, fichiers de configuration, ou toute donnée lisible par l'utilisateur du processus Livy.


Fichiers source affectés

Fichier — Session.scala

Vulnérable (v0.8.0) : https://github.com/apache/incubator-livy/blob/v0.8.0-incubating/server/src/main/scala/org/apache/livy/sessions/Session.scala

Corrigé (v0.9.0) : https://github.com/apache/incubator-livy/blob/v0.9.0-incubating/server/src/main/scala/org/apache/livy/sessions/Session.scala


Code source — Commandes de clonage

Les deux versions ont été clonées directement depuis le dépôt GitHub officiel d'Apache Livy en utilisant les commandes exactes suivantes :

Dépôt : https://github.com/apache/incubator-livy

# Version vulnérable — clonée dans ./livy-0.8.0/
git clone --depth=1 --branch v0.8.0-incubating \
    https://github.com/apache/incubator-livy \
    livy-0.8.0

# Version corrigée — clonée dans ./livy-0.9.0/
git clone --depth=1 --branch v0.9.0-incubating \
    https://github.com/apache/incubator-livy \
    livy-0.9.0
VersionTagCommit résoluChemin local
0.8.0-incubatingv0.8.0-incubating78b512658e4baf1183f2b352203ada1928d8111a./livy-0.8.0/
0.9.0-incubatingv0.9.0-incubating7215f209b25b96488189567807eaded00953a492./livy-0.9.0/

Diffs de code exacts

Correctif — Session.scala : Paths.get().normalize() avant le contrôle de liste blanche

 import java.io.InputStream
 import java.net.{URI, URISyntaxException}
+import java.nio.file.Paths
 import java.security.PrivilegedExceptionAction
+import java.util.concurrent.{Executors, LinkedBlockingQueue, ThreadFactory, ThreadPoolExecutor, TimeUnit}
 import java.util.UUID

 ...

     if (resolved.getScheme() == "file") {
       // Assurer que l'emplacement est dans la liste blanche avant d'autoriser l'ajout de fichiers locaux.
-      require(livyConf.localFsWhitelist.find(resolved.getPath().startsWith).isDefined,
+      require(livyConf.localFsWhitelist.find(
+        Paths.get(resolved.getPath()).normalize.startsWith).isDefined,
         s"Le chemin local ${uri.getPath()} ne peut pas être ajouté aux sessions utilisateur.")
     }

Impact dans v0.8.0 : Le contrôle startsWith sur la chaîne brute peut être contourné avec une charge utile de traversal de chemin.

Exemple : si livy.file.local-dir-whitelist = /opt/safe-data

/opt/safe-data/../sensitive/secret.txt
  • v0.8.0 : "/opt/safe-data/../sensitive/secret.txt".startsWith("/opt/safe-data") → vrai (contourné)
  • v0.9.0 : Paths.get("/opt/safe-data/../sensitive/secret.txt").normalize → /opt/sensitive/secret.txt /opt/sensitive/secret.txt.startsWith(/opt/safe-data) → faux (bloqué)

Les diffs ont été produits en clonant les deux tags localement (voir ci-dessus) et en exécutant :

diff -u \
    livy-0.8.0/server/src/main/scala/org/apache/livy/sessions/Session.scala \
    livy-0.9.0/server/src/main/scala/org/apache/livy/sessions/Session.scala

Résumé du vecteur d'attaque

Attaquant (utilisateur REST/JDBC authentifié)
    │
    ▼
POST /sessions
{
  "conf": {
    "spark.jars": "file:///opt/safe-data/../sensitive/secret.txt"
    ← le chemin commence par le préfixe autorisé — String.startsWith() passe
    ← mais se résout EN DEHORS du répertoire via le traversal ../
  }
}
    │
    ▼
Livy 0.8.0 — contrôle de liste blanche contourné (startsWith brut, sans normalisation)
    │
    ▼
Spark lit le fichier et le distribue aux exécuteurs
    │
    ▼
L'attaquant récupère le contenu du fichier via la sortie du job / les logs

Environnement de test

Toutes les étapes de cette PoC ont été exécutées et validées sur le système suivant :

ComposantDétail
OS hôteUbuntu 24.04.4 LTS (Noble Numbat)
Noyau6.17.0-14-generic x86_64
Architecturex86_64
Mémoire totale15 GiB
Moteur Docker28.2.2
JDK hôteOpenJDK 17.0.18 (utilisé uniquement par l'hôte — les conteneurs utilisent eclipse-temurin:11-jdk-focal)
Image de base du conteneureclipse-temurin:11-jdk-focal (JDK 11, Ubuntu Focal)
Version Spark (les deux images)3.1.3 avec Hadoop 3.2
Version Livy — image vulnérable0.8.0-incubating
Version Livy — image corrigée0.9.0-incubating

Structure du répertoire

CVE-2025-66249-POC/
├── docker/
│   ├── fixed/
│   │   ├── Dockerfile
│   │   ├── livy.conf
│   │   └── start.sh
│   └── vulnerable/
│       ├── Dockerfile
│       ├── livy.conf
│       └── start.sh
├── test/
│   └── validate.sh
├── .gitignore
├── LICENSE
└── README.md

Proof of Concept

Aperçu

Télécharger l’outil