SAGE: Software-based Attestation for GPU Execution

1.概述

SAGE:一种基于软件的GPU执行认证机制。SAGE能够在安培架构(A100)的NVIDIA GPU上安全执行代码,提供代码完整性和保密性,计算完整性以及数据完整性和保密性的属性-所有这些都是在GPU和CPU上运行恶意代码的情况下。我们的评估表明,SAGE今天已经可以在没有特定硬件支持的gpu上以可靠的方式执行代码。

2.威胁模型

TCB: 作者假设远程攻击者拥有管理特权,可以篡改操作系统,或者在虚拟化的情况下篡改guest操作系统和虚拟机管理呈程序。CPU和GPU的硬件原语包含在TCB中。

能力: 攻击者可以读和修改人格受害进程的代码或者数据并且可以访问或者修改在DMA buffer或者提交给GPU的命令。

3.SAGE架构

在这里插入图片描述在这里插入图片描述

  • 验证器将 VF(验证函数)分派到 GPU 并在测量 VF 执行时间的同时调用它,然后向其发出挑战。VF 计算出一个校验值并将其返回给验证器。验证器使用相同的 VF 逻辑,独立计算并验证校验值的正确性。如果 VF 返回的校验和正确,并且在预期时间内返回,验证器就获得了 GPU 上建立动态信任根的保证。

  • 一旦建立了动态信任根,VF 就会设置一个未篡改的执行环境。在执行环境设置过程中,验证器飞地和 GPU 之间建立了一个共享密钥;之后,只有使用此密钥进行身份验证的命令才会被接受,包括在主机和 GPU 之间移动加密的内核代码和数据。SAGE 保证了存储在 GPU 存储器中的代码和数据的执行完整性和内存保护。

3.1 自验证校验和函数(Self-Verifying Checksum Function)

校验和函数用于保证在GPU上运行的VF代码的完整性不受攻击者的影响。checksum: 函数计算整个VF代码的校验和。产生的校验和可以用作VF的指纹,并允许检测对VF代码的更改。
校验和初始化: 验证者发送一组挑战,其中包含每个多处理器的特定挑战值。在接收到一组挑战后,每个多处理器使用其挑战作为种子值,用伪随机数据初始化所有的每线程状态。
校验和迭代: 校验和计算是迭代执行的。每次迭代执行相同数量和类型的指令,并且具有恒定的执行时间。
伪随机内存访问: 阻止攻击者预测哪条指令将读取可能被修改的内存位置,并迫使攻击者监视校验和代码读取的每个内存,从而导致明显的时间开销。间接地,这个进程执行校验和中包含的数据指针,以防止内存复制攻击。
更新校验和: 运行的校验和值被更新,以使用一系列指令将访问的VF代码包含到校验和值中。为了实现时间最优,我们使用简单的算术和逻辑指令(例如,+、<<、>>等),这些指令很难用更少的操作更快地实现。受[32]中的强排序的启发,用于更新校验和的指令在算术指令和逻辑指令之间交替,以强制指令的强排序。
自修改代码片段: 的指令依赖于校验和的当前值,并在校验和函数的每次迭代中更改。在我们的例子中,校验和函数的当前值被用作指令的直接值。
校验和结语: 由于校验和计算是使用位于不同多处理器上的单个线程进行的,因此需要在将校验和结果发送回验证器之前聚合校验和值。此聚合分三个步骤进行。首先,我们汇总每个经度的校验和。每个每个线程的校验和被成对地添加,以获得一个翘曲级校验和。其次,根据使用共享内存的线程块聚合翘曲级校验和。最后,我们使用全局内存聚合每个网格的校验和。每个聚合步骤都使用一对加法(映射到本机程序集中的原子加法指令)。然后将校验和计算的最终结果发送给验证者。
在这里插入图片描述

3.2 未篡改的执行环境(Untampered Execution Environment)

密钥创建: 为了在验证者和设备之间建立共享秘密,我们依赖于SAKE协议,该协议用于在传感器网络中相邻节点之间建立密钥,而不需要任何先前的秘密。为了将SAKE协议应用于SAGE,我们对协议进行了如下修改:1)将SAKE协议中提出的用于传感器网络的校验和函数替换为SAGE的校验和函数。2)不是两个参与者都作为挑战者,而是只有东道国作为挑战者参与。3)我们将协议中使用的加密原语替换为AES-CMAC作为MAC函数,SHA256作为哈希函数。

4.部署

Verifier: 我们使用英特尔SGX SDK[11]及其tcrypto库实现验证器enclave。enclave在GPU上创建CUDA上下文,将VF作为模块加载,并调用VF内核。为了在飞地中生成随机数,然后将其作为挑战传输到GPU,我们使用AES-CTR和在飞地创建期间使用TRNG生成的IV。
VF: VF是在CUDA c++中实现的,除了校验和函数组件,它是用我们的框架用二进制微码打补丁的。checksum函数执行一个包含以下操作的循环。

首先,迭代计数器被增加,并检查是否达到了最大迭代次数。然后,从存储器中读取 VF 数据块 D,读取位置由当前校验值 C 定义,用作偏移量:D=data_ptr+(4×C mod data_size)。读取完成后,将其包含在校验和中 C+=D。
从主存储器中读取可能需要 250 – 500 个周期才能完成。GPU 编译器为此指令设置了读取屏障,GPU 将计算管道停滞,直到读取完成。我们开发了一种指令模式,用于在等待内存读取完成时执行(“忙等待”)。我们使用交替执行的(见第6.3节)X+=X<<N 和 X+=X>>N 的 IMAD(FMA)和 LEA.HI(ALU)指令,其中 X 是任何 32 个寄存器中的一个。
这种计算的安全性取决于是否存在可以更快地计算结果的替代指令序列。我们预期,对于一些长序列或选择不当的移位量的情况,可能会找到类似于 xorshift 伪随机数生成器(PRNG)[45] 中跳跃前进函数的捷径。为了防止这种捷径,我们通过需要中间值的实现来分割长序列,其中包括在校验和中的随机内存访问来打断它们。我们的目标是使序列的长度足够长,以至于实施捷径的成本高于执行实际计算。
在更新校验函数之后,我们计算自修改代码,该代码由以下二进制指令组成:C+=C>>N,其中立即数 N 取决于当前的校验值。我们用校验和的当前值覆盖立即参数。因此,对于每次迭代,N 的值都会变化,并确保我们正在执行验证的代码。为了避免在更新这些指令的立即值时出现竞争条件,这些指令需要位于不同的内存区域中的每个线程块中。

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值