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
cve-2020-14343-lab — Labo de recherche et de reproduction contrôlées de vulnérabilités pour CVE-2020-14343 dans PyYAML | Kitploit
Outils/GitHubGitHub/saina15/cve-2020-14343-lab
Scanners de VulnérabilitésSécurité des ConteneursAnalyse Dynamique (Sandboxing)Analyse des VulnérabilitésExploitationVirtualisation de SécuritéTests d'IntrusionArticles et RechercheApprentissage et ÉducationLabs et Pratique
GitHub
il y a 1 jourPas encore vérifié
saina15/cve-2020-14343-lab

cve-2020-14343-lab

Labo de recherche et de reproduction contrôlées de vulnérabilités pour CVE-2020-14343 dans PyYAML

Voir le dépôt

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-2020-14343 – Laboratoire de chargement YAML non sécurisé avec PyYAML

1. Présentation du projet

Ce projet démontre la CVE-2020-14343 dans un environnement Docker contrôlé et isolé.

Le laboratoire contient deux environnements :

  • Un environnement vulnérable utilisant PyYAML 5.3.1
  • Un environnement corrigé utilisant PyYAML 5.4 et yaml.safe_load()

Le laboratoire démontre le cycle de vie complet de la vulnérabilité :

  1. Déployer l'application vulnérable.
  2. Identifier la version vulnérable de PyYAML.
  3. Reproduire la vulnérabilité à l'aide d'une charge utile YAML contrôlée.
  4. Détecter la version vulnérable à l'aide d'un script automatisé.
  5. Mettre à niveau vers la version corrigée.
  6. Tester la même charge utile contre l'application corrigée.
  7. Vérifier que le YAML malveillant est rejeté.

La charge utile de reproduction utilisée dans ce laboratoire est intentionnellement inoffensive et se contente d'afficher un marqueur de test.

2. Informations sur la CVE

PropriétéDétails
CVECVE-2020-14343
ProduitPyYAML
Versions affectéesVersions antérieures à 5.4
Version corrigée5.4
Type de vulnérabilitéValidation d'entrée incorrecte (CWE-20)
SévéritéCritique
Surface d'attaqueEntrée YAML traitée à l'aide d'une fonctionnalité de chargement vulnérable

Cause racine

La vulnérabilité se produit lorsqu'une entrée YAML non fiable est traitée à l'aide d'une fonctionnalité de chargement PyYAML vulnérable.

Les versions de PyYAML antérieures à 5.4 autorisaient des balises YAML spécialement conçues, notamment des balises spécifiques à Python telles que :

root@kitploit:~
!!python/object/new

à atteindre la fonctionnalité de construction d'objets lorsque FullLoader était utilisé.

Un document YAML malveillant peut donc provoquer une exécution non intentionnelle de code Python.

Le problème était lié à un correctif incomplet d'une vulnérabilité PyYAML antérieure.

PyYAML 5.4 a corrigé la CVE-2020-14343 en déplaçant les balises Python arbitraires vers UnsafeLoader.

Pour les applications traitant du YAML non fiable, ce laboratoire utilise également yaml.safe_load() comme approche de chargement sécurisée.

3. Architecture du laboratoire

Le laboratoire contient deux services Docker isolés :

root@kitploit:~
                         Host Machine
                              |
                 +------------+------------+
                 |                         |
                 v                         v
          Vulnerable App             Patched App
          localhost:5000             localhost:5001
                 |                         |
            PyYAML 5.3.1             PyYAML 5.4
            FullLoader               SafeLoader
                 |                         |
                 v                         v
          Payload executes          Payload rejected

Services

ServicePort hôtePort conteneurPyYAMLObjectif
vulnerable500050005.3.1Environnement vulnérable
patched500150005.4Environnement corrigé

4. Structure du dépôt

root@kitploit:~
cve-2020-14343-lab/
│
├── vulnerable/
│   ├── app.py
│   ├── Dockerfile
│   └── requirements.txt
│
├── patched/
│   ├── app.py
│   ├── Dockerfile
│   └── requirements.txt
│
├── exploit/
│   └── reproduce.py
│
├── detection/
│   └── detect.py
│
├── docker-compose.yml
└── README.md

Description des répertoires

Fichier/RépertoireObjectif
vulnerable/app.pyApplication Flask utilisant un chargement YAML vulnérable
vulnerable/DockerfileConstruit l'image Docker vulnérable
vulnerable/requirements.txtFixe PyYAML à 5.3.1
patched/app.pyApplication Flask utilisant un chargement YAML sécurisé
patched/DockerfileConstruit l'image Docker corrigée
patched/requirements.txtFixe PyYAML à 5.4
exploit/reproduce.pyReproduit la vulnérabilité à l'aide d'une charge utile contrôlée
detection/detect.pyVérifie la version de PyYAML à l'intérieur d'un conteneur Docker
docker-compose.ymlConstruit et exécute les deux environnements

5. Prérequis

Les logiciels suivants sont requis :

  • Docker Desktop
  • Docker Compose
  • Python 3.x
  • Git

Docker Desktop doit être en cours d'exécution avant de démarrer le laboratoire.

L'application vulnérable est intentionnellement exposée uniquement sur la machine locale via les mappages de ports Docker.

6. Configuration du laboratoire

Étape 1 : Démarrer le laboratoire

Depuis le répertoire racine du projet, exécutez :

root@kitploit:~
docker compose up --build -d

Étape 2 : Vérifier les conteneurs

Exécutez :

root@kitploit:~
docker compose ps

Les deux services doivent afficher Up.

Étape 3 : Vérifier l'application vulnérable

Ouvrez :

root@kitploit:~
http://127.0.0.1:5000

Réponse attendue :

root@kitploit:~
{
  "message": "CVE-2020-14343 vulnerable YAML parser"
}

Étape 4 : Vérifier l'application corrigée

Ouvrez :

root@kitploit:~
http://127.0.0.1:5001

Réponse attendue :

root@kitploit:~
{
  "message": "CVE-2020-14343 patched YAML parser"
}

7. Démarrer, arrêter et reconstruire le laboratoire

Démarrer

root@kitploit:~
docker compose up -d

Arrêter

root@kitploit:~
docker compose down

Construire et démarrer

root@kitploit:~
docker compose up --build -d

Vérifier les services en cours d'exécution

root@kitploit:~
docker compose ps

Consulter les journaux de l'application vulnérable

root@kitploit:~
docker logs cve-vulnerable

Consulter les journaux de l'application corrigée

root@kitploit:~
docker logs cve-patched

8. Reproduction de la vulnérabilité

L'application vulnérable expose un point de terminaison /parse qui accepte une entrée YAML.

L'environnement vulnérable utilise :

  • PyYAML 5.3.1
  • yaml.FullLoader

Le script de reproduction se trouve à l'emplacement :

root@kitploit:~
exploit/reproduce.py

Exécuter l'exploit

L'application vulnérable est disponible à l'adresse :

root@kitploit:~
http://127.0.0.1:5000/parse

Exécutez :

root@kitploit:~
python exploit/reproduce.py

Le script envoie une charge utile YAML contrôlée contenant une balise YAML spécifique à Python.

Résultat attendu

Dans l'environnement vulnérable, la charge utile est acceptée et l'application renvoie une réponse HTTP 200.

Le marqueur de test contrôlé :

root@kitploit:~
CVE-2020-14343-TEST

est exécuté à l'intérieur du conteneur de l'application vulnérable.

L'exécution peut être vérifiée à l'aide de :

root@kitploit:~
docker logs cve-vulnerable

La sortie attendue des journaux comprend :

root@kitploit:~
CVE-2020-14343-TEST

Cela démontre l'exécution de code via le comportement de chargement YAML vulnérable.

Sécurité

La charge utile de reproduction est intentionnellement inoffensive. Elle se contente d'afficher un marqueur de test et ne modifie pas le système hôte, n'accède pas aux identifiants, n'accède pas aux données sensibles, n'interagit pas avec des systèmes externes et n'effectue aucune action destructive.

9. Détection de la vulnérabilité

Le script de détection se trouve à l'emplacement :

root@kitploit:~
detection/detect.py

Le script vérifie la version de PyYAML installée à l'intérieur du conteneur Docker spécifié.

La version corrigée est :

root@kitploit:~
5.4

Détecter l'environnement vulnérable

Exécutez :

root@kitploit:~
python detection/detect.py cve-vulnerable

Résultat attendu :

root@kitploit:~
PyYAML installed version: 5.3.1
Fixed version: 5.4
STATUS: VULNERABLE
Reason: PyYAML version is older than 5.4.

Détecter l'environnement corrigé

Exécutez :

root@kitploit:~
python detection/detect.py cve-patched

Résultat attendu :

root@kitploit:~
PyYAML installed version: 5.4
Fixed version: 5.4
STATUS: PATCHED
Reason: PyYAML version is 5.4 or newer.

Logique de détection

root@kitploit:~
Docker Container
       |
       v
   docker exec
       |
       v
  Import PyYAML
       |
       v
Read yaml.__version__
       |
       v
 Compare with 5.4
       |
       +----------------------+
       |                      |
     < 5.4                  >= 5.4
       |                      |
       v                      v
  VULNERABLE                PATCHED

Le script interroge la version de PyYAML installée depuis le conteneur cible.

10. Remédiation

L'environnement vulnérable utilise :

root@kitploit:~
PyYAML==5.3.1

L'environnement corrigé utilise :

root@kitploit:~
PyYAML==5.4

L'application corrigée utilise également :

root@kitploit:~
yaml.safe_load(yaml_input)

au lieu de :

root@kitploit:~
yaml.load(yaml_input, Loader=yaml.FullLoader)

Étapes de remédiation

  1. Mettre à niveau PyYAML vers la version 5.4 ou ultérieure.
  2. Éviter tout comportement de chargement YAML non sécurisé lors du traitement d'entrées non fiables.
  3. Utiliser yaml.safe_load() lorsque l'application ne nécessite que des types de données YAML standard.
  4. Reconstruire l'image Docker.
  5. Redémarrer l'application corrigée.
  6. Exécuter à nouveau le script de détection.
  7. Réexécuter la charge utile de reproduction contre l'application corrigée.

11. Vérification après remédiation

La même charge utile d'exploit est testée contre l'application corrigée.

L'application corrigée s'exécute sur :

root@kitploit:~
http://127.0.0.1:5001/parse

Exécutez :

root@kitploit:~
python exploit/reproduce.py http://127.0.0.1:5001/parse

Résultat observé dans ce laboratoire :

root@kitploit:~
HTTP Status: 400
Server Response:
{"message":"could not determine a constructor for the tag 'tag:yaml.org,2002:python/object/new:tuple' ...","status":"error"}

La balise YAML spécifique à Python est rejetée par l'application corrigée.

Le marqueur de test contrôlé n'est pas exécuté dans l'application corrigée.

Avant vs Après

TestEnvironnement vulnérableEnvironnement corrigé
Version de PyYAML5.3.15.4
DétectionVULNERABLEPATCHED
Requête d'exploitHTTP 200HTTP 400
Balise YAML spécifique à PythonAcceptéeRejetée
Exécution du marqueur de testObservée dans les journaux du conteneurNon exécutée

12. Dépannage

Le démon Docker n'est pas en cours d'exécution

Assurez-vous que Docker Desktop est en cours d'exécution et vérifiez :

root@kitploit:~
docker version

Conflit de nom de conteneur

Vérifiez :

root@kitploit:~
docker ps -a

Supprimez les anciens conteneurs si nécessaire :

root@kitploit:~
docker rm cve-vulnerable cve-patched

Puis :

root@kitploit:~
docker compose up --build -d

Vérifier l'état des conteneurs

root@kitploit:~
docker compose ps

Consulter les journaux de l'application

root@kitploit:~
docker logs cve-vulnerable
docker logs cve-patched

Reconstruire après modification des dépendances

root@kitploit:~
docker compose up --build -d

Pour une reconstruction propre :

root@kitploit:~
docker compose build --no-cache
docker compose up -d

13. Limitations

Ce projet est un laboratoire de preuve de concept contrôlé et ne représente pas un déploiement en production.

Les limitations incluent :

  • L'application vulnérable est intentionnellement simplifiée.
  • Le laboratoire utilise une charge utile de preuve de concept inoffensive.
  • Aucun identifiant réel ni donnée sensible n'est utilisé.
  • L'application est conçue pour des tests locaux.
  • Le mécanisme de détection se concentre sur la version de PyYAML installée.
  • La détection basée uniquement sur la version ne prouve pas à elle seule qu'une application réelle est exploitable ; le comportement de l'application et la configuration du chargement YAML doivent également être pris en compte.
  • Le laboratoire ne tente aucune exploitation contre des systèmes externes ou non autorisés.

14. Preuves

Les preuves suivantes doivent être capturées pour la soumission du projet :

  1. Docker Compose montrant les deux conteneurs en cours d'exécution.
  2. Application vulnérable répondant sur le port 5000.
  3. Application corrigée répondant sur le port 5001.
  4. Détection de la version vulnérable montrant PyYAML 5.3.1 et STATUS: VULNERABLE.
  5. Exécution de l'exploit vulnérable et le marqueur CVE-2020-14343-TEST dans les journaux Docker.
  6. Détection de la version corrigée montrant PyYAML 5.4 et STATUS: PATCHED.
  7. Même exploit contre l'application corrigée renvoyant HTTP 400.
  8. Erreur de l'application corrigée montrant le rejet de la balise YAML spécifique à Python.

Les captures d'écran peuvent être stockées dans :

root@kitploit:~
screenshots/

15. Références

  • GitHub Advisory Database – CVE-2020-14343 / GHSA-8q59-q68h-6hv4
  • PyYAML CHANGES – Notes de version de PyYAML 5.4
  • PyYAML Wiki – Directives sur le chargement YAML et SafeLoader
  • PyYAML Issue #420 – Discussion sur FullLoader et l'exécution de code
  • National Vulnerability Database – Enregistrements CVE liés à PyYAML

Tout le code de reproduction et la documentation de ce dépôt ont été développés spécifiquement pour ce laboratoire.

16. Conclusion

Ce laboratoire démontre la CVE-2020-14343 depuis l'identification jusqu'à la remédiation.

L'environnement vulnérable utilise PyYAML 5.3.1 et démontre une exécution de code contrôlée via une charge utile YAML conçue.

Le script de détection identifie la version vulnérable de la dépendance.

L'environnement corrigé met à niveau PyYAML vers 5.4 et utilise yaml.safe_load() pour traiter du YAML non fiable.

La même charge utile de reproduction est ensuite rejetée par l'application corrigée, fournissant des preuves avant/après de la remédiation.

L'ensemble de l'environnement peut être reproduit à l'aide de Docker Compose.

Télécharger l’outil