Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
cve-2020-14343-lab — 针对 PyYAML 中 CVE-2020-14343 的受控漏洞研究与复现实验环境 | Kitploit
工具/GitHubGitHub/saina15/cve-2020-14343-lab
漏洞扫描器容器安全动态分析 (沙盒)漏洞分析漏洞利用安全虚拟化渗透测试论文与研究学习与教育实验室与实践
GitHubsaina15/cve-2020-14343-lab

cve-2020-14343-lab

1天前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

针对 PyYAML 中 CVE-2020-14343 的受控漏洞研究与复现实验环境

查看仓库
分享

CVE-2020-14343 – PyYAML 不安全 YAML 加载实验

1. 项目概述

本项目在受控且隔离的 Docker 环境中演示 CVE-2020-14343。

该实验包含两个环境:

  • 使用 PyYAML 5.3.1 的漏洞环境
  • 使用 PyYAML 5.4 和 yaml.safe_load() 的修复环境

该实验演示了完整的漏洞生命周期:

  1. 部署存在漏洞的应用程序。
  2. 识别存在漏洞的 PyYAML 版本。
  3. 使用受控的 YAML 载荷复现漏洞。
  4. 使用自动化脚本检测存在漏洞的版本。
  5. 升级到修复版本。
  6. 针对已修复的应用程序测试相同的载荷。
  7. 验证恶意 YAML 被拒绝。

本实验中使用的复现载荷是故意无害的,仅打印一个测试标记。

2. CVE 信息

属性详情
CVECVE-2020-14343
产品PyYAML
受影响版本5.4 之前的版本
修复版本5.4
漏洞类型输入验证不当 (CWE-20)
严重性严重
攻击面使用存在漏洞的加载功能处理的 YAML 输入

根本原因

当使用存在漏洞的 PyYAML 加载功能处理不受信任的 YAML 输入时,就会出现该漏洞。

5.4 之前的 PyYAML 版本允许特制的 YAML 标签,包括 Python 特定的标签,例如:

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

在使用 FullLoader 时,这些标签可以到达对象构造功能。

因此,恶意 YAML 文档可能导致意外的 Python 代码执行。

该问题与早期 PyYAML 漏洞的不完整修复有关。

PyYAML 5.4 通过将任意 Python 标签移至 UnsafeLoader 修复了 CVE-2020-14343。

对于处理不受信任 YAML 的应用程序,本实验还使用 yaml.safe_load() 作为安全的加载方式。

3. 实验架构

该实验包含两个隔离的 Docker 服务:

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

服务

服务主机端口容器端口PyYAML用途
vulnerable500050005.3.1漏洞环境
patched500150005.4修复环境

4. 仓库结构

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

目录说明

文件/目录用途
vulnerable/app.py使用存在漏洞的 YAML 加载方式的 Flask 应用程序
vulnerable/Dockerfile构建存在漏洞的 Docker 镜像
vulnerable/requirements.txt将 PyYAML 固定为 5.3.1
patched/app.py使用安全 YAML 加载方式的 Flask 应用程序
patched/Dockerfile构建已修复的 Docker 镜像
patched/requirements.txt将 PyYAML 固定为 5.4
exploit/reproduce.py使用受控载荷复现漏洞
detection/detect.py检查 Docker 容器内的 PyYAML 版本
docker-compose.yml构建并运行两个环境

5. 先决条件

需要以下软件:

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

在启动实验之前,Docker Desktop 必须正在运行。

存在漏洞的应用程序通过 Docker 端口映射故意仅暴露在本地机器上。

6. 实验设置

步骤 1:启动实验

从项目根目录运行:

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

步骤 2:验证容器

运行:

root@kitploit:~
docker compose ps

两个服务都应显示 Up。

步骤 3:验证存在漏洞的应用程序

打开:

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

预期响应:

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

步骤 4:验证已修复的应用程序

打开:

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

预期响应:

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

7. 启动、停止和重建实验

启动

root@kitploit:~
docker compose up -d

停止

root@kitploit:~
docker compose down

构建并启动

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

检查正在运行的服务

root@kitploit:~
docker compose ps

查看存在漏洞的应用程序日志

root@kitploit:~
docker logs cve-vulnerable

查看已修复的应用程序日志

root@kitploit:~
docker logs cve-patched

8. 漏洞复现

存在漏洞的应用程序暴露了一个接受 YAML 输入的 /parse 端点。

漏洞环境使用:

  • PyYAML 5.3.1
  • yaml.FullLoader

复现脚本位于:

root@kitploit:~
exploit/reproduce.py

运行漏洞利用

存在漏洞的应用程序可通过以下地址访问:

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

运行:

root@kitploit:~
python exploit/reproduce.py

该脚本发送一个包含 Python 特定 YAML 标签的受控 YAML 载荷。

预期结果

在漏洞环境中,载荷被接受,应用程序返回 HTTP 200 响应。

受控测试标记:

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

在存在漏洞的应用程序容器内执行。

可以使用以下命令验证执行情况:

root@kitploit:~
docker logs cve-vulnerable

预期日志输出包括:

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

这演示了通过存在漏洞的 YAML 加载行为实现代码执行。

安全性

复现载荷是故意无害的。它仅打印一个测试标记,不会修改主机系统、访问凭据、访问敏感数据、与外部系统交互或执行破坏性操作。

9. 漏洞检测

检测脚本位于:

root@kitploit:~
detection/detect.py

该脚本检查指定 Docker 容器内安装的 PyYAML 版本。

修复版本为:

root@kitploit:~
5.4

检测漏洞环境

运行:

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

预期结果:

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

检测已修复环境

运行:

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

预期结果:

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

检测逻辑

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

该脚本从目标容器查询已安装的 PyYAML 版本。

10. 修复

漏洞环境使用:

root@kitploit:~
PyYAML==5.3.1

已修复环境使用:

root@kitploit:~
PyYAML==5.4

已修复的应用程序还使用:

root@kitploit:~
yaml.safe_load(yaml_input)

而不是:

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

修复步骤

  1. 将 PyYAML 升级到 5.4 或更高版本。
  2. 在处理不受信任的输入时,避免不安全的 YAML 加载行为。
  3. 当应用程序仅需要标准 YAML 数据类型时,使用 yaml.safe_load()。
  4. 重新构建 Docker 镜像。
  5. 重启已修复的应用程序。
  6. 再次运行检测脚本。
  7. 针对已修复的应用程序重新运行复现载荷。

11. 修复后验证

针对已修复的应用程序测试相同的漏洞利用载荷。

已修复的应用程序运行在:

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

运行:

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

本实验中观察到的结果:

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

Python 特定的 YAML 标签被已修复的应用程序拒绝。

受控测试标记未在已修复的应用程序中执行。

修复前与修复后

测试漏洞环境已修复环境
PyYAML 版本5.3.15.4
检测VULNERABLEPATCHED
漏洞利用请求HTTP 200HTTP 400
Python 特定 YAML 标签接受拒绝
测试标记执行在容器日志中观察到未执行

12. 故障排除

Docker 守护进程未运行

确保 Docker Desktop 正在运行并验证:

root@kitploit:~
docker version

容器名称冲突

检查:

root@kitploit:~
docker ps -a

如有需要,删除旧容器:

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

然后:

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

检查容器状态

root@kitploit:~
docker compose ps

检查应用程序日志

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

更改依赖项后重新构建

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

进行干净重建:

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

13. 局限性

本项目是一个受控的概念验证实验,并不代表生产部署。

局限性包括:

  • 存在漏洞的应用程序被故意简化。
  • 该实验使用无害的概念验证载荷。
  • 未使用真实凭据或敏感数据。
  • 该应用程序专为本地测试而设计。
  • 检测机制侧重于已安装的 PyYAML 版本。
  • 仅基于版本的检测并不能证明真实应用程序是否可被利用;还必须考虑应用程序行为和 YAML 加载配置。
  • 该实验不会尝试对外部或未经授权的系统进行利用。

14. 证据

应为项目提交收集以下证据:

  1. Docker Compose 显示两个容器正在运行。
  2. 存在漏洞的应用程序在端口 5000 上响应。
  3. 已修复的应用程序在端口 5001 上响应。
  4. 漏洞版本检测显示 PyYAML 5.3.1 和 STATUS: VULNERABLE。
  5. 漏洞利用执行以及 Docker 日志中的 CVE-2020-14343-TEST 标记。
  6. 已修复版本检测显示 PyYAML 5.4 和 STATUS: PATCHED。
  7. 针对已修复的应用程序的相同漏洞利用返回 HTTP 400。
  8. 已修复应用程序的错误显示拒绝 Python 特定的 YAML 标签。

截图可以存储在:

root@kitploit:~
screenshots/

15. 参考资料

  • GitHub Advisory Database – CVE-2020-14343 / GHSA-8q59-q68h-6hv4
  • PyYAML CHANGES – PyYAML 5.4 发行说明
  • PyYAML Wiki – YAML 加载和 SafeLoader 指南
  • PyYAML Issue #420 – FullLoader 和代码执行讨论
  • National Vulnerability Database – 与 PyYAML 相关的 CVE 记录

本仓库中的所有复现代码和文档均为本实验专门开发。

16. 结论

本实验演示了从识别到修复的 CVE-2020-14343。

漏洞环境使用 PyYAML 5.3.1,并通过特制的 YAML 载荷演示了受控的代码执行。

检测脚本识别出存在漏洞的依赖版本。

修复后的环境将 PyYAML 升级到 5.4,并使用 yaml.safe_load() 处理不受信任的 YAML。

随后,相同的复现载荷被已修复的应用程序拒绝,提供了修复前后的证据。

整个环境可以使用 Docker Compose 复现。

下载工具