Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
cve-2020-14343-lab — Контролируемая лаборатория исследования и воспроизведения уязвимости CVE-2020-14343 в PyYAML | Kitploit
Инструменты/GitHubGitHub/saina15/cve-2020-14343-lab
Сканеры уязвимостейБезопасность контейнеровДинамический анализ (песочница)Анализ уязвимостейЭксплуатацияВиртуализация для безопасностиТестирование на ПроникновениеСтатьи и ИсследованияОбучение и ОбразованиеЛаборатории и Практика
GitHub
11 день назадЕщё не проверено
saina15/cve-2020-14343-lab

cve-2020-14343-lab

Контролируемая лаборатория исследования и воспроизведения уязвимости CVE-2020-14343 в PyYAML

Репозиторий

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2020-14343 – Лаборатория небезопасной загрузки YAML в PyYAML

1. Обзор проекта

Этот проект демонстрирует CVE-2020-14343 в контролируемой и изолированной среде Docker.

Лаборатория содержит две среды:

  • Уязвимая среда, использующая 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, обрабатываемые с использованием уязвимой функциональности загрузки

Первопричина

Уязвимость возникает, когда недоверенные входные данные YAML обрабатываются с использованием уязвимой функциональности загрузки PyYAML.

Версии PyYAML до 5.4 позволяли специально созданным тегам YAML, включая специфичные для Python теги, такие как:

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

достигать функциональности конструирования объектов при использовании FullLoader.

Таким образом, вредоносный документ YAML может вызвать непреднамеренное выполнение кода Python.

Проблема была связана с неполным исправлением более ранней уязвимости PyYAML.

PyYAML 5.4 исправил CVE-2020-14343, переместив произвольные теги Python в UnsafeLoader.

Для приложений, обрабатывающих недоверенный 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.pyFlask-приложение, использующее уязвимую загрузку YAML
vulnerable/DockerfileСобирает уязвимый образ Docker
vulnerable/requirements.txtФиксирует PyYAML на версии 5.3.1
patched/app.pyFlask-приложение, использующее безопасную загрузку YAML
patched/DockerfileСобирает исправленный образ Docker
patched/requirements.txtФиксирует PyYAML на версии 5.4
exploit/reproduce.pyВоспроизводит уязвимость с использованием контролируемой полезной нагрузки
detection/detect.pyПроверяет версию PyYAML внутри контейнера Docker
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. Воспроизведение уязвимости

Уязвимое приложение предоставляет конечную точку /parse, которая принимает входные данные YAML.

Уязвимая среда использует:

  • 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

Скрипт отправляет контролируемую полезную нагрузку YAML, содержащую специфичный для Python тег 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

Скрипт проверяет версию PyYAML, установленную внутри указанного контейнера Docker.

Исправленная версия:

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.safe_load(), когда приложению требуются только стандартные типы данных YAML.
  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 отклоняется исправленным приложением.

Контролируемый тестовый маркер не выполняется в исправленном приложении.

До и после

ТестУязвимая средаИсправленная среда
Версия PyYAML5.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. Ограничения

Этот проект представляет собой контролируемую лабораторию proof-of-concept и не является производственным развертыванием.

Ограничения включают:

  • Уязвимое приложение намеренно упрощено.
  • Лаборатория использует безвредную полезную нагрузку proof-of-concept.
  • Реальные учетные данные или конфиденциальные данные не используются.
  • Приложение предназначено для локального тестирования.
  • Механизм обнаружения ориентирован на установленную версию PyYAML.
  • Обнаружение только на основе версии не доказывает, что реальное приложение является эксплуатируемым; также необходимо учитывать поведение приложения и конфигурацию загрузки YAML.
  • Лаборатория не пытается эксплуатировать внешние или несанкционированные системы.

14. Доказательства

Для сдачи проекта следует зафиксировать следующие доказательства:

  1. Docker Compose, показывающий оба запущенных контейнера.
  2. Уязвимое приложение, отвечающее на порту 5000.
  3. Исправленное приложение, отвечающее на порту 5001.
  4. Обнаружение уязвимой версии, показывающее PyYAML 5.3.1 и STATUS: VULNERABLE.
  5. Выполнение эксплойта на уязвимой среде и маркер CVE-2020-14343-TEST в логах Docker.
  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 – записи CVE, связанные с PyYAML

Весь код воспроизведения и документация в этом репозитории были разработаны специально для этой лаборатории.

16. Заключение

Эта лаборатория демонстрирует CVE-2020-14343 от идентификации до устранения.

Уязвимая среда использует PyYAML 5.3.1 и демонстрирует контролируемое выполнение кода через специально созданную полезную нагрузку YAML.

Скрипт обнаружения идентифицирует уязвимую версию зависимости.

Исправленная среда обновляет PyYAML до 5.4 и использует yaml.safe_load() для обработки недоверенного YAML.

Та же полезная нагрузка для воспроизведения затем отклоняется исправленным приложением, что дает доказательства устранения уязвимости до и после.

Вся среда может быть воспроизведена с помощью Docker Compose.

Скачать инструмент