Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cve-2020-14343-lab — Laboratorio controllato di ricerca e riproduzione di vulnerabilità per CVE-2020-14343 in PyYAML | Kitploit
Strumenti/GitHubGitHub/saina15/cve-2020-14343-lab
Scanner di VulnerabilitàSicurezza dei ContenitoriAnalisi Dinamica (Sandboxing)Analisi delle VulnerabilitàExploitVirtualizzazione per la SicurezzaPenetration TestingPaper e RicercaApprendimento e FormazioneLab e Pratica
GitHubsaina15/cve-2020-14343-lab
1 giorno faNon ancora revisionato

cve-2020-14343-lab

Laboratorio controllato di ricerca e riproduzione di vulnerabilità per CVE-2020-14343 in PyYAML

Vedi Repository

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2020-14343 – Laboratorio di Caricamento YAML Non Sicuro in PyYAML

1. Panoramica del Progetto

Questo progetto dimostra la CVE-2020-14343 in un ambiente Docker controllato e isolato.

Il laboratorio contiene due ambienti:

  • Un ambiente vulnerabile che utilizza PyYAML 5.3.1
  • Un ambiente corretto che utilizza PyYAML 5.4 e yaml.safe_load()

Il laboratorio dimostra il ciclo di vita completo della vulnerabilità:

  1. Distribuire l'applicazione vulnerabile.
  2. Identificare la versione vulnerabile di PyYAML.
  3. Riprodurre la vulnerabilità utilizzando un payload YAML controllato.
  4. Rilevare la versione vulnerabile utilizzando uno script automatizzato.
  5. Aggiornare alla versione corretta.
  6. Testare lo stesso payload contro l'applicazione corretta.
  7. Verificare che il YAML malevolo venga rifiutato.

Il payload di riproduzione utilizzato in questo laboratorio è intenzionalmente innocuo e stampa solo un marcatore di test.

2. Informazioni sulla CVE

ProprietàDettagli
CVECVE-2020-14343
ProdottoPyYAML
Versioni interessateVersioni precedenti alla 5.4
Versione corretta5.4
Tipo di vulnerabilitàConvalida dell'input non corretta (CWE-20)
GravitàCritica
Superficie di attaccoInput YAML elaborato utilizzando funzionalità di caricamento vulnerabili

Causa Principale

La vulnerabilità si verifica quando un input YAML non attendibile viene elaborato utilizzando funzionalità di caricamento PyYAML vulnerabili.

Le versioni di PyYAML precedenti alla 5.4 consentivano tag YAML appositamente creati, inclusi tag specifici di Python come:

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

di 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 correlato a una correzione incompleta di una precedente vulnerabilità di PyYAML.

PyYAML 5.4 ha corretto la CVE-2020-14343 spostando i tag Python arbitrari su UnsafeLoader.

Per le applicazioni che elaborano YAML non attendibile, questo laboratorio utilizza anche yaml.safe_load() come approccio di caricamento sicuro.

3. Architettura del Laboratorio

Il laboratorio contiene due servizi Docker isolati:

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

Servizi

ServizioPorta HostPorta ContainerPyYAMLScopo
vulnerable500050005.3.1Ambiente vulnerabile
patched500150005.4Ambiente corretto

4. Struttura del Repository

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

Descrizione delle Directory

File/DirectoryScopo
vulnerable/app.pyApplicazione Flask che utilizza il caricamento YAML vulnerabile
vulnerable/DockerfileCostruisce l'immagine Docker vulnerabile
vulnerable/requirements.txtFissa PyYAML alla versione 5.3.1
patched/app.pyApplicazione Flask che utilizza il caricamento YAML sicuro
patched/DockerfileCostruisce l'immagine Docker corretta
patched/requirements.txtFissa PyYAML alla versione 5.4
exploit/reproduce.pyRiproduce la vulnerabilità utilizzando un payload controllato
detection/detect.pyVerifica la versione di PyYAML all'interno di un container Docker
docker-compose.ymlCostruisce ed esegue entrambi gli ambienti

