Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
cve-2020-14343-lab — Laboratorio controlado de investigación y reproducción de vulnerabilidades para CVE-2020-14343 en PyYAML | Kitploit
Herramientas/GitHubGitHub/saina15/cve-2020-14343-lab
Escáneres de VulnerabilidadesSeguridad de ContenedoresAnálisis Dinámico (Sandboxing)Análisis de VulnerabilidadesExplotaciónVirtualización de SeguridadPruebas de PenetraciónPapers e InvestigaciónAprendizaje y EducaciónLabs y Práctica
GitHub
hace 1 díaAún no revisado
saina15/cve-2020-14343-lab

cve-2020-14343-lab

Laboratorio controlado de investigación y reproducción de vulnerabilidades para CVE-2020-14343 en PyYAML

Ver Repositorio

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2020-14343 – Laboratorio de carga insegura de YAML en PyYAML

1. Descripción general del proyecto

Este proyecto demuestra CVE-2020-14343 en un entorno Docker controlado y aislado.

El laboratorio contiene dos entornos:

  • Un entorno vulnerable que utiliza PyYAML 5.3.1
  • Un entorno parcheado que utiliza PyYAML 5.4 y yaml.safe_load()

El laboratorio demuestra el ciclo de vida completo de la vulnerabilidad:

  1. Desplegar la aplicación vulnerable.
  2. Identificar la versión vulnerable de PyYAML.
  3. Reproducir la vulnerabilidad utilizando una carga útil YAML controlada.
  4. Detectar la versión vulnerable utilizando un script automatizado.
  5. Actualizar a la versión corregida.
  6. Probar la misma carga útil contra la aplicación parcheada.
  7. Verificar que el YAML malicioso es rechazado.

La carga útil de reproducción utilizada en este laboratorio es intencionadamente inofensiva y solo imprime un marcador de prueba.

2. Información del CVE

PropiedadDetalles
CVECVE-2020-14343
ProductoPyYAML
Versiones afectadasVersiones anteriores a 5.4
Versión corregida5.4
Tipo de vulnerabilidadValidación de entrada incorrecta (CWE-20)
GravedadCrítica
Superficie de ataqueEntrada YAML procesada mediante funcionalidad de carga vulnerable

Causa raíz

La vulnerabilidad ocurre cuando una entrada YAML no confiable se procesa utilizando funcionalidad de carga vulnerable de PyYAML.

Las versiones de PyYAML anteriores a 5.4 permitían etiquetas YAML especialmente diseñadas, incluidas etiquetas específicas de Python como:

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

llegar a la funcionalidad de construcción de objetos cuando se utilizaba FullLoader.

Un documento YAML malicioso puede por lo tanto provocar la ejecución no intencionada de código Python.

El problema estaba relacionado con una corrección incompleta de una vulnerabilidad anterior de PyYAML.

PyYAML 5.4 corrigió CVE-2020-14343 moviendo las etiquetas Python arbitrarias a UnsafeLoader.

Para las aplicaciones que procesan YAML no confiable, este laboratorio también utiliza yaml.safe_load() como enfoque de carga seguro.

3. Arquitectura del laboratorio

El laboratorio contiene dos servicios Docker aislados:

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

Servicios

ServicioPuerto del hostPuerto del contenedorPyYAMLPropósito
vulnerable500050005.3.1Entorno vulnerable
patched500150005.4Entorno remediado

4. Estructura del repositorio

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

Descripción de directorios

Archivo/DirectorioPropósito
vulnerable/app.pyAplicación Flask que utiliza carga YAML vulnerable
vulnerable/DockerfileConstruye la imagen Docker vulnerable
vulnerable/requirements.txtFija PyYAML a 5.3.1
patched/app.pyAplicación Flask que utiliza carga YAML segura
patched/DockerfileConstruye la imagen Docker parcheada
patched/requirements.txtFija PyYAML a 5.4
exploit/reproduce.pyReproduce la vulnerabilidad utilizando una carga útil controlada
detection/detect.pyComprueba la versión de PyYAML dentro de un contenedor Docker
docker-compose.ymlConstruye y ejecuta ambos entornos

