跳到主要内容
机架成了一个下载文件,你的信任边界还停在“那只是台测试机”

机架成了一个下载文件,你的信任边界还停在“那只是台测试机”

0x7F
0x7F

· 阅读约 6 分钟

rack-init 跑一遍。

生成 PKI 材料 → 刷写模拟微控制器 → 建虚拟网络 → 初始化 DNS 和 NTP → 建库 → 建集群 → 建区域 → 交给 Nexus。

十分钟。

一台 Minisforum MS-A2,32 线程 Ryzen 9 9955HX,96GB 内存,起 6 个 Propolis 虚拟机——3 个干网络,3 个当 sled。跑完你桌面上就有一整套 Oxide 机架:控制平面是没改过的 Omicron,固件是没改过的 Hubris,交换面是 SoftNPU 仿出来的 P4,连 Service Processor 和 Root of Trust 那两颗微控制器都有人给你仿好了。

Oxide 10 月 14 号开源的,MPL 2.0,叫 Voxel。动机没什么可疑:真机架稀缺,成品优先发客户数据中心,测试团队手上只有四套 racklette,每套 4 sled 加 2 台交换机,排队排不上。之前那个 a4x2 保真度不够,于是重做了一套 illumos + Rust 的仿真栈,原则是跑未修改的正式软件,不养测试分支。

读到这句的时候我停了一下:sprockets 的 PKI 证书不是在生产阶段由 RoT 生成的,但不影响机架运行时行为。

不影响运行时行为。对。影响的是别的东西。

换成攻击者的思路

这个仓库最值钱的地方不是它开源了什么控制平面——控制平面本来就能在别处搞到。值钱的是它把“摸清一套机架怎么启动、怎么收敛、RoT 度量链怎么走”这件事的侦察成本砍到近乎零。

原来想研究这些,两条路:买硬件,或者混进有硬件的地方。前者贵,后者慢,两条都留痕迹。现在一台迷你主机,一块带 DRAM 缓存的 NVMe,装 Helios,镜像拉下来,十分钟一套。反复起,反复炸,重来——没有客户环境约束,不用申请窗口,不会触发告警,没人问你为什么半夜跑了三次 cluster init。

攻击者最贵的工作,从来不是写 exploit,是把目标摸清楚。

但新增的攻击面不在被测软件上。在仿真器那层。

补丁要打在被替换掉的那一层

Voxel 的设计原则是跑未修改的正式软件。听着很安全——你测的就是你卖的。反过来看:被测软件既然是真的,整套环境里唯一“假的”那部分,就是唯一的可动变量。

快照。rack-init 之前先在虚拟机里装好 Omicron,存一个可复用快照,再从快照往下配置。这个快照是一个已经装好控制平面的完整文件系统。会被人复制、上传、塞进 bug report、留在共享盘上。你们的快照仓库有没有权限模型,我不猜。

SoftNPU。软件 P4 交换机。转发行为由控制面下发的程序定义,谁能让它下发,谁就定义了这台“交换机”往哪送包。

sp-emu。这个最值得多看两眼。给 illumos 和 Linux(x86 和 ARM)提供 Cortex-M7 和 Cortex-M33 仿真,能直接把 Hubris 固件刷进去。也就是说,这是一个能执行任意固件映像的本地进程。刷固件的权限门槛退化成一个文件写入权限。而且是单线程的,只模拟指令、时间和中断——它不在你平时那套进程威胁模型的直觉范围里。

还有 PKI 那句。信任根不是在硅里长出来的,是软件里生成好、落在文件系统上的。那串材料可以快照、可以拷贝、可以跟着一份“最小复现”一起发出去。原文说不影响运行时行为,我同意。它影响的是这条信任链在谁的硬盘上。

这里的时间不是时间

Hubris 按 1ms SysTick 调度,仿真器不走真实时钟,sp-emu 把时间推进折算成指令计数。这条实现本身挺优雅,但有一个后果不太被提:你在 Voxel 里验证过的所有跟时间有关的安全行为——证书到期、token 的 exp、重放窗口、NTP 偏移容差、watchdog 超时——验证的都是这个折算模型。

结论不是无效。是有明确的适用范围。它证明逻辑分支走对了,不证明真实时钟下也对。把这种结论写成“已验证”贴进变更单,是最常见的那种失守——不是被攻破的,是被自己一句总结骗过去的。

——离题了,收。

会炸的不是这个仓库

这个东西我一开始判成高危。全套生产控制平面、PKI 引导流程、固件刷写入口,开源可下载——听着就是给攻击者准备的礼物。

摊开触发条件看:这些口子没有一个是自己会伸手去够生产的。要出事,得同时满足两个前提:有人把它放到了能摸到真实环境的位置,或者有人把带 PKI 材料的快照发了出去。两个前提都跟 Voxel 本身无关,都跟用它的人有关。级别下调。

但没归零。

因为“放到能摸到真实环境的位置”恰好是这类测试环境最常见的默认状态。它要装 Helios,大概率独占一台机器;独占的机器没人打补丁;它带 FRR,支持带编号和不带编号的 BGP——一个假机架是能跟真实 fabric 建邻居的。再加 host login 直接进 sled 的全局区、tp login 进交换机区,这条命令行不经过你的跳板机和审计流水线。

一台“只是测试机”的盒子,手里握着一套能当生产邻居的网络栈,和一条绕过审计的登录路径。

这个组合不需要漏洞。

拆弹清单

  1. 按生产资产定级,不按测试机定级。 单独网段或容器,禁止主动向真实 fabric 发起 BGP,禁止挂 corp 路由。这条先做。

  2. 快照和镜像当密钥材料管。 不进 git、不进 issue、不进共享盘。rack-init 生成的 PKI 材料用完就毁,别复用到任何还能连到真实环境的地方。这条比第 1 条更重要——它管的是泄漏出去之后还能不能用。

  3. 拉镜像那条链钉死。 TUF 仓库、Tufaceous 打包、Buildomat 出活——每多一个能被改的环节就多一个入水口。校验失败就停,不要“先跳过去看看能不能跑”。

  4. sp-emu 的固件输入按不可信输入处理。 从客户现场 dump 回来的固件,和从仓库拉下来的固件,刷进仿真器之前一个待遇。

  5. 时间相关的结论单独标适用范围。 别让一句“已在 Voxel 验证”流进变更评审。

  6. 问一句:这台机器上有没有一把能连到生产的凭据? 有就先拿掉,再谈别的。

别慌。Voxel 是好东西,把机架变成可复现的文件,降低的是整个行业的排障成本——包括安全研究的成本。要收回来的只有一个开关:它是测试环境,可它手里握着的东西是生产的。

排雷记录:仿真器仿的是行为,不是信任边界;那条边界在机架外面,得你自己画。