Laboratorio controllato di ricerca e riproduzione di vulnerabilità per CVE-2020-14343 in PyYAML
Questo progetto dimostra la CVE-2020-14343 in un ambiente Docker controllato e isolato.
Il laboratorio contiene due ambienti:
yaml.safe_load()Il laboratorio dimostra l'intero ciclo di vita della vulnerabilità:
Il payload di riproduzione utilizzato in questo laboratorio è intenzionalmente innocuo e stampa solo un marcatore di test.
| Proprietà | Dettagli |
|---|---|
| CVE | CVE-2020-14343 |
| Prodotto | PyYAML |
| Versioni interessate | Versioni precedenti alla 5.4 |
| Versione corretta | 5.4 |
| Tipo di vulnerabilità | Convalida impropria dell'input (CWE-20) |
| Gravità | Critica |
| Superficie di attacco | Input YAML elaborato utilizzando funzionalità di caricamento vulnerabili |
| CVSS | 9.3 (CVSS v4, GitHub Advisory) |
La vulnerabilità si verifica quando un input YAML non attendibile viene elaborato utilizzando funzionalità di caricamento vulnerabili di PyYAML.
Le versioni di PyYAML precedenti alla 5.4 consentivano tag YAML appositamente costruiti, inclusi tag specifici di Python come:
!!python/object/new
per raggiungere la funzionalità di costruzione di oggetti quando veniva utilizzato FullLoader.
Un documento YAML malevolo può quindi causare l'esecuzione involontaria di codice Python.
Il problema era legato a una correzione incompleta per una precedente vulnerabilità di PyYAML.
PyYAML 5.4 ha corretto CVE-2020-14343 spostando i tag Python arbitrari in UnsafeLoader.
Per le applicazioni che elaborano YAML non attendibile, questo lab utilizza anche yaml.safe_load() come approccio di caricamento sicuro.
Il lab contiene due servizi Docker isolati:
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
| Servizio | Porta host | Porta container | PyYAML | Scopo |
|---|---|---|---|---|
| vulnerable | 5000 | 5000 | 5.3.1 | Ambiente vulnerabile |
| patched | 5001 | 5000 | 5.4 | Ambiente correttivo |
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
| File/Directory | Scopo |
|---|---|
vulnerable/app.py | Applicazione Flask che utilizza il caricamento YAML vulnerabile |
vulnerable/Dockerfile | Crea l'immagine Docker vulnerabile |
vulnerable/requirements.txt | Fissa PyYAML alla versione 5.3.1 |
patched/app.py | Applicazione Flask che utilizza il caricamento YAML sicuro |
patched/Dockerfile | Crea l'immagine Docker corretta |
patched/requirements.txt | Fissa PyYAML alla versione 5.4 |
exploit/reproduce.py | Riproduce la vulnerabilità utilizzando un payload controllato |
detection/detect.py | Verifica la versione di PyYAML all'interno di un container Docker |
docker-compose.yml | Crea ed esegue entrambi gli ambienti |
screenshots/ | Contiene le prove raccolte durante il laboratorio |
blog/ | Contiene il PDF del blog tecnico di 800–1200 parole |
È richiesto il seguente software:
Docker Desktop deve essere in esecuzione prima di avviare il laboratorio.
L'applicazione vulnerabile è intenzionalmente esposta solo sulla macchina locale tramite le mappature delle porte di Docker.
Dalla directory principale del progetto, eseguire:
docker compose up --build -d
Esegui:
docker compose ps
Entrambi i servizi dovrebbero mostrare Up.
Apri:
http://127.0.0.1:5000
I cannot produce a translation because no source content was included in your message. The "INPUT:" section is empty—there is no chunk 13 text to translate.
Please paste the actual Markdown content for chunk 13, and I will return only the Italian translation, preserving all structure, code, badges, and formatting exactly as specified.
{
"message": "CVE-2020-14343 vulnerable YAML parser"
}
Apri:
http://127.0.0.1:5001
I cannot produce a translation because no source content was included in your message. The "INPUT:" section is empty—there is no chunk 13 text to translate.
Please paste the actual Markdown content for chunk 13, and I will return only the Italian translation, preserving all structure, code, badges, and formatting 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
L'applicazione vulnerabile espone un endpoint /parse che accetta input YAML.
L'ambiente vulnerabile utilizza:
yaml.FullLoaderLo script di riproduzione si trova in:
exploit/reproduce.py
L'applicazione vulnerabile è disponibile all'indirizzo:
http://127.0.0.1:5000/parse
Esegui:
python exploit/reproduce.py
Lo script invia un payload YAML controllato contenente un tag YAML specifico per Python.
Nell'ambiente vulnerabile, il payload viene accettato e l'applicazione restituisce una risposta HTTP 200.
Il marcatore di test controllato:
CVE-2020-14343-TEST
viene eseguito all'interno del container dell'applicazione vulnerabile.
L'esecuzione può essere verificata utilizzando:
docker logs cve-vulnerable
L'output atteso del log include:
CVE-2020-14343-TEST
Questo dimostra l'esecuzione di codice tramite il comportamento vulnerabile del caricamento YAML.
Il payload di riproduzione è intenzionalmente innocuo. Stampa solo un marcatore di test e non modifica il sistema host, non accede a credenziali, non accede a dati sensibili, non interagisce con sistemi esterni né esegue azioni distruttive.