5. Requisitos previos

Se requiere el siguiente software:

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

Docker Desktop debe estar en ejecución antes de iniciar el laboratorio.

La aplicación vulnerable está expuesta intencionadamente solo en la máquina local a través de los mapeos de puertos de Docker.

6. Configuración del laboratorio

Paso 1: Iniciar el laboratorio

Desde el directorio raíz del proyecto, ejecute:

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

Paso 2: Verificar los contenedores

Ejecute:

root@kitploit:~
docker compose ps

Ambos servicios deberían mostrar Up.

Paso 3: Verificar la aplicación vulnerable

Abra:

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

Respuesta esperada:

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

Paso 4: Verificar la aplicación parcheada

Abra:

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

Respuesta esperada:

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

7. Iniciar, detener y reconstruir el laboratorio

Iniciar

root@kitploit:~
docker compose up -d

Detener

root@kitploit:~
docker compose down

Construir e iniciar

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

Comprobar servicios en ejecución

root@kitploit:~
docker compose ps

Ver registros de la aplicación vulnerable

root@kitploit:~
docker logs cve-vulnerable

Ver registros de la aplicación parcheada

root@kitploit:~
docker logs cve-patched

8. Reproducción de la vulnerabilidad

La aplicación vulnerable expone un endpoint /parse que acepta entrada YAML.

El entorno vulnerable utiliza:

  • PyYAML 5.3.1
  • yaml.FullLoader

El script de reproducción se encuentra en:

root@kitploit:~
exploit/reproduce.py

Ejecutar el exploit

La aplicación vulnerable está disponible en:

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

Ejecute:

root@kitploit:~
python exploit/reproduce.py

El script envía una carga útil YAML controlada que contiene una etiqueta YAML específica de Python.

Resultado esperado

En el entorno vulnerable, la carga útil es aceptada y la aplicación devuelve una respuesta HTTP 200.

El marcador de prueba controlado:

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

se ejecuta dentro del contenedor de la aplicación vulnerable.

La ejecución puede verificarse utilizando:

root@kitploit:~
docker logs cve-vulnerable

La salida esperada del registro incluye:

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

Esto demuestra la ejecución de código a través del comportamiento de carga YAML vulnerable.

Seguridad

La carga útil de reproducción es intencionadamente inofensiva. Solo imprime un marcador de prueba y no modifica el sistema anfitrión, accede a credenciales, accede a datos sensibles, interactúa con sistemas externos ni realiza acciones destructivas.

9. Detección de la vulnerabilidad

El script de detección se encuentra en:

root@kitploit:~
detection/detect.py

El script comprueba la versión de PyYAML instalada dentro del contenedor Docker especificado.

La versión corregida es:

root@kitploit:~
5.4

Detectar el entorno vulnerable

Ejecute:

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

Resultado esperado:

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

Detectar el entorno parcheado

Ejecute:

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

Resultado esperado:

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

Lógica de detección

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

El script consulta la versión de PyYAML instalada desde el contenedor objetivo.

10. Remediación

El entorno vulnerable utiliza:

root@kitploit:~
PyYAML==5.3.1

El entorno parcheado utiliza:

root@kitploit:~
PyYAML==5.4

La aplicación parcheada también utiliza:

root@kitploit:~
yaml.safe_load(yaml_input)

en lugar de:

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

Pasos de remediación

  1. Actualizar PyYAML a la versión 5.4 o posterior.
  2. Evitar el comportamiento de carga YAML inseguro al procesar entrada no confiable.
  3. Utilizar yaml.safe_load() cuando la aplicación solo requiera tipos de datos YAML estándar.
  4. Reconstruir la imagen Docker.
  5. Reiniciar la aplicación parcheada.
  6. Ejecutar de nuevo el script de detección.
  7. Volver a ejecutar la carga útil de reproducción contra la aplicación parcheada.

11. Verificación posterior a la remediación

La misma carga útil de exploit se prueba contra la aplicación parcheada.