5. Prerequisiti

È richiesto il seguente software:

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

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.

6. Configurazione del Laboratorio

Passaggio 1: Avviare il Laboratorio

Dalla directory principale del progetto, eseguire:

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

Passaggio 2: Verificare i Container

Eseguire:

root@kitploit:~
docker compose ps

Entrambi i servizi dovrebbero mostrare Up.

Passaggio 3: Verificare l'Applicazione Vulnerabile

Aprire:

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

Risposta prevista:

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

Passaggio 4: Verificare l'Applicazione Corretta

Aprire:

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

Risposta prevista:

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

7. Avvio, Arresto e Ricostruzione del Laboratorio

Avvio

root@kitploit:~
docker compose up -d

Arresto

root@kitploit:~
docker compose down

Costruzione e Avvio

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

Verifica dei Servizi in Esecuzione

root@kitploit:~
docker compose ps

Visualizzazione dei Log dell'Applicazione Vulnerabile

root@kitploit:~
docker logs cve-vulnerable

Visualizzazione dei Log dell'Applicazione Corretta

root@kitploit:~
docker logs cve-patched

8. Riproduzione della Vulnerabilità

L'applicazione vulnerabile espone un endpoint /parse che accetta input YAML.

L'ambiente vulnerabile utilizza:

  • PyYAML 5.3.1
  • yaml.FullLoader

Lo script di riproduzione si trova in:

root@kitploit:~
exploit/reproduce.py

Eseguire l'Exploit

L'applicazione vulnerabile è disponibile all'indirizzo:

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

Eseguire:

root@kitploit:~
python exploit/reproduce.py

Lo script invia un payload YAML controllato contenente un tag YAML specifico di Python.

Risultato Previsto

Nell'ambiente vulnerabile, il payload viene accettato e l'applicazione restituisce una risposta HTTP 200.

Il marcatore di test controllato:

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

viene eseguito all'interno del container dell'applicazione vulnerabile.

L'esecuzione può essere verificata utilizzando:

root@kitploit:~
docker logs cve-vulnerable

L'output previsto del log include:

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

Questo dimostra l'esecuzione di codice attraverso il comportamento di caricamento YAML vulnerabile.

Sicurezza

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 e non esegue azioni distruttive.

9. Rilevamento della Vulnerabilità

Lo script di rilevamento si trova in:

root@kitploit:~
detection/detect.py

Lo script verifica la versione di PyYAML installata all'interno del container Docker specificato.

La versione corretta è:

root@kitploit:~
5.4

Rilevare l'Ambiente Vulnerabile

Eseguire:

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

Risultato previsto:

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

Rilevare l'Ambiente Corretto

Eseguire:

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

Risultato previsto:

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

Logica di Rilevamento

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

Lo script interroga la versione di PyYAML installata dal container di destinazione.

10. Correzione

L'ambiente vulnerabile utilizza:

root@kitploit:~
PyYAML==5.3.1

L'ambiente corretto utilizza:

root@kitploit:~
PyYAML==5.4

L'applicazione corretta utilizza anche:

root@kitploit:~
yaml.safe_load(yaml_input)

invece di:

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

Passaggi di Correzione

  1. Aggiornare PyYAML alla versione 5.4 o successiva.
  2. Evitare comportamenti di caricamento YAML non sicuri quando si elaborano input non attendibili.
  3. Utilizzare yaml.safe_load() quando l'applicazione richiede solo tipi di dati YAML standard.
  4. Ricostruire l'immagine Docker.
  5. Riavviare l'applicazione corretta.
  6. Eseguire nuovamente lo script di rilevamento.
  7. Eseguire nuovamente il payload di riproduzione contro l'applicazione corretta.

11. Verifica Post-Correzione

Lo stesso payload di exploit viene testato contro l'applicazione corretta.

L'applicazione corretta viene eseguita su:

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

Eseguire:

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

Risultato osservato in questo laboratorio:

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"}

Il tag YAML specifico di Python viene rifiutato dall'applicazione corretta.

