
High local write primitive: LiteBox v0.1.0 SNP UserPtr は NoValidation であるため、guest syscall buf はカーネル VA になり得る
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-snp-novalidation-userptr
クラス: 書き込みプリミティブ (ゲストからSNPカーネルへのR/W) 到達範囲: ローカル
LiteBox v0.1.0 (d8556e3) - Microsoft
SNP LinuxKernel は UserConstPtr / UserMutPtr を NoValidation に接続しており、これはポインタをそのまま返す。コメントは TODO: implement pointer validation to ensure the pointers are in user space. である。LVBS はすでに USER_ADDR_MIN..USER_ADDR_END (x86_64 では 0x10000 .. 0x7ffffffff000) の範囲チェックを行い、コピーを STAC/CLAC でラップしている。SNP はそうしていない。カーネルVAのゲスト mmap は拒否される (TASK_ADDR_MAX) ため、CPL3 のストアはカーネルヒープに到達できない。syscall パスはカーネルモードで実行されるため、到達できる。memcpy_fallible はスーパーバイザモードでの rep movsb である。
この残存物はゲストからSNPカーネル (VMPL2 LiteBox) へのR/Wである。ホスト VMPL0 でも、ハイパーバイザでも、SNPファームウェアでもない。
| ID | CVE未割当 |
| クラス | 書き込みプリミティブ (ゲストからSNPカーネルへのR/W) |
| 到達範囲 | ローカル (litebox_runner_snp 内の信頼されていないゲストユーザ空間) |
| CWE | CWE-823, CWE-119 |
| CVSS | High: 8.8 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| 製品 | microsoft/litebox |
| 影響を受けるバージョン | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) SNPカーネルプラットフォーム。TODOは 97001fd 時点で origin/main にまだ存在 |
| 認証 | ゲストはすでにSNP VM内で実行中 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ。SNPハードウェアなし |
誰: litebox_runner_snp 内の信頼されていないゲストユーザ空間。Issue #505 (オープンRFC) はこのクラスである。LVBSは実装済み。SNPは未実装。
ラボは、2つのバリデータのスーパーバイザモード copy_from_slice ガジェットと、ピンファイル litebox_platform_linux_kernel/src/lib.rs のコピーである。SNPハードウェア上のゲストsyscallではない。
| パス | 宛先VA | 結果 |
|---|---|---|
SNP NoValidation (恒等) | 0x1000 (USER_ADDR_MIN 未満) および 0xffff800000000000 (GVA_OFFSET) | 受理; memcpyが LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS をカーネルラベル付きオブジェクトに書き込む |
| LVBS範囲チェック | 同じカーネル宛先 | 拒否、errno=14 EFAULT、カーネルオブジェクトは空 |
| 両方 | 正当なユーザ宛先 0x400000 | 両方ともウィットネスをユーザオブジェクトにコピー |
| イメージ内のピンファイル | n/a | TODOコメントと、NoValidation に接続された UserConstPtr / UserMutPtr (LvbsValidateAccess は存在しない) |
| メソッド + シンク | 権限 |
|---|---|
read / readv / pread / recv* / getcwd / uname / epoll_pwait で buf = カーネルVA -> UserMutPtr::copy_from_slice -> memcpy_fallible (rep movsb) | syscallあたり最大 MAX_KERNEL_BUF_SIZE (512 KiB)、またはiovecページチャンクを、マップされた任意のSNPカーネルVAに書き込む。ペイロードはゲストが選択 (ゲストが書き込んだパイプ/ファイル) |
| メソッド + シンク | 権限 |
|---|---|
write / writev / send* で buf = カーネルVA -> read_at_offset | マップされたSNPカーネルメモリをゲストfdに読み出す |
| 未マップのカーネルVA | 例外テーブル経由で EFAULT (どのカーネルページが存在するかのマッパー) |
| メソッド + シンク | 権限 |
|---|---|
| SNPカーネルヒープ / ページテーブル / shim TLSの破壊 | SNPゲストカーネルをクラッシュまたは転用させる。信頼できるRIPガジェットは主張しない |
LvbsValidateAccess + STAC/CLAC)sysretq (sanitize_for_user_return は非ユーザRIP/RSPを拒否)mmap / mprotect (TASK_ADDR_MAX)NoValidation (同一プロセス; そこでのホスト境界はseccompであり、それは兄弟の残存物)v0.1.0の litebox_platform_linux_kernel/src/lib.rs 59-67行目。TODOはmainにまだ存在する。LVBSにはすでに LvbsValidateAccess があり、USER_ADDR_MIN = 0x10000 と USER_ADDR_MAX = 0x7ffffffff000 を持つ。SNPハードウェアは持っていなかった。ラボはピンファイルをコピーし、恒等と範囲チェックを実装し、LVBSチェックが拒否する宛先VAに NoValidation 経由でウィットネスを書き込む。
cd lab
./run.sh
ループバック 127.0.0.1:19130。Composeプロジェクト litebox-snp-novalidation-userptr。ウィットネス LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS。最終行:
SUCCESS litebox-snp-novalidation-userptr novalidation-kernel-write-ok lvbs-range-reject pin-TODO-present user-range-copy-ok LITEBOX-SNP-NOVALIDATION-USERPTR-WITNESS
SNP UserPtr を、LVBSがすでに持つ同じユーザ空間範囲チェック (USER_ADDR_MIN..USER_ADDR_END) に接続し、コピーを例外テーブルの背後に保つこと。カーネルプラットフォームに NoValidation を残さないこと。
ベンダーへの報告はMSRC (https://msrc.microsoft.com/create-report)。microsoft/liteboxに公開GitHub issueを開かないこと。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]