以Linux用户态为例:LiteBox新Platform实现全流程拆解
【免费下载链接】liteboxA security-focused library OS supporting kernel- and user-mode execution项目地址: https://gitcode.com/GitHub_Trending/lit/litebox
LiteBox 是一个面向安全的库操作系统(Library OS),支持内核态与用户态执行场景。它把宿主机接口压缩到最小,大幅降低攻击面。这篇文章以LiteBox Linux 用户态平台(Platform)实现为例,完整拆解"新增一个 Platform"的全流程:从 TUN 网络设备准备、平台实例初始化,到十余个 Provider 子接口的落地实现,帮助你快速理解 LiteBox 可扩展的平台架构。
一、先搞懂 LiteBox 的"北-南"架构
LiteBox 的核心设计可以用一张架构图概括(见上图):
- 北接口(North Interface):功能完整的 Unix-y 接口,由各种 Shim 提供——Linux Shim、OPTEE Shim、Wasm Shim、RustStd Shim,让上层程序像调用标准系统调用一样使用 LiteBox。
- LiteBox 核心:位于中间,向下依赖一个最小化的平台接口。
- 南接口(South Interface):即Platform 层,包括 Linux Userland、LVBS、FreeBSD Userland、Windows Userland、Linux Kernel on AMD SEV SNP 等多种实现。
💡 关键洞察:北与南可以任意配对——这正是 LiteBox 能实现"在 Windows 上运行未改动的 Linux 程序"、"在 SEV SNP 上运行程序"等场景的原因。
架构定义位于核心 crate 中,顶层平台 trait 见 litebox/src/platform/mod.rs。
二、为什么"新 Platform"很简单:Provider 组合式 Trait
在 LiteBox 中,判断"一个东西是不是合法平台"的顶层 trait 是Provider,它本身是一个空 trait,仅由若干子 trait 组合而成:
pub trait Provider: RawMutexProvider + IPInterfaceProvider + TimeProvider + ArchSpecificProvider + RawPointerProvider {}这意味着实现新平台时,子 trait 可以独立组合、按需实现,例如:
| 子接口 | 职责 | Linux 用户态实现要点 |
|---|---|---|
RawMutexProvider | 裸互斥锁 | 基于 futex 系统调用,见 lib.rs#L1081 |
ThreadProvider | 线程创建/中断 | spawn_thread、interrupt_thread,见 lib.rs#L963 |
TimerProvider | 定时器(信号投递) | 基于 Linuxtimerfd,见 lib.rs#L1009 |
SignalProvider | 异步信号捕获 | 记录 SIGINT/SIGALRM 供 shim 消费,见 lib.rs#L515 |
TimeProvider | 时间与 Instant/SystemTime | 见 lib.rs#L1229 |
RawPointerProvider | 页面分配(含 CoW) | mmap/mremap+ 文件后备 CoW 区域,见 lib.rs#L1463 |
IPInterfaceProvider | IP 报文收发 | 读写 TUN 设备,见 lib.rs#L1177 |
StdioProvider | 标准输入输出 | 直通宿主 stdio 并检测 TTY |
CrngProvider/DerivedKeyProvider | 随机数与密钥派生 | 基于内核熵源与 boot_id |
VmemPageFaultHandler | 虚拟内存缺页 | 见 lib.rs#L2404 |
组合完成后,只需一行声明即可"注册"为平台:impl litebox::platform::Provider for LinuxUserland {}(lib.rs#L513)。
三、Linux 用户态 Platform 实现全流程拆解
整个平台实现集中在 litebox_platform_linux_userland/src/lib.rs,并声明了平台约束:仅支持 x86/x86-64 Linux(lib.rs#L8)。
步骤 1:准备 TUN 网络设备
Linux 用户态平台的网络能力依赖一个已初始化的 TUN 设备。项目提供了便捷的初始化脚本 scripts/tun-setup.sh:
- 默认创建
tun99设备并分配10.0.0.1/24网段; - 支持
-d删除设备、-f强制重建、-t/-i自定义设备名与 IP; - 辅助函数封装在同目录的 scripts/_common.sh。
步骤 2:创建平台实例,初始化全局状态
核心入口是LinuxUserland::new(),平台结构体定义在 lib.rs#L96-L108:
- 注册异常处理器:安装 SIGSEGV 等信号处理,用于捕获 guest 运行期的缺页与异常;
- 打开 TUN 设备:以读写、非阻塞方式打开
/dev/net/tun,通过 ioctl 设置IFF_TUN | IFF_NO_PI(纯 IP 模式、无包头); - 读取保留页:解析
/proc/self/maps记录宿主已占用的地址区间,避免 guestmmap时冲突; - 检测 stdio 是否为 TTY:影响 guest 终端行为;
- 通过
Box::leak返回&'static实例,供全局使用。
此外还提供两个可选增强接口:
initialize_boot_specific_kdf_support():读取/proc/sys/kernel/random/boot_id作为密钥派生的一次性输入;register_cow_region():注册文件后备的CoW(写时复制)内存区域,让 guest 映射静态数据时共享宿主文件页,节省内存。
步骤 3:guest 线程的启动与上下文切换
这是平台实现中最精巧的部分。run_thread系列函数(lib.rs#L548)负责在宿主线程上执行 guest 代码:
- TLS 切换:guest 与宿主使用不同的 TLS 基址,代码中通过
tls!/saved_tls!宏(lib.rs#L45-L90)在 x86_64 的fs/gs段寄存器之间安全切换.tbss变量访问; - 信号隔离:
block_guest_signals()屏蔽 guest 不应直接收到的信号;信号处理链会把宿主信号(如 SIGINT)"翻译"并投递给 guest; - 线程中断:
ThreadHandle支持从其他线程interrupt_thread,确保 guest 代码能被及时打断(用于超时、退出等),见 lib.rs#L917-L990。
步骤 4:运行一个 guest 程序
平台层就绪后,上层由 runner 程序负责端到端运行,例如 litebox_runner_linux_userland/:
- 加载 ELF 可执行文件(依赖 litebox_common_linux/loader.rs);
- 通过 shim 将 guest 系统调用路由到 LiteBox 的北接口;
- 测试覆盖 execve、线程、socket、信号等场景,如 tests/thread.c、tests/net/tcp_server.c。
关键文件速查
| 路径 | 作用 |
|---|---|
| litebox_platform_linux_userland/src/lib.rs | Linux 用户态平台全部实现 |
| litebox_platform_linux_userland/Cargo.toml | 依赖与 feature(linux_syscall/optee_syscall) |
| litebox_platform_linux_userland/README.md | 平台说明与 TUN 使用提示 |
| litebox/src/platform/mod.rs | Provider及各子 trait 定义 |
| litebox/src/platform/page_mgmt.rs | 页面管理抽象(CoW、权限等) |
四、总结:三步复刻一个新 Platform
- 定义平台结构体:封装宿主机资源(fd、保留地址、TLS 状态等);
- 逐个实现 Provider 子接口:互斥锁、线程、时间、内存、网络、stdio 等,按场景取舍(可选接口有默认空实现);
- 一行
impl Provider完成注册,交给 runner 即可运行 guest。
以 Linux 用户态为例的这套实现,充分展示了 LiteBox "安全接口最小化 + 平台可插拔"的设计哲学——这正是它能同时覆盖 Linux 沙箱、Windows 跑 Linux 程序、SEV SNP 机密计算等多种场景的底层原因。🚀
【免费下载链接】liteboxA security-focused library OS supporting kernel- and user-mode execution项目地址: https://gitcode.com/GitHub_Trending/lit/litebox
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考