想象一下,将计算机的内存视为一家拥有数千间客房的庞大、繁忙的酒店。当一位客人(一个程序)退房时,房间本应被清理并上锁,以防他人进入。然而,在现有系统中存在一个危险漏洞:有时,“禁止入内”的牌子不会立即挂起。前一位客人可能仍持有一把钥匙(一个“悬空指针”),并在新客人到来之前溜回房间偷窃行李或弄乱家具。
本文介绍了一种名为PoisonCap的新型安全系统,专为一种名为CHERI的高级计算机硬件设计。将 PoisonCap 想象成一种神奇的“毒雾喷雾”,能在客人退房的瞬间立即锁定并标记房间,使任何持有旧钥匙的人都无法进入。
以下是其工作原理的分解,采用简单的类比:
1. 问题:“幽灵钥匙”与“脏房间”
在旧系统(称为Cornucopia)中,当房间被腾空后,酒店不会立即上锁。相反,它会将房间列入“隔离名单”,并等待经理前来清扫走廊并撤销所有旧钥匙。
- 缺陷:在客人离开与经理清扫之间的这段时间内,“幽灵钥匙”仍能打开房门。这被称为释放后使用(Use-After-Free)漏洞。
- 初始化问题:即使房间已被清理(清零),新客人仍可能走进房间,误以为房间已准备就绪,而未意识到前一位客人留下了一张便条(未初始化的数据),从而造成困惑。
2. 解决方案:“毒化能力”
PoisonCap 改变了规则。不再等待经理清扫,一旦房间被腾空,系统会立即向其喷洒毒雾。
- 魔法喷雾:这种“毒雾”并非化学物质,而是直接写入房间门(内存)上的特殊数字标签。
- 结果:如果有人试图使用旧钥匙打开那扇门,门会立即砰然关闭并触发警报。系统会立即知道该房间已被“毒化”并拒绝访问。这能立即阻止“幽灵钥匙”攻击,而不仅仅是延迟阻止。
3. “嵌套酒店”问题
现代软件就像一家酒店套着一家酒店。你有一家大酒店(主计算机系统),其内部还有管理自己房间的小型私人俱乐部(嵌套分配器)。
- 旧方式:大酒店经理拥有一份所有房间的总清单。如果私人俱乐部想锁上一间房,他们必须请求主经理,由主经理更新一份巨大且缓慢的电子表格(“影子位图”)。这种方式既缓慢,又无法很好地适应私人俱乐部拥有自己规则的情况。
- PoisonCap 方式:PoisonCap 为每间房配备了一把智能锁,该锁知晓其自身的层级结构。
- 如果小型俱乐部锁上一间房,主经理仍可通行,因为他们的钥匙“更大”(具有更广泛的边界)。
- 但如果小型俱乐部试图使用一把钥匙进入他们刚刚锁上的房间,门会立即关闭。
- 这使得不同层次的软件能够管理各自的安全,而无需拖慢整个系统或依赖巨大的中央电子表格。
4. 清理混乱(缓存效率)
当房间被腾空时,旧系统通常会为了安全起见将其清理(写入零值)。但这就像清洁工跑进每一间空房间擦拭柜台,尽管这些房间尚未有人使用。这浪费了清洁工的时间,并堵塞了走廊(计算机的缓存)。
- PoisonCap 的窍门:它不是清理房间,而是挂起一个醒目的“已毒化”标志。清洁工(硬件)看到标志后就会明白:“啊,这间房已废弃。我不需要将其保留在活跃列表中。”
- 这使得计算机能够更快地丢弃旧的、空的数据,从而使整个系统运行得更高效。
5. “先写后读”规则
PoisonCap 还解决了“未初始化访问”的问题。
- 想象一位新客人入住房间。如果他们试图在将自己的名字写入住客登记簿之前阅读书架上的书,系统会阻止他们。
- PoisonCap 确保在任何人被允许“读取”房间之前,该房间必须被“标记为已写入”。如果程序试图窥探尚未正确设置的房间,系统会立即将其拦截。
结论
研究人员在真实的计算机芯片(FPGA)上构建了该系统,并进行了数千次安全测试。他们发现:
- 更安全:它能立即阻止“幽灵钥匙”攻击,而不同于以往存在延迟的系统。
- 更快:它不会拖慢计算机;事实上,通过帮助计算机更快地忽略空房间,它有时甚至运行得稍快一些。
- 更灵活:它既适用于主系统,也适用于其内部的小型嵌套程序,而无需庞大缓慢的中央列表。
简而言之,PoisonCap 就像将酒店的安全策略从“观望等待”升级为“即时上锁”,使窃贼无法溜回,同时保持酒店顺畅运行。
技术摘要:PoisonCap——面向 CHERI 的高效分层时序安全
问题陈述
内存安全仍是软件安全领域的关键挑战,时序漏洞(如释放后使用 UAF 和未初始化内存访问)构成了重大风险。尽管 CHERI 架构提供了强大的空间安全保障,但现有的 CHERI 时序安全方案(特别是 Cornucopia Reloaded)存在若干局限性:
- 缓解保障薄弱:Cornucopia 提供的是释放后重新分配(UAR)安全,而非严格的释放后使用(UAF)安全。它将重新分配推迟到内存扫描时执行,导致在内存被隔离或重新分配之前,悬空指针仍可能访问已释放内存的时间窗口。
- 缺乏初始化安全保障:现有方案依赖内存清零,但 MSRC 分析表明,这不足以防止由未初始化访问引起的未定义行为。此外,清零无法向缓存层级传达数据的“活跃性”,导致缓存被“死”数据污染。
- 嵌套分配器中的可扩展性不足:现代软件栈常采用嵌套或自定义分配器(例如在 SQLite、OpenSSL、Apache 中),这些分配器从系统分配器中次级分配内存。当前的 CHERI 时序安全机制依赖单一的影子位图和软件定义的权限,若不引入显著的内存开销或复杂的权限层级,难以优雅地扩展到多层分配结构。
- 性能开销:延迟重新分配及影子位图的管理引入了性能惩罚和缓存低效。
方法论
作者提出了 PoisonCap,这是一种软硬件协同设计方案,为 CHERI 引入了一种新的架构扩展:毒化能力(poison capabilities)。该方法强制实施确定性的严格 UAF 缓解和初始化安全保障,同时向微架构传达内存状态。
核心架构扩展
- 毒化能力:一种直接存储在已释放内存中的新型能力。与标准能力不同,毒化能力限制对存储它们所在内存位置的访问。它们包含一个毒化位、一个毒化版本字段,并保留原始分配的边界。
- 硬件强制:
- 加载/存储检查:硬件在允许访问前检查内存内容。对毒化内存的加载会触发陷阱(或在静默模式下返回零),从而防止 UAF。对毒化内存的存储会被取消,以在不阻塞流水线的前提下保持安全。
- 版本控制:内存版本位跟踪分配代次。强制执行“写前读”策略:若指针的版本与内存中的毒化版本不同,则访问会触发陷阱,从而防止未初始化访问。
- 缓存感知:微架构扩展以检测毒化缓存行(通过毒化位和 CHERI 标签),并优先替换这些行,减少来自隔离内存的缓存污染。
- 分层撤销:毒化能力利用边界元数据来表示分配层级。
- 当内存被释放时,分配器写入一个毒化能力,保留该特定分配的边界。
- 在撤销扫描期间,系统检查某个能力的边界是否为毒化边界的子集。若是,则该能力被撤销。
- 关键在于,来自上游分配器(具有更宽边界)的能力不会被撤销,从而允许嵌套分配器在不干扰父分配器的情况下对其消费者实施安全控制。这消除了对多个影子位图的需求。
- 软件集成:该实现扩展了 CHERI RISC-V 指令集,增加了新指令(例如
CGetPoison、CGetCapPoison 和特殊存储指令),并与 CheriBSD 操作系统、LLVM/Clang 编译器以及 Jemalloc 分配器进行了集成。
主要贡献
- 毒化能力格式:引入了一种能力格式,在 CHERI 上强制实施严格的 UAF 和初始化安全保障,取代了对外部影子位图的需求。
- 分层保护:利用能力边界将时序安全扩展到嵌套分配层,实现了毒化权限的优雅委托,且不会干扰上游分配器。
- 无需影子位图的撤销:证明了毒化能力可以替代 Cornucopia 的影子位图来识别悬空指针,从而降低内存开销并实现分层撤销。
- 全系统实现:在 CHERI RISC-V QEMU 模拟器和 CHERI-Toooba FPGA 软核 CPU 中实现了 PoisonCap 扩展,包括在 Clang/LLVM 编译器和 CheriBSD 操作系统中的支持。
- 微架构优化:扩展内存系统以管理毒化内存流,通过优先替换毒化行来提高缓存效率。
- 全面评估:使用 NIST Juliet 测试套件(2,776 个测试用例)以及 SPEC CPU2006/SQLite 基准测试进行了验证。
结果
- 安全性:PoisonCap 成功缓解了 Juliet 测试套件中所有测试的 UAF(CWE-416)、双重释放(CWE-415)和未初始化访问(CWE-457)漏洞。它能够检测在释放和重新分配之间发生的漏洞,而这些是 Cornucopia 的 UAR 模型所遗漏的。
- 性能:
- 开销:相对于在重新分配前清零内存的 Cornucopia 基线,PoisonCap 没有引入根本性的性能开销。在 SPEC CPU2006 INT 基准测试中,与带清零的 Cornucopia 相比,它显示出轻微的提升(CPU 周期开销减少了 0.1%)。
- 缓存效率:通过使微架构能够检测并替换毒化缓存行,与带清零的 Cornucopia 相比,PoisonCap 将 DRAM 流量开销平均降低了 1.49%。
- 硬件成本:在 VCU118 FPGA 上,该实现仅增加了 1.1% 的逻辑使用率和 2.2% 的寄存器使用率,内存使用率增加可忽略不计(0.1%),功耗降低了 2.3%。
- 嵌套分配器:原型成功扩展了 SQLite 的 MEMSYS5 分配器以使用 PoisonCap 进行时序安全,证明了分层撤销可以在不需要静态分配层或额外影子位图的情况下工作。
意义与主张
本文主张 PoisonCap 代表了 CHERI 时序安全的重大进步,具体体现在:
- 强化安全保证:从 UAR 转向严格的 UAF 缓解,并强制实施初始化安全保障,而不单纯依赖清零。
- 消除开销:在实现更强保证的同时,避免了通常与时序安全机制(如影子位图或延迟重新分配)相关的性能或内存开销。
- 实现可组合性:解决了将时序安全扩展到嵌套分配器的长期挑战,允许复杂的软件栈在每一层保持安全性,同时不损害父层的安全性。
- 微架构协同:利用 CHERI 能力的独特属性向缓存子系统传达内存状态,将安全机制转化为缓存管理的性能优化。
作者将 PoisonCap 定位为一种由软件驱动的增量采用路径,对于未利用这些功能的软件无需基线开销,使其适用于应用级 CHERI 系统的广泛部署。
每周获取最佳 computer science 论文。
受到斯坦福、剑桥和法国科学院研究人员的信赖。
请查收邮箱确认订阅。
出了点问题,再试一次?
无垃圾邮件,随时退订。