La aplicación parcheada se ejecuta en:

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

Ejecute:

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

Resultado observado en este 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"}

La etiqueta YAML específica de Python es rechazada por la aplicación parcheada.

El marcador de prueba controlado no se ejecuta en la aplicación parcheada.

Antes vs Después

PruebaEntorno vulnerableEntorno parcheado
Versión de PyYAML5.3.15.4
DetecciónVULNERABLEPATCHED
Solicitud de exploitHTTP 200HTTP 400
Etiqueta YAML específica de PythonAceptadaRechazada
Ejecución del marcador de pruebaObservada en los registros del contenedorNo ejecutada

12. Solución de problemas

El demonio de Docker no está en ejecución

Asegúrese de que Docker Desktop esté en ejecución y verifique:

root@kitploit:~
docker version

Conflicto de nombres de contenedor

Compruebe:

root@kitploit:~
docker ps -a

Elimine los contenedores antiguos si es necesario:

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

Luego:

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

Comprobar el estado del contenedor

root@kitploit:~
docker compose ps

Comprobar los registros de la aplicación

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

Reconstruir después de cambiar dependencias

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

Para una reconstrucción limpia:

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

13. Limitaciones

Este proyecto es un laboratorio de prueba de concepto controlado y no representa un despliegue en producción.

Las limitaciones incluyen:

  • La aplicación vulnerable está intencionadamente simplificada.
  • El laboratorio utiliza una carga útil de prueba de concepto inofensiva.
  • No se utilizan credenciales reales ni datos sensibles.
  • La aplicación está diseñada para pruebas locales.
  • El mecanismo de detección se centra en la versión de PyYAML instalada.
  • La detección basada únicamente en la versión no demuestra si una aplicación real es explotable; también deben considerarse el comportamiento de la aplicación y la configuración de carga de YAML.
  • El laboratorio no intenta la explotación contra sistemas externos o no autorizados.

14. Evidencia

Debe capturarse la siguiente evidencia para la entrega del proyecto:

  1. Docker Compose mostrando ambos contenedores en ejecución.
  2. Aplicación vulnerable respondiendo en el puerto 5000.
  3. Aplicación parcheada respondiendo en el puerto 5001.
  4. Detección de la versión vulnerable mostrando PyYAML 5.3.1 y STATUS: VULNERABLE.
  5. Ejecución del exploit vulnerable y el marcador CVE-2020-14343-TEST en los registros de Docker.
  6. Detección de la versión parcheada mostrando PyYAML 5.4 y STATUS: PATCHED.
  7. El mismo exploit contra la aplicación parcheada devolviendo HTTP 400.
  8. Error de la aplicación parcheada mostrando el rechazo de la etiqueta YAML específica de Python.

Las capturas de pantalla pueden almacenarse en:

root@kitploit:~
screenshots/

15. Referencias

  • GitHub Advisory Database – CVE-2020-14343 / GHSA-8q59-q68h-6hv4
  • PyYAML CHANGES – Notas de la versión PyYAML 5.4
  • PyYAML Wiki – Guía sobre carga de YAML y SafeLoader
  • PyYAML Issue #420 – Debate sobre FullLoader y ejecución de código
  • National Vulnerability Database – Registros de CVE relacionados con PyYAML

Todo el código de reproducción y la documentación de este repositorio se desarrollaron específicamente para este laboratorio.

16. Conclusión

Este laboratorio demuestra CVE-2020-14343 desde la identificación hasta la remediación.

El entorno vulnerable utiliza PyYAML 5.3.1 y demuestra la ejecución de código controlada a través de una carga útil YAML diseñada.

El script de detección identifica la versión vulnerable de la dependencia.

El entorno remediado actualiza PyYAML a 5.4 y utiliza yaml.safe_load() para procesar YAML no confiable.

La misma carga útil de reproducción es entonces rechazada por la aplicación parcheada, proporcionando evidencia antes y después de la remediación.

Todo el entorno puede reproducirse utilizando Docker Compose.

Descargar herramienta