Page 156 - 《软件学报》2020年第10期
P. 156
3132 Journal of Software 软件学报 Vol.31, No.10, October 2020
TaintDroid [99] 跟踪标记敏感数据传播,将片外 RAM 中受污染的敏感数据对象加密,访问时将其解密存储在片上
内存中.为避免频繁的加密操作,MemVault 使用 LRU(least recently used)算法将最常使用的对象保留在片上内
存中.该方案需要借助 ARM TrustZone 或 SMMU [100] 才能抵抗 DMA 攻击,并且因无法污染由本机代码处理的敏
感数据,而无法为这类数据提供保护.Oath 是一种针对 TrustZone 平台的敏感数据保护方案 [101] ,其思路是仅在
TrustZone 安全世界能够访问的片上内存中存储和处理敏感数据.在该方案中,内存拆分机制将可信应用划分为
敏感部分和非敏感部分,仅将敏感部分加载到片上内存中存储和处理,从而支持多个可信应用执行;动态片上内
存分配机制按需动态调整分配给安全世界的安全片上内存大小,将安全世界不使用的片上内存交给普通世界
使用,以减轻对通用操作系统的影响.Oath 将敏感 I/O 数据存储在安全片上内存中,从而为用户提供可信用户界
面.ZeroKernel 是在 GPU 片内存储隔离的上下文中执行轻量级任务的方案 [88] .在该方案中,ZeroKernel 的代码、
数据和页表分别加载到 GPU 片内存储 I-Cache、C-Cache 和 TLB 中,以形成驻留缓存的上下文,而 ZeroKernel
的代码地址转换和代码 PTE 则分别从 TLB 和设备内存中删除,以防止攻击者访问其代码页.为防止攻击者重构
GPU 上下文,ZeroKernel 将 GPU 页表内存位置随机化并持续检测页表基地址是否被修改.该方案的局限
是:ZeroKernel 代码大小不能超出 I-Cache 容量,并且由于 GPU 上下文信息已在设备内存中删除,ZeroKernel 不
支持多个 GPU 内核执行.一些嵌入式系统利用片上内存来抵抗物理攻击(数据移出片上内存时需要加密保护),
同时也利用片上内存的高速访问特性来存储高频访问数据以提高程序运行速度.韩国国民大学提出一种片上
内存高效分配方法 DynaPoMP [102] ,通过优化片上内存专用于敏感数据的内存比例来提高嵌入式应用程序运行
速度.DynaPoMP 使用经验方式来确定安全区域占用片上内存的比例:在各种比例情况下运行嵌入式应用程序,
统计程序运行时间,程序运行时间最短的即为最佳比例.这种片上内存划分方法只适用于程序比较固定的嵌入
式设备,对于运行程序种类繁多的设备则无效.
(3) 基于缓存的防护技术研究
CaSE 是弗吉尼亚理工学院暨州立大学为智能终端设计的抗物理攻击并且与移动操作系统隔离的安全解
决方案 [103] ,其利用 Cache-as-RAM 技术在 TEE(trusted execution environment)安全缓存内设计了包含数据段、代
码段以及堆栈的安全运行环境,利用 TEE 提供软件隔离,利用加密和完整性校验机制保证片外 RAM 抵抗物理
攻击;该团体同时发现具有 TEE 扩展的 ARM CPU 在 Cache 层面存在不一致现象,并利用该不一致现象成功在
Cache 中为 RootKit 构建执行环境 CacheKit,可躲避软硬件安全工具的检测.美国西北大学为嵌入式系统提出了
一种基于软件的总线加密方案 [104] .该方案借助操作系统的分页机制实现了对应用程序的保护.应用程序的内存
页被调用时,操作系统内核的页错误处理函数将该页从磁盘中读入片外 RAM,对该页解密,并利用缓存锁定技
术将其锁定在缓存中.当该页需要被踢出内存时,内核先将其加密,然后再放入磁盘.EncExec 方案 [105] 预留一块
专用缓存作为安全环境,然后制定如下规则来保护进程的机密数据:首先,预留所有映射到该缓存的物理内存
页,修改内核请求分页系统将这些内存页只映射给进程机密数据;其次,同一时刻使用专用内存页的总量不得超
过专用缓存,防止处理器因为缓存冲突将机密数据从缓存写回内存;最后,预留缓存必须被配置为 write-back 模
式,保证处理器不会将修改的数据写回内存.上述规则保证在任意时刻进程的机密数据只在缓存中以明文形式
存在,在片外 RAM 中则以密文形式存在.
(4) 基于寄存器的防护技术研究
美国莱斯大学提出使用寄存器在不可信操作系统中保护应用程序中敏感数据的方案 Ginseng [106] .该方案
的安全目标是敏感数据在运行时只能出现在寄存器中,并且使用它的函数一旦被切换,则函数切换上下文只会
以密文形式存在于内存中,从而不给物理攻击者任何攻击时机.Ginseng 设计静态保护和运行时保护机制实现上
述安全目标.静态保护实施在编译阶段,通过扩展编译器保证用户标记的敏感数据在编译后只存在于寄存器中,
不会出现在内存中.运行时保护机制实施在敏感数据所在的函数,在函数调用或上下文切换需要将寄存器存储
到内存中时,通过 ARM TrustZone 安全世界的一个安全服务将机密数据加密存储在安全堆栈上.希腊 FORTH 计
算机科学研究所基于静、动态插桩技术对内存操作指令进行监控 [107] ,然后以 XMM 寄存器作为中间存储对
CPU 加载/写回的内存进行解密/加密,从而实现对片外内存数据的机密性保护.该方案的缺点在于假设整个操