Il marcatore di test controllato non viene eseguito nell'applicazione corretta.

Prima vs Dopo

TestAmbiente VulnerabileAmbiente Corretto
Versione PyYAML5.3.15.4
RilevamentoVULNERABILECORRETTO
Richiesta di exploitHTTP 200HTTP 400
Tag YAML specifico di PythonAccettatoRifiutato
Esecuzione del marcatore di testOsservata nei log del containerNon eseguita

12. Risoluzione dei Problemi

Il Daemon Docker Non È in Esecuzione

Assicurarsi che Docker Desktop sia in esecuzione e verificare:

root@kitploit:~
docker version

Conflitto di Nomi dei Container

Verificare:

root@kitploit:~
docker ps -a

Rimuovere i vecchi container se necessario:

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

Poi:

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

Verificare lo Stato dei Container

root@kitploit:~
docker compose ps

Verificare i Log dell'Applicazione

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

Ricostruire Dopo Aver Modificato le Dipendenze

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

Per una ricostruzione pulita:

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

13. Limitazioni

Questo progetto è un laboratorio proof-of-concept controllato e non rappresenta una distribuzione in produzione.

Le limitazioni includono:

  • L'applicazione vulnerabile è intenzionalmente semplificata.
  • Il laboratorio utilizza un payload proof-of-concept innocuo.
  • Non vengono utilizzate credenziali reali o dati sensibili.
  • L'applicazione è progettata per test locali.
  • Il meccanismo di rilevamento si concentra sulla versione di PyYAML installata.
  • Il rilevamento basato solo sulla versione non prova se un'applicazione reale sia sfruttabile; devono essere considerati anche il comportamento dell'applicazione e la configurazione del caricamento YAML.
  • Il laboratorio non tenta lo sfruttamento contro sistemi esterni o non autorizzati.

14. Prove

Le seguenti prove dovrebbero essere raccolte per la presentazione del progetto:

  1. Docker Compose che mostra entrambi i container in esecuzione.
  2. Applicazione vulnerabile che risponde sulla porta 5000.
  3. Applicazione corretta che risponde sulla porta 5001.
  4. Rilevamento della versione vulnerabile che mostra PyYAML 5.3.1 e STATUS: VULNERABLE.
  5. Esecuzione dell'exploit vulnerabile e il marcatore CVE-2020-14343-TEST nei log di Docker.
  6. Rilevamento della versione corretta che mostra PyYAML 5.4 e STATUS: PATCHED.
  7. Lo stesso exploit contro l'applicazione corretta che restituisce HTTP 400.
  8. Errore dell'applicazione corretta che mostra il rifiuto del tag YAML specifico di Python.

Gli screenshot possono essere archiviati in:

root@kitploit:~
screenshots/

15. Riferimenti

  • GitHub Advisory Database – CVE-2020-14343 / GHSA-8q59-q68h-6hv4
  • PyYAML CHANGES – Note di rilascio di PyYAML 5.4
  • PyYAML Wiki – Guida al caricamento YAML e SafeLoader
  • PyYAML Issue #420 – Discussione su FullLoader ed esecuzione di codice
  • National Vulnerability Database – Record CVE relativi a PyYAML

Tutto il codice di riproduzione e la documentazione in questo repository sono stati sviluppati specificamente per questo laboratorio.

16. Conclusione

Questo laboratorio dimostra la CVE-2020-14343 dall'identificazione alla correzione.

L'ambiente vulnerabile utilizza PyYAML 5.3.1 e dimostra l'esecuzione controllata di codice attraverso un payload YAML appositamente creato.

Lo script di rilevamento identifica la versione vulnerabile della dipendenza.

L'ambiente corretto aggiorna PyYAML alla versione 5.4 e utilizza yaml.safe_load() per elaborare YAML non attendibile.

Lo stesso payload di riproduzione viene quindi rifiutato dall'applicazione corretta, fornendo prove prima-e-dopo della correzione.

L'intero ambiente può essere riprodotto utilizzando Docker Compose.

Scarica lo strumento