高本地文件读取:LiteBox v0.1.0 linux-userland seccomp SYS_open O_RDONLY 没有主机路径检查
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · litebox-seccomp-open-rdonly
类别: 文件读取(沙箱文件系统边界) 可达性: 本地
LiteBox v0.1.0(d8556e3)- Microsoft
文档中所述的 Linux 用户态运行器(litebox-runner-linux-userland)会安装一个默认拒绝的 seccomp 过滤器,然后在同一进程中加载客户机 ELF。当参数 1(flags)为等于 OFlags::RDONLY(0)的 dword 时,SYS_open 位于允许列表中。没有路径谓词。发出真实 syscall 且 flags 为 0 的客户机将以运行器 UID 打开宿主 VFS,然后 read / mmap 这些字节。在此固定版本上,ELF 重写器不是安全边界。--rewrite-syscalls 是 -Z 且默认关闭。
此遗留问题是宿主文件系统读取。它不是宿主写入、不是执行、不是 ptrace、不是 LPE,也不是 RCE。
| ID | 暂无 CVE |
| 类别 | 文件读取(沙箱文件系统边界) |
| 可达性 | 本地(运行器进程中的不受信任客户机二进制) |
| CWE | CWE-284、CWE-862 |
| CVSS | 高: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)和重写器 crate 文档均表示 ELF 跳板不是安全边界。Linux 用户态安全依赖此过滤器。enable_seccomp_filter 是默认拒绝(release 中为 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 读取全局可读的宿主文件 |
SYS_open 运行器拥有的路径(ssh 密钥、.env、kubeconfig、云凭证、--initial-files tar) | 若该 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_PROCESSclone3 继承过滤器;写入 uid_map 需要被阻止的 openin_mem + tar_ro)不变。此遗留问题是经由真实系统调用的宿主 VFS我固定了 microsoft/litebox v0.1.0(d8556e3,2026-10-07)而非 main。进行了十八次源码搜寻。重写器 crate 和 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,或添加一个无法看到客户机文件系统之外宿主路径的路径谓词。未匹配拒绝已覆盖 openat。
厂商接收渠道为 MSRC(https://msrc.microsoft.com/create-report)。请勿在 microsoft/litebox 上开启公开 GitHub issue。
Abraxas Labs - abraxaslabs.tech - github.com/abraxas - @abraxas_null - [email protected]