
High local file read: LiteBox v0.1.0 linux-userland seccomp SYS_open O_RDONLY にホストパスチェックがない
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-seccomp-open-rdonly
クラス: ファイル読み取り (サンドボックス FS 境界) 到達範囲: ローカル
LiteBox v0.1.0 (d8556e3) - Microsoft
ドキュメント化された Linux ユーザーランドランナー (litebox-runner-linux-userland) は、デフォルト拒否の seccomp フィルタをインストールした後、同じプロセス内でゲスト ELF をロードします。SYS_open は、引数 1 (flags) が OFlags::RDONLY (0) に等しい dword である場合に許可リストに含まれます。パス述語はありません。flags 0 で実際の syscall を発行するゲストは、ランナーの UID としてホスト VFS を開き、その後それらのバイトを read / mmap します。ELF リライタはこのピンではセキュリティ境界ではありません。--rewrite-syscalls は -Z であり、デフォルトではオフです。
この残存脆弱性はホスト FS の読み取りです。ホストへの書き込みでも、exec でも、ptrace でも、LPE でも、RCE でもありません。
| ID | CVE はまだありません |
| クラス | ファイル読み取り (サンドボックス FS 境界) |
| 到達範囲 | ローカル (ランナープロセス内の信頼できないゲストバイナリ) |
| CWE | CWE-284, CWE-862 |
| CVSS | High: 7.1 CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| 製品 | microsoft/litebox |
| 影響を受けるバージョン | v0.1.0 (d8556e33676e47244bfefa139c1e9ff95bd67d53) Linux ユーザーランドプラットフォーム + ランナー |
| 認証 | ゲストはすでにサンドボックス内で実行中 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ、linux/amd64 |
誰が: litebox-runner-linux-userland 内の信頼できないゲストバイナリ。ベンダー (GitHub #1006 の CvvT) およびリライタクレートのドキュメントは、ELF トランポリンはセキュリティ境界ではないと述べています。Linux ユーザーランドのセキュリティはこのフィルタです。enable_seccomp_filter はデフォルト拒否 (リリースでは Errno(EINVAL)) で、TSYNC と PR_SET_NO_NEW_PRIVS を使用します。穴は SYS_open の flags Eq 0 でパスチェックがないことです。page_mgmt.rs のコメントは、CoW マッピングがフィルタが有効になった後にホストプログラムファイルを再オープンするというもので、事前に開かれた FD を保持する代わりにそうしています。
| メソッド + シンク | 権限 |
|---|---|
実際の SYS_open("/oracle/secret", 0) の後に SYS_read | ランナー UID が読み取れるホストファイルのバイト。ラボ: fd 3、35 バイト、証拠 LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS。パスは initramfs ホスト VFS であり、ゲストオーバーレイではありません。 |
| メソッド + シンク | 権限 |
|---|---|
SYS_open("/etc/passwd", 0) の後に read / mmap | ランナー UID としての world-readable なホストファイル |
ランナー所有のパス (ssh キー、.env、kubeconfig、クラウド認証情報、--initial-files tar) の SYS_open | UID が開ける場合、それらのバイト |
SYS_open("/etc/shadow", 0) | shadow ハッシュはランナーが root の場合のみ |
SYS_open("/proc/self/maps", 0) | ランナーのマップ、ホストの .text / libc を含む (同一プロセス) |
SYS_open("/proc/self/mem", 0) の後に FD の mmap | UID が procfs 経由で読み取れるランナーのアドレス空間。pread は未マッチの拒否; SYS_mmap は許可。 |
この残存脆弱性には何もありません。ラボで実証されたネガティブはすべて errno=22 EINVAL を返し、ファイルを作成しませんでした:
| メソッド + シンク | 結果 |
|---|---|
SYS_open O_RDWR | EINVAL |
SYS_open O_CREAT | EINVAL、ファイルは作成されない |
SYS_openat でさえ O_RDONLY の場合 | EINVAL |
SYS_execve | EINVAL |
socket、ptrace | EINVAL (追加の未マッチ拒否) |
openat / openat2 / creat / unlink / chmod はこのピンでは未マッチ拒否のままです。
バーには含まれません。
process_vm_readv、io_uring_setup、bpf、mount、pivot_root、unshare、setns、connect、ioctl、getdentsAUDIT_ARCH_X86_64 または KILL_PROCESS をプレフィックスしますclone3 はフィルタを継承します; uid_map の書き込みにはブロックされた open が必要ですin_mem + tar_ro) は変更されません。この残存脆弱性は実際の syscall を介したホスト VFS ですmicrosoft/litebox v0.1.0 (d8556e3、2026-10-07) を main ではなくピン留めしました。18 回のソース探索。リライタクレートと GitHub #1006 はすでにトランポリンが境界ではないと述べています。Linux ユーザーランドフィルタが境界です。flags 0 の SYS_open は CoW がプログラムファイルを再オープンできるようにするために存在します。パスチェックはありません。
誤った方向: Docker Desktop Rosetta と qemu-user-static はどちらもこのホストで seccomp(SET_MODE_FILTER) を拒否します (EINVAL / ENOSYS)。そのためラボは qemu-system-x86_64 TCG の下で x86_64 Alpine virt カーネルを起動し、コピーしたフィルタを PID 1 として実行して BPF が実際の x86_64 カーネルにヒットするようにします。コピーした seccompiler 0.5.0 ルールであり、ツリー内の enable_seccomp_filter 呼び出しではなく、ワークスペース全体でもありません。
cd lab
./run.sh
ループバック 127.0.0.1:19110。Compose プロジェクト litebox-seccomp-open-rdonly。プラットフォーム linux/amd64。証拠 LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS。最終行:
SUCCESS litebox-seccomp-open-rdonly open-rdonly-ok rdwr-einval openat-einval execve-einval LITEBOX-SECCOMP-OPEN-RDONLY-WITNESS
フィルタから SYS_open を削除し、PR_SET_SECCOMP の前に CoW FD を事前に開くか、ゲスト FS 外のホストパスを見ることができないパス述語を追加します。未マッチ拒否はすでに openat をカバーしています。
ベンダーの受け付けは MSRC (https://msrc.microsoft.com/create-report) です。microsoft/litebox に公開 GitHub issue を開かないでください。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]