Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

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

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

331个月前尚未审核

最受欢迎

查看全部 →

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

探索所有工具

浏览我们的工具集合

查看所有工具 →

针对 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 输入
CVSS9.3 (CVSS v4, GitHub Advisory)

根本原因

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

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

!!python/object/new

以在使用了 FullLoader 时达到对象构造功能。

因此,一个恶意的 YAML 文档可能导致非预期的 Python 代码执行。

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

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

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

3. 实验架构

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

                         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. 仓库结构

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

目录说明

文件/目录用途
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构建并运行两个环境
screenshots/包含实验过程中捕获的证据
blog/包含 800–1200 字的技术博客 PDF

5. 先决条件

需要以下软件:

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

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

存在漏洞的应用通过 Docker 端口映射,仅在本机上有意暴露。

6. 实验环境搭建

步骤 1:启动实验环境

在项目根目录下,运行:

docker compose up --build -d

步骤 2:验证容器

运行:

docker compose ps

两个服务都应显示 Up。

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

打开:

http://127.0.0.1:5000

I'm ready to translate chunk 13, but the actual content to translate wasn't included in your message — only the instructions and the "INPUT:" label with nothing after it.

Please paste the Markdown content for chunk 13, and I'll return the translated version following all the rules you specified.

{
  "message": "CVE-2020-14343 vulnerable YAML parser"
}

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

打开:

http://127.0.0.1:5001

I'm ready to translate chunk 13, but the actual content to translate wasn't included in your message — only the instructions and the "INPUT:" label with nothing after it.

Please paste the Markdown content for chunk 13, and I'll return the translated version following all the rules you specified.

{
  "message": "CVE-2020-14343 patched YAML parser"
}

7. 启动、停止与重建实验环境

启动

docker compose up -d

停止

docker compose down

构建并启动

docker compose up --build -d

检查正在运行的服务

docker compose ps

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

docker logs cve-vulnerable

查看已修补应用程序日志

docker logs cve-patched

8. 漏洞复现

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

该漏洞环境使用:

  • PyYAML 5.3.1
  • yaml.FullLoader

复现脚本位于:

exploit/reproduce.py

运行漏洞利用程序

存在漏洞的应用程序位于:

http://127.0.0.1:5000/parse

运行:

python exploit/reproduce.py

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

预期结果

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

受控测试标记:

CVE-2020-14343-TEST

在易受攻击的应用程序容器内执行。

可以使用以下方式验证执行情况:

docker logs cve-vulnerable

预期的日志输出包括:

CVE-2020-14343-TEST

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

安全性

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

9. 漏洞检测

检测脚本位于:

detection/detect.py

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

修复后的版本为:

5.4

检测易受攻击的环境

运行:

python detection/detect.py cve-vulnerable

预期结果:

PyYAML installed version: 5.3.1
Fixed version: 5.4
STATUS: VULNERABLE
Reason: PyYAML version is older than 5.4.

检测已修补环境

运行:

python detection/detect.py cve-patched

预期结果:

PyYAML installed version: 5.4
Fixed version: 5.4
STATUS: PATCHED
Reason: PyYAML version is 5.4 or newer.

检测逻辑

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. 修复

该易受攻击的环境使用:

PyYAML==5.3.1

修补后的环境使用:

PyYAML==5.4

修补后的应用程序还使用了:

yaml.safe_load(yaml_input)

而不是:

yaml.load(yaml_input, Loader=yaml.FullLoader)

修复步骤

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

11. 修复后验证

使用相同的漏洞利用载荷对已修补的应用程序进行测试。

已修补的应用程序运行于:

http://127.0.0.1:5001/parse

运行:

python exploit/reproduce.py http://127.0.0.1:5001/parse

本实验中观察到的结果:

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 正在运行,并验证:

docker version

容器名称冲突

检查:

docker ps -a

如果必要,请删除旧容器:

docker rm cve-vulnerable cve-patched

然后:

docker compose up --build -d

检查容器状态

docker compose ps

检查应用程序日志

docker logs cve-vulnerable
docker logs cve-patched

更改依赖项后重新构建

docker compose up --build -d

用于干净重建:

docker compose build --no-cache
docker compose up -d

13. 局限性

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

局限性包括:

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

14. 证据

以下证据是在实验过程中捕获的:

下载工具