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
Vulnerability ScannersContainer SecurityDynamic Analysis (Sandboxing)Vulnerability AnalysisExploitationSecurity VirtualizationPenetration TestingPapers & ResearchLearning & EducationLabs & Practice
GitHub
331개월 전아직 검토되지 않음
saina15/cve-2020-14343-lab

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 입력
CVSS9.3 (CVSS v4, GitHub Advisory)

근본 원인

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

5.4 이전의 PyYAML 버전은 다음과 같은 Python 관련 태그를 포함하여 특별히 조작된 YAML 태그를 허용했습니다:

!!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.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두 환경을 모두 빌드하고 실행함
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

No input content was provided in your message. Please send the Markdown chunk you would like translated into Korean.

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

4단계: 패치된 애플리케이션 확인

열기:

http://127.0.0.1:5001

No input content was provided in your message. Please send the Markdown chunk you would like translated into Korean.

{
  "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. 취약점 재현

취약한 애플리케이션은 YAML 입력을 받는 /parse 엔드포인트를 노출합니다.

취약한 환경은 다음을 사용합니다:

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

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

Before vs After

테스트취약한 환경패치된 환경
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. 제한 사항

도구 다운로드