☰
【机密计算顶会解读】14:Blindfold——在不可信操作系统中管理机密内存
2026/10/15 16:44:05 网站建设 项目流程

导读:本文介绍Blindfold方案,旨在允许不可信操作系统管理机密内存而不泄露其机密性,同时保持操作系统功能完整性和性能。

原文链接:Blindfold: Confidential Memory Management by Untrusted Operating System - NDSS Symposium

Blindfold: Confidential Memory Management by Untrusted Operating System

一、背景介绍

现代操作系统对应用程序数据拥有无限制的访问权限,但操作系统本身可能因庞大代码量存在漏洞或其提供商不被信任,这给敏感数据带来了严重的安全风险。近年来,机密计算成为保护用户数据免受不可信操作系统侵害的重要机制。

现有的机密计算解决方案没有充分支持操作系统对机密内存的合法访问需求,通常通过隐藏或加密机密内存来实现保护,但这会导致操作系统的内存优化功能如页面迁移、巨页等失效,或显著增加实现这些优化所需的可信计算基(TCB)的复杂性,从而影响系统性能。Blindfold旨在解决这些问题,允许不可信操作系统管理机密内存而不泄露其机密性,同时保持操作系统功能的完整性和性能。

二、现状分析

现有机密计算解决方案存在以下主要问题:

  • 功能失效和高昂开销:现有的机密计算解决方案要么阻止操作系统访问用户空间,导致关键的操作系统功能失效(如TrustShadow、BlackBox);要么需要昂贵的数据拷贝和加密(如Overshadow)。
  • 复杂的TCB:现有的机密计算解决方案采用在TCB内部实现相应服务函数的方法,即具体问题具体分析(case-by-case),这导致了TCB的膨胀。
  • 硬件依赖:基于特定硬件(如SGX)的方案存在硬件限制且可移植性差。

三、应对设计

为应对上述挑战,论文提出了Blindfold方案,其核心设计思想是让一个运行在更高特权级的小型可信组件(Guardian)来调解不可信操作系统对机密内存的访问,而非完全阻止或全盘加密。

  • 切换而非嵌套:针对内存访问和中断处理,Blindfold不采用在TCB内维护影子表(页表/中断表)的嵌套方法,而是将这些表保留在操作系统中,由Guardian根据当前运行上下文是否为敏感进程切换系统应使用的表。这种方式避免了TCB管理复杂状态,减小了TCB,且不破坏操作系统层面的页表结构和优化。

  • 加密视图与安全ABI:对于操作系统管理内存但不需理解内容的“非语义访问”(如页面迁移、清零、复制),Blindfold允许操作系统操作,但主要提供内存的加密视图。为了优化最高频的操作(页面复制和清零),Blindfold设计了安全ABI,操作系统调用这些ABI,由Guardian在验证后直接执行明文操作,避免了不必要的、昂贵的加解密循环。

  • 轻量级能力系统:对于操作系统需要理解数据内容的“语义访问”(如处理系统调用参数),Blindfold设计了一个轻量级能力系统。敏感进程在发起系统调用时,会授予操作系统访问其地址空间特定区域的临时能力。Guardian负责验证这些能力,并在验证通过后代为执行数据拷贝,取代了以往“case-by-case”的处理方式,统一了接口,简化了TCB。
  • 与架构无关:仅依赖通用硬件特性(如特权级切换),支持跨平台部署。

通过这些设计,Blindfold解决以上问题,实现:(1) 保护机密内存不被非法访问;(2) 允许操作系统执行大部分内存管理功能以及优化功能;(3) 保持TCB小而简单;(4) 不依赖特定的硬件。

四、技术解析

Blindfold 保护应用程序代码和数据的机密性与完整性,以及跨用户-内核接口的控制流完整性。其核心是一个名为 Guardian 的小型可信软件组件,它运行在比操作系统更高的特权级别。看上去Guardian可能类似于一个 Hypervisor,但它不管理任何资源,也不处理中断。因此,Guardian 保持了较小的规模。

Guardian 通过强制执行四项不变性,保护敏感用户内存免受内核的无限制访问:

  1. 安全启动后,虚拟内存始终处于启用状态;
  2. 所有页表更新都必须通过 Guardian 进行;
  3. 任何内核或与之串通的用户线程永远不能通过属于敏感进程的敏感用户页表来访问敏感用户空间;
  4. 任何敏感页面要么处于加密状态,要么在其关联的用户页表中被独占地映射。

基于以上四项不变性,Guardian 保证任何内核线程永远无法以明文形式访问敏感用户页面。

除了 Guardian 之外,Blindfold 还采用了另外三个组件来支持遗留应用程序。分别为:安全启动,在此期间,Guardian 启用内存管理单元,并取消操作系统对所有页表的可写权限;二进制适配,为保护目的准备遗留应用程序二进制文件,包括加密可加载段和添加辅助段;少量的操作系统修改,使得页表更新和合法的内核语义访问必须通过函数调用进入 Guardian。

五、验证评估

在ARMv8/Linux(树莓派4)上对Blindfold进行了广泛评估,旨在量化其性能开销和功能兼容性。

性能方面:对于应用访问自身内存,Blindfold引入的开销可忽略。然而,对于敏感应用,系统调用和页表相关操作(如fork/execve/缺页)会因陷入Guardian、上下文切换及可能的密码学操作而产生显著开销(3-10倍以上)。短生命周期应用因冷启动时的页面解密开销较大,优化为长服务模式后性能更好。对于长服务应用(如Web服务器、内存数据库),开销主要来自频繁的系统调用或页表更新,但仍具备竞争力,且部分开销可通过应用级优化(如批处理系统调用)缓解。

功能完整性:支持Linux 95%的系统调用,且页面迁移等优化功能正常。

TCB与内核修改:Guardian的运行时TCB(约2.2K LoC Rust)比相关系统小约一半。对Linux内核的修改量约为400行代码。

实验证明Blindfold方案是有效的,它在保障机密性的前提下,较好地平衡了安全性、功能完整性和性能开销。


本账号发布内容均为原创,欢迎转载,转载请注明出处。更多资讯请移步【机密计算前沿技术】服务号,欢迎交流!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询