CVE-2021-3156 — Baron Samedit
sudo のヒープベースのバッファオーバーフロー → ローカル権限昇格
ITSOLERA サイバーセキュリティ部門 | レッドチームインターンシップ 2026
██████╗ █████╗ ██████╗ ██████╗ ███╗ ██╗ ███████╗ █████╗ ███╗ ███╗███████╗██████╗ ██╗████████╗
██╔══██╗██╔══██╗██╔══██╗██╔═══██╗████╗ ██║ ██╔════╝██╔══██╗████╗ ████║██╔════╝██╔══██╗██║╚══██╔══╝
██████╔╝███████║██████╔╝██║ ██║██╔██╗ ██║ ███████╗███████║██╔████╔██║█████╗ ██║ ██║██║ ██║
██╔══██╗██╔══██║██╔══██╗██║ ██║██║╚██╗██║ ╚════██║██╔══██║██║╚██╔╝██║██╔══╝ ██║ ██║██║ ██║
██████╔╝██║ ██║██║ ██║╚██████╔╝██║ ╚████║ ███████║██║ ██║██║ ╚═╝ ██║███████╗██████╔╝██║ ██║
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═════╝ ╚═╝ ╚═╝
⚠️ 教育目的 / 隔離ラボ専用
すべてのテストは Docker ラボコンテナ内でのみ実施してください。
実システム、本番環境、共有システムに対しては実行しないでください。
目次
- CVE 概要
- この CVE の特異性
- プロジェクト構成
- チーム成果物
- クイックスタート
- エクスプロイトの仕組み
- 脆弱性カナリアテスト
- exploit.py の使い方
- ラボのリセットとスナップショット
- パッチ適用済み vs 脆弱な状態の比較
- 参考資料
CVE 概要
| プロパティ | 値 |
|---|
| CVE ID | CVE-2021-3156 |
| ニックネーム | Baron Samedit |
| タイプ | ヒープベースのバッファオーバーフロー → ローカル権限昇格 |
| コンポーネント | sudo — Linux 特権ユーティリティ(src/sudo.c 内の set_cmnd()) |
| CVSS v3 スコア | 7.8 高 |
| ベクター | CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 脆弱なバージョン | sudo 1.8.2 – 1.8.31p2 および 1.9.0 – 1.9.5p1 |
| パッチ適用済みバージョン | sudo 1.9.5p2(1.9 系)/ sudo 1.8.32(1.8 系) |
| ラボのターゲットバージョン | Ubuntu 20.04 上の sudo 1.8.31 |
| パッチ KB / アドバイザリ | SA: https://www.sudo.ws/security/advisories/unescape_overflow/ |
| 発見者 | Qualys Research Team |
| 公開日 | 2021-01-26 |
| 実環境での存在期間(コード) | 〜2011-07-09(sudo 1.8.2)— 約10年間未検出 |
| 必要な認証 | ローカルユーザーのみ — sudo 権限は不要 |
この CVE の特異性
| プロパティ | CVE-2021-3156 | 一般的な Sudo LPE |
|---|
| sudoers エントリが必要 | ❌ 不要 | ✅ 必要 |
| sudo グループへの所属が必要 | ❌ 不要 | ✅ 必要 |
| 事前の sudo アクセスが必要 | ❌ 不要 | ✅ 必要 |
| 作成直後のユーザーアカウントで動作 | ✅ 可能 | ❌ 不可 |
| 権限システムの悪用 | ❌ 完全に回避 | ✅ 悪用する |
| 攻撃対象領域 | 引数パーサー(認証前) | 権限チェック |
重要な洞察: オーバーフローは引数を解析する関数である set_cmnd() 内で発生し、これは sudo が /etc/sudoers を参照する前に実行されます。10秒前に作成された権限ゼロのアカウントでもこれを悪用できます。
プロジェクト構成
CVE-2021-3156-Project/
│
├── README.md ← you are here
│
├── lab/ ← Member 1: Lab Environment
│ ├── Dockerfile ← Ubuntu 20.04 + sudo 1.8.31 (pinned)
│ ├── docker-compose.yml ← vulnerable target + patched reference
│ ├── evidence_helper.sh ← pre/post-exploit state capture
│ ├── SETUP.md ← step-by-step VM/Docker guide
│ └── config_notes.md ← CVE conditions & container details
│
├── exploit/ ← Member 2: Exploit Development
│ ├── exploit.py ← Python LPE framework + canary test
│ └── payloads.txt ← heap overflow research notes
│
├── docs/ ← Member 3: Research & Documentation
│ ├── root_cause_analysis.md ← set_cmnd() deep dive + off-by-one
│ ├── references.md ← all sources, PoCs, CWE mapping
│ └── mitigation.md ← sudo upgrade + hardening checklist
│
├── proof/ ← Member 4: Evidence Collection
│ ├── screenshots/ ← exploitation screenshots
│ └── terminal_logs.txt ← command output template + logs
│
└── report/
└── CVE-2021-3156_Report.docx ← Member 4: Final professional report
チーム成果物
メンバー1 — ラボ環境と CVE 検証
| ファイル | 説明 |
|---|
lab/Dockerfile | sudo 1.8.31 を固定した Ubuntu 20.04(脆弱); Python 3 インストール済み; sudo アクセス権のない labuser アカウント |
lab/docker-compose.yml | 脆弱なターゲットとパッチ適用済みの Ubuntu 22.04 参照用コンテナをオーケストレーション |
lab/evidence_helper.sh | エクスプロイト前後のシステム状態(ユーザー、sudo バージョン、カナリア)を取得する Bash スクリプト |
lab/SETUP.md | ステップバイステップ: ビルド → 起動 → 入室 → sudo バージョンの確認 → カナリア実行 → スナップショット |
lab/config_notes.md | 設定ミスが不要な理由、Docker のセキュリティ設定、資格情報の参照を解説 |
メンバー2 — エクスプロイト開発(PoC スクリプト)
| ファイル | 説明 |
|---|
exploit/exploit.py | 完全な Python フレームワーク: check_platform()、check_sudo_version()、run_canary_test()、get_system_info() + blasty/worawit の PoC への詳細な参照付きの3つのエクスプロイト TODO スタブ(select_heap_strategy、build_overflow_argument、trigger_overflow_and_escalate) |
exploit/payloads.txt | ヒープオーバーフローの概念、COMPRESSION_TRANSFORM 相当(引数構造)、3つのヒープ戦略、失敗試行のログテンプレート、検出シグネチャ |
注記: 倫理ガイドラインに基づき、動作するカーネル/ヒープエクスプロイトコードは含まれていません。
exploit.py の TODO スタブは、チームで学習・統合するための権威ある公開 PoC として
https://github.com/blasty/CVE-2021-3156 と https://github.com/worawit/CVE-2021-3156 を参照しています。
メンバー3 — 根本原因分析と調査
| ファイル | 説明 |
|---|
docs/root_cause_analysis.md | 詳細: set_cmnd() のサイズ計算とコピー量の不一致、コード例付きのオフバイワン、パッチ差分、エクスプロイトチェーン、CVSS 7.8 のメトリクス別分析、10年間のタイムライン、ディストリビューションへの影響テーブル |
docs/references.md | Qualys アドバイザリ、MITRE、NVD、sudo プロジェクト、blasty PoC、worawit PoC、ExploitDB、GTFOBins、CWE マッピング |
docs/mitigation.md | apt-get install --only-upgrade sudo、検証用カナリア、AppArmor ハードニング、auditd 監視、ハードニングテーブル |
メンバー4 — エビデンス収集、レポート作成、統合
| ファイル | 説明 |
|---|
proof/terminal_logs.txt | エビデンス収集テンプレート(実際のラボ出力を記入) |
proof/screenshots/ | 必須の7枚のスクリーンショット用ディレクトリ |
report/CVE-2021-3156_Report.docx | 12セクション構成のプロフェッショナルレポート: 表紙、エグゼクティブサマリー、CVE の説明、根本原因分析、CVSS の内訳、悪用手順、コード解説、エビデンスチェックリスト、緩和策、タイムライン、参考資料、免責事項 |
クイックスタート
1. ラボのビルドと起動
cd CVE-2021-3156-Project/lab/
# Build the vulnerable image (downloads Ubuntu 20.04, pins sudo 1.8.31)
docker compose build
# Start both containers
docker compose up -d
# Confirm containers are running
docker compose ps
期待される出力:
NAME STATUS
baron_samedit_target running
baron_samedit_patched running
2. 脆弱なコンテナに入る
docker exec -it baron_samedit_target bash
3. 脆弱性の条件を確認する
# Inside the container as labuser
whoami # Expected: labuser
id # Expected: uid=1000(labuser)...
sudo --version # Expected: Sudo version 1.8.31
sudo -l # Expected: Sorry, user labuser may not run sudo...
sudoedit -s '\' 2>&1 # Expected: NOT "usage:" → VULNERABLE
4. エクスプロイトをコピーして実行する
# From host machine
docker cp exploit/exploit.py baron_samedit_target:/home/labuser/
# Inside container
python3 exploit.py --check-only # verify all prerequisites pass
python3 exploit.py --safe-mode # canary only, no exploitation
python3 exploit.py --cmd "id" # LPE → show root identity
python3 exploit.py --cmd "whoami /all" --output /tmp/proof.txt
5. エビデンスを収集する
# Inside container — before exploit
~/evidence_helper.sh > /tmp/before.txt
# After exploit
~/evidence_helper.sh > /tmp/after.txt
# Copy to host
docker cp baron_samedit_target:/tmp/before.txt proof/terminal_logs_before.txt
docker cp baron_samedit_target:/tmp/after.txt proof/terminal_logs_after.txt
エクスプロイトの仕組み