Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

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

1日前未レビュー

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

リポジトリを見る

人気

すべて見る →

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

すべてのツールを探索

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

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

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

1. プロジェクト概要

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

このラボには 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 入力

根本原因

この脆弱性は、信頼できない 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. ラボのアーキテクチャ

このラボには 2 つの隔離された 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.safe_load(yaml_input)

以下ではなく:

root@kitploit:~
yaml.load(yaml_input, Loader=yaml.FullLoader)

修正手順

  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 タグは修正済みアプリケーションによって拒否されます。

制御されたテストマーカーは修正済みアプリケーションでは実行されません。

修正前と修正後

テスト脆弱な環境修正済み環境
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 を使用して再現できます。

ツールをダウンロード