TRUSTFLOW:降低DFI内存开销的硬件DFI机制
一句话概述
设计了低开销细粒度的DFI硬件机制,对软件开销影响度为0%
主要功能
一个旁路的硬件设备,备份内存中的敏感数据,可以跟踪数据流完整性、检测内存漏洞、记录异常,敏感数据被篡改时还原数据。
主要贡献
- 提出TRUSTFLOW:一个具备针对数据细粒度预防、检测和处理基于内存漏洞的新概念
- 采用RISC-V架构的TRUSTFLOW的硬件实现,使用Chisel中的Rocket Chip generator生成
- 扩展RISC-V GNU指令:新增了两条保护内存敏感数据的指令
- 修改了RISC-V GNU工具链,使得3中的两条指令可以应用于编译器
- 评估:使用生命关键型应用进行评估
TRUSTFLOW
前提假设:系统上运行的软件包括缓冲区溢出、off-by-one或格式化字符串等漏洞,且软件皆以经过静态认证,且不包含任何恶意软件。
rowhammer和侧信道攻击不计入本实验讨论范围
核心理念:检测攻击的过程应与保护关键系统的敏感数据一样重要
详细设计
添加一块可信内存,TRUSTFLOW提供自定义加载和自定义存储。该内存备份普通内存中的敏感信息(如令牌、返回地址、指针、迭代数据等),该内存中不仅保存敏感信息的地址,还保存敏感信息的值。当普通内存中的敏感数据安全更新时,可信内存也一同更新(保护敏感数据)
使用转译后备缓冲区(TLB)作为信任内存,该内存通过单个时钟实现查找表提供高速搜索功能,该内存速度与L1缓存一致,因此不会产生多余开销
为优化空间使用,TRUSTFLOW会删除属于堆栈中已释放地址的受信任内存条目
新增指令:sws和lws,这两个指令继承经典sw和lw的功能,并可以与可信的转译后备缓冲区TLB(可信内存)交互
- sws rs, imm(rd):存储一个字并在可信内存中复制一份(特权级指令)
- lws rd, imm(rs):加载一个字并使用可信内存中的数据检查其完整性(特权级指令)
指令使用时,在存储阶段,管道检测到自定义指令信号(“mem_reg_inst信号“)。然后,增加的逻辑会检索管道中用于处理敏感字(“io_req_bits_addr“,“io_dmem_resp_bit_data“)和敏感地址(“memAddr“)的信号,这些信号需要存储、检测到可信内存或从可信内存中取出。最后,在使用可信内存执行决策性操作之前,管道的最后会检查这些自定义指令的有效性来确保不会将不稳定的数据放入可信内存中。
内存访问阶段
- 使用“mem_reg_inst”信号检测自定义指令
- 从ALU输出中检索加载/存储字的地址(“io_req_bits_addr信号“)
- 对于sws指令,要存储在内存中的字在”mem_reg_rs2”信号中处理
- 扩展等待回写阶段以确认指令的有效性
回写阶段
在阶段1中使用lws指令内存加载的字由”io_dmem_resp_bit_data”信号中的影子逻辑收集
如果自定义指令在这个阶段有效,那么相应的操作将由影子逻辑继续执行
- sws:在”mem_reg_rs2”中包含的字与”io_req_bits_addr”中包含的地址将被发送到信任内存(TLB)中
- lws:将”io_dmem_resp_bit_data”信号中包含的字与影子内存中的”io_req_bits_addr”地址处的字进行比较,若出现差异,则引发数据流异常
可信TLB的输出接口直接连接到核心异常和处理器上的寄存器堆。当发生异常时,操作系统可以记录并报告异常;同时,损坏的数据在写入寄存器堆之前被可信TLB中的健康数据替换。如果管道中内存访问阶段或执行阶段存在危害,则健康数据将从回写阶段转发到内存访问阶段或执行阶段。
编译器支持
自定义指令支持被移植到RISC-V GNU工具链,添加的指令没有用过多代码。预定义部分添加代码如下:
- “MASK“值定义了指令中固定的位
- “MATCH“用于定义由”MASK”设置的固定位的位值。
可以看到,”MASK”和原先的值是一样的,它们通过不同的”MATCH”进行区分。
基于TRUSTFLOW的安全策略
TRUSTFLOW的策略是灵活的,可以实现影子堆栈和指针完整性
影子堆栈
函数调用时,函数地址放置在调用堆栈和影子对战中;函数返回时,返回地址同时从调用堆栈和影子堆栈弹出,若两个值不同,则检测到内存冲突。下图右侧为使用了TRUSTFLOW实现的影子堆栈:
TRUSTFLOW可以解决影子堆栈经典[setjmp/longjmp](https://zhuanlan.zhihu.com/p/464553050)失败问题。当长跳转时,影子堆栈中的返回地址与调用堆栈的返回地址大概率不匹配;而TRUSTFLOW的设计中,只在重新访问敏感数据时检查数据完整性,而不会出现在返回过程中。
指针完整性
通过篡改函数指针(间接调用)达到破坏控制流是常见做法,TRUSTFLOW可以通过指令级操作完成对函数指针的保护。
其弊端是需要开发者选择敏感指针进行保护,对开发人员专业素养要求很高。
循环监测和通用数据
部分攻击针对循环迭代数据,使程序失常。通过控制循环,攻击者可能会溢出缓冲区或从内存中泄露一些秘密字节。
上图右边使用定制化指令进行数据保护(使用影子内存),可以降低循环中非控制数据攻击的有效性。
评估
- 影子逻辑所用范围
- 使用[”very secure pump model”](https://github.com/r3glisss/SecPump)等生命关键软件挑战TRUSTFLOW
- 软件层面,评估用于2类应用程序的信任内存的百分比
VSPM实验结果
测试环境:存在内存损坏漏洞的VSPM,允许攻击者控制执行流,能够改变关键设备的行为并注射致命剂量给患者。
应用有:4205条指令,89个函数、1000+行C代码
结果:程序正常运行,保护的敏感数据约为0.25KB
不足
- 空间换时间:所需额外的TLB空间不小
- 没有良好分析工具:该方法当下只能手动选取敏感节点替换”lws”和”sws”
Referred in 研究生毕设
发表评论