LiteBox SEV SNP平台实现:机密计算宿主侧全流程拆解

发布时间:2026/9/17 22:32:35
LiteBox SEV SNP平台实现:机密计算宿主侧全流程拆解 LiteBox SEV SNP平台实现机密计算宿主侧全流程拆解【免费下载链接】liteboxA security-focused library OS supporting kernel- and user-mode execution项目地址: https://gitcode.com/GitHub_Trending/lit/liteboxLiteBox 是一个以安全为核心设计的库操作系统Library OS其中针对SEV SNP硬件的信任域实现是其机密计算能力的关键一环。本文带你完整拆解 LiteBox 在 SNP 平台上的宿主侧运行全流程从 GHCB 通信协议、VMPL 特权级隔离到启动入口、系统调用转发与 9P 文件系统挂载帮助你在没有大量代码的情况下看懂这套实现。一、背景为什么需要 SEV SNP 上的 LiteBox SEV SNP 是 AMD 提供的硬件级机密计算技术能对整个虚拟机的内存进行加密并引入VMPLVirtual Machine Privacy Level虚拟机隐私级别机制——可以理解为虚拟机内部的虚拟化特权级VMPL0最高特权由可信代码如宿主驱动/可信内核运行VMPL2较低特权LiteBox 的沙箱操作系统在这里运行LiteBox 的设计思路是让沙箱 OS 运行在 VMPL2只通过一个极小的南接口South Platform与 VMPL0 的可信侧交互从而大幅缩小攻击面。这正是 README 中所说的drastically cuts down the interface to the host。二、核心模块宿主接口层 HostSnpInterfaceSNP 平台实现集中在 litebox_platform_linux_kernel/src/host/snp/ 目录核心是一个名为HostSnpInterface的结构体它实现了 LiteBox 统一的HostInterface抽象能力实现方式发送/接收 IP 数据包SNP_VMPL_TUN_READ_REQ/SNP_VMPL_TUN_WRITE_REQ请求内存分配SNP_VMPL_ALLOC_REQ请求最大 order 10见 snp-sandbox.h阻塞与唤醒通过futex系统调用转发FUTEX_WAIT/FUTEX_WAKE标准输入输出read/write系统调用转发日志输出GHCB 串口控制台ghcb_prints退出/终止SNP_VMPL_EXIT_REQ/SNP_VMPL_TERMINATE_REQ所有能力都收敛为同一种动作组装一个SnpVmplRequestArgs请求结构然后发起 VTL Call 超调用。请求码定义可以从 snp-sandbox.h 中一眼看全退出、系统调用、分配、打印、TUN 读写、克隆、execve 等编号一目了然。三、两条通信通道VMMCALL 与 GHCB SNP 沙箱与可信宿主之间只有两条门1. VMMCALL 超调用通道request函数 只有一条内联汇编指令vmmcall配合HVCALL_VTL_CALL编号把参数指针放在 R14 寄存器中直接喊到 VMPL0。这是系统调用转发、内存分配、网络收发的总通道。2. GHCB 共享页通道ghcb.rs 实现了 SNP 规范中的GHCBGuest-Host Communication Block协议分两种形式MSR 形式通过rdmsr/wrmsr读写 MSR 寄存器 vc_vmgexit完成一次请求-响应例如ghcb_msr_call共享页形式GhcbPage 结构模拟硬件 VMSA 布局含valid_bitmap有效位图写入字段后必须置位这是 GHCB 页协议的正确性关键一个有意思的细节ghcb_prints实现了每 6 字节一次 GHCB MSR 写 vmgexit的原始串口打印整个 SNP 环境里的启动日志比如sandbox_kernel_init called就是这么吐出来的。GHCB 页布局的字段偏移定义在 ghcb.rs而完整的 CPU 上下文Vmsa结构含vmpl、cpl、sw_exit_code等字段见 vmsa.rs。四、启动全流程三个入口点拆解 SNP 可执行镜像由 litebox_runner_snp/ 生成构建目标是x86_64-unknown-none的no_std裸机程序见 target.json。启动流程由三段式入口组成第一步sandbox_kernel_init —— 内核级初始化入口处由汇编 entry.S 的_start调用sandbox_kernel_init它做三件事安装日志后端日志直送 GHCB 控制台调用GhcbProtocol::setup_ghcb_page完成 GHCB 协议协商并注册 GHCB 页失败则终止错误码SM_TERM_NO_GHCB校准 CPU 频率后return_to_host()交还控制权第二步sandbox_process_init —— 进程级初始化每个沙箱进程由sandbox_process_init初始化这是整个流程中最重的一步解析启动参数从 4KB 的vmpl2_boot_params结构中提取 argv/envp该结构含 pid/uid/gid 等身份信息和程序参数由 VMPL0 侧准备构建 LiteBox 实例SnpLinuxKernel::new(pgd)创建平台对象再经LinuxShimBuilder构建 shim挂载文件系统通过 TCP 连接10.0.0.1:8888的 9P 服务器用Composer把 9P 网络文件系统与内存态/tmp叠加为 Overlay再挂载/dev设备文件系统main.rs加载用户程序shim.load_program加载 ELF随后run_thread切入用户态第三步do_syscall_64 —— 系统调用分发用户程序执行syscall指令后汇编 entry_SYSCALL_64 把 19 个寄存器压栈组成pt_regs调用handle_syscall交给 shim 处理。shim 处理不了的调用如read、write、futex就会打包成SyscallN转发到 VMPL0 的 Linux 内核执行——这就是宿主侧名字的真正含义沙箱里跑的是用户程序真正的系统调用由 VMPL0 的可信宿主代为完成。此外还有两个辅助线程入口sandbox_tun_read_write负责网络收发的后台循环main.rssandbox_process_ret_from_fork负责clone3(CLONE_THREAD)后新线程的启动entry.S。五、安全收尾SM 终止码 SNP 规范定义了严格的机密计算终止SM TDC机制一旦沙箱内部发生不可恢复错误页错误、未处理信号、参数非法等必须主动销毁自己的机密状态而不是带着泄露风险继续运行。LiteBox 把这套终止码完整定义在 globals.rs 中例如SM_TERM_NO_GHCB5GHCB 页注册失败SM_TERM_INVALID_PARAM7启动参数解析失败SM_TERM_EXCEPTION10页错误恢复失败SM_TERM_ENOMEM9内存不足在 page_fault_handler 中可以看到完整的恢复失败即终止逻辑先尝试通过异常表exception table修复内核态页错误修不好就调用platform.terminate上报终止码。panic 处理同样遵循此原则。六、源码导读路径清单 如果你想自己动手验证建议按这个顺序阅读想搞懂什么看哪里请求协议与请求码snp-sandbox.h宿主接口总实现snp_impl.rsGHCB MSR/页协议ghcb.rsVMSA 寄存器布局vmsa.rs启动入口与初始化main.rs entry.S链接布局kernel.ld总结LiteBox 的 SEV SNP 实现展示了库操作系统在机密计算场景下的完整套路用VMPL 特权级划清信任边界用VMMCALL GHCB两条最小通道承载全部宿主交互用系统调用转发让沙箱获得真实的 Linux 内核能力再配合9P 文件系统和SM 终止码补齐功能与安全底线。整套设计把攻击面压缩到了几个请求码的大小这也是 LiteBox 作为安全优先库操作系统的核心价值。【免费下载链接】liteboxA security-focused library OS supporting kernel- and user-mode execution项目地址: https://gitcode.com/GitHub_Trending/lit/litebox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考