Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
cve-2020-14343-lab — PyYAML의 CVE-2020-14343에 대한 통제된 취약점 연구 및 재현 랩 | Kitploit
도구/GitHubGitHub/saina15/cve-2020-14343-lab
Vulnerability ScannersContainer SecurityDynamic Analysis (Sandboxing)Vulnerability AnalysisExploitationSecurity VirtualizationPenetration TestingPapers & ResearchLearning & EducationLabs & Practice
GitHubsaina15/cve-2020-14343-lab
1일 전아직 검토되지 않음

cve-2020-14343-lab

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 입력

근본 원인

이 취약점은 신뢰할 수 없는 YAML 입력이 취약한 PyYAML 로딩 기능을 사용하여 처리될 때 발생합니다.

5.4 이전의 PyYAML 버전은 다음과 같은 Python 전용 태그를 포함한 특수하게 조작된 YAML 태그가:

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.txtPyYAML을 5.3.1로 고정합니다
patched/app.py안전한 YAML 로딩을 사용하는 Flask 애플리케이션
patched/Dockerfile패치된 Docker 이미지를 빌드합니다
patched/requirements.txtPyYAML을 5.4로 고정합니다
exploit/reproduce.py통제된 페이로드를 사용하여 취약점을 재현합니다
detection/detect.pyDocker 컨테이너 내부의 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.load(yaml_input, Loader=yaml.FullLoader)

다음을 사용합니다:

root@kitploit:~
yaml.safe_load(yaml_input)

수정 단계

  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 태그가 패치된 애플리케이션에 의해 거부됩니다.

통제된 테스트 마커는 패치된 애플리케이션에서 실행되지 않습니다.

수정 전 vs 수정 후

테스트취약한 환경패치된 환경
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을 처리하기 위해 yaml.safe_load()를 사용합니다.

그런 다음 동일한 재현 페이로드가 패치된 애플리케이션에 의해 거부되어 수정의 전후 증거를 제공합니다.

전체 환경은 Docker Compose를 사용하여 재현할 수 있습니다.

도구 다운로드