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
331ヶ月前未レビュー

cve-2020-14343-lab

PyYAMLにおけるCVE-2020-14343の制御された脆弱性研究および再現ラボ

リポジトリを見る

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2020-14343 – PyYAML 安全でない YAML 読み込みラボ

1. プロジェクト概要

このプロジェクトは、CVE-2020-14343 を制御された隔離された Docker 環境で実演するものです。

このラボには 2 つの環境が含まれています:

  • 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. ラボのアーキテクチャ

このラボには、2 つの分離された 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 to translate. Please send the Markdown chunk you would like translated into Japanese.

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

ステップ4: パッチ適用済みアプリケーションの検証

開く:

http://127.0.0.1:5001

No input content was provided to translate. Please send the Markdown chunk you would like translated into Japanese.

{
  "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タグは、パッチ適用済みアプリケーションでは拒否されます。

制御されたテストマーカーは、パッチ適用済みアプリケーションでは実行されません。

修正前と修正後

テスト脆弱な環境パッチ適用済み環境
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

クリーンビルドの場合:

ツールをダウンロード