Kontrolliertes Labor für Schwachstellenforschung und -reproduktion für CVE-2020-14343 in PyYAML
Dieses Projekt demonstriert CVE-2020-14343 in einer kontrollierten und isolierten Docker-Umgebung.
Das Labor enthält zwei Umgebungen:
yaml.safe_load()Das Labor demonstriert den vollständigen Lebenszyklus der Schwachstelle:
Die in diesem Labor verwendete Reproduktionsnutzlast ist absichtlich harmlos und gibt lediglich eine Testmarkierung aus.
| Eigenschaft | Details |
|---|---|
| CVE | CVE-2020-14343 |
| Produkt | PyYAML |
| Betroffene Versionen | Versionen vor 5.4 |
| Korrigierte Version | 5.4 |
| Schwachstellentyp | Unsachgemäße Eingabevalidierung (CWE-20) |
| Schweregrad | Kritisch |
| Angriffsfläche | YAML-Eingabe, die mit verwundbarer Ladefunktionalität verarbeitet wird |
| CVSS | 9.3 (CVSS v4, GitHub Advisory) |
Die Schwachstelle tritt auf, wenn nicht vertrauenswürdige YAML-Eingaben mit verwundbarer PyYAML-Ladefunktionalität verarbeitet werden.
PyYAML-Versionen vor 5.4 erlaubten speziell gestaltete YAML-Tags, einschließlich Python-spezifischer Tags wie:
!!python/object/new
um auf die Objektkonstruktionsfunktionalität zuzugreifen, wenn FullLoader verwendet wurde.
Ein bösartiges YAML-Dokument kann daher eine unbeabsichtigte Ausführung von Python-Code verursachen.
Das Problem stand im Zusammenhang mit einer unvollständigen Behebung einer früheren PyYAML-Schwachstelle.
PyYAML 5.4 behob CVE-2020-14343, indem beliebige Python-Tags zu UnsafeLoader verschoben wurden.
Für Anwendungen, die nicht vertrauenswürdiges YAML verarbeiten, verwendet dieses Lab außerdem yaml.safe_load() als sicheren Ladeansatz.
Das Lab enthält zwei isolierte Docker-Dienste:
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
| Dienst | Host-Port | Container-Port | PyYAML | Zweck |
|---|---|---|---|---|
| vulnerable | 5000 | 5000 | 5.3.1 | Verwundbare Umgebung |
| patched | 5001 | 5000 | 5.4 | Behobene Umgebung |
cve-2020-14343-lab/
├── vulnerable/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
├── patched/
│ ├── app.py
│ ├── Dockerfile
│ └── requirements.txt
├── exploit/
│ └── reproduce.py
├── detection/
│ └── detect.py
├── screenshots/
│ ├── 01-docker-compose-running.png
│ ├── 02-vulnerable-detection.png
│ ├── 03-patched-detection.png
│ ├── 04a-vulnerable-request.png
│ ├── 04b-vulnerable-execution-log.png
│ └── 05-patched-exploit-blocked.png
├── blog/
│ └── CVE-2020-14343-Technical-Blog.pdf
├── docker-compose.yml
├── README.md
└── .gitignore
| Datei/Verzeichnis | Zweck |
|---|---|
vulnerable/app.py | Flask-Anwendung, die unsicheres YAML-Laden verwendet |
vulnerable/Dockerfile | Erstellt das verwundbare Docker-Image |
vulnerable/requirements.txt | Legt PyYAML auf 5.3.1 fest |
patched/app.py | Flask-Anwendung, die sicheres YAML-Laden verwendet |
patched/Dockerfile | Erstellt das gepatchte Docker-Image |
patched/requirements.txt | Legt PyYAML auf 5.4 fest |
exploit/reproduce.py | Reproduziert die Schwachstelle mit einer kontrollierten Payload |
detection/detect.py | Prüft die PyYAML-Version innerhalb eines Docker-Containers |
docker-compose.yml | Erstellt und startet beide Umgebungen |
screenshots/ | Enthält während des Labs erfasste Nachweise |
blog/ | Enthält das technische Blog-PDF mit 800–1200 Wörtern |
Die folgende Software ist erforderlich:
Docker Desktop muss laufen, bevor das Lab gestartet wird.
Die verwundbare Anwendung wird absichtlich nur auf dem lokalen Rechner über Docker-Portzuordnungen bereitgestellt.
Führen Sie im Stammverzeichnis des Projekts Folgendes aus:
docker compose up --build -d
Führen Sie aus:
docker compose ps
Beide Dienste sollten Up anzeigen.
Öffnen Sie:
http://127.0.0.1:5000
I'm ready to translate chunk 13, but the INPUT section appears to be empty — no source content was included after "INPUT:".
Please provide the actual Markdown content for chunk 13, and I'll return the German translation with all structure, code, URLs, and badges preserved exactly as specified.
{
"message": "CVE-2020-14343 vulnerable YAML parser"
}
Öffnen Sie:
http://127.0.0.1:5001
I'm ready to translate chunk 13, but the INPUT section appears to be empty — no source content was included after "INPUT:".
Please provide the actual Markdown content for chunk 13, and I'll return the German translation with all structure, code, URLs, and badges preserved exactly as specified.
{
"message": "CVE-2020-14343 patched YAML parser"
}
docker compose up -d
docker compose down
docker compose up --build -d
docker compose ps
docker logs cve-vulnerable
docker logs cve-patched
Die verwundbare Anwendung stellt einen /parse-Endpunkt bereit, der YAML-Eingaben akzeptiert.
Die verwundbare Umgebung verwendet:
yaml.FullLoaderDas Reproduktionsskript befindet sich unter:
exploit/reproduce.py
Die verwundbare Anwendung ist verfügbar unter:
http://127.0.0.1:5000/parse
Ausführen:
python exploit/reproduce.py
Das Skript sendet eine kontrollierte YAML-Nutzlast, die ein Python-spezifisches YAML-Tag enthält.
In der verwundbaren Umgebung wird die Nutzlast akzeptiert und die Anwendung gibt eine HTTP-200-Antwort zurück.
Der kontrollierte Testmarker:
CVE-2020-14343-TEST
wird innerhalb des Containers der verwundbaren Anwendung ausgeführt.
Die Ausführung kann überprüft werden mit:
docker logs cve-vulnerable
Die erwartete Log-Ausgabe umfasst:
CVE-2020-14343-TEST
Dies demonstriert die Codeausführung durch das anfällige YAML-Ladeverhalten.
Die Reproduktions-Payload ist absichtlich harmlos. Sie gibt lediglich einen Testmarker aus und verändert das Hostsystem nicht, greift nicht auf Anmeldeinformationen oder sensible Daten zu, interagiert nicht mit externen Systemen und führt keine destruktiven Aktionen aus.
Das Erkennungsskript befindet sich unter:
detection/detect.py