三星TIMA方案利用Trustzone安全模块对普通世界操作系统内核提供运行时完整性保护,即使操作系统被攻击者控制,也无法(1)修改原有合法内核代码(2)注入新的内核恶意代码(3)实施return-to-user攻击,将用户空间恶意代码在内核层运行。
这种设计思路的最大挑战在于正常世界对自己的系统资源具有完全的控制权,如物理内存,页表及相应的控制寄存器,一旦操作系统被敌手攻破,完全可以通过修改页表配置改变原有内存访问权限,将只读内核代码段修改为可写,或将位于数据或堆栈区域插入的恶意代码修改为可执行。因此TIMA方案的核心思路是:通过安全的初始化过程使内核代码段在系统初始化后映射为只读,并移除操作系统对自身虚拟内存管理(MMU)相关配置的修改权限(包括页表entry,TTBR寄存器等),页表更新操作只能由安全世界验证并代为执行。
为修改现有的页表映射属性配置,攻击者必须执行以下操作之一来绕过安全世界的监控功能.
1)直接修改当前页表内容,修改监控代码对应页表表项的映射属性为可写;
2) 禁用MMU,直接修改监控代码的物理页面;
3) 篡改页表基址寄存器TTBR的值,使其指向敌手伪造的页表,破坏监控代码页的写保护;
4)将包含监控代码的物理页面映射到可写的虚拟地址,即双重映射攻击;
5)禁用WXN保护,注入重写的系统功能;
6)取消进程用户地址空间的PXN映射属性.
其中,WXN,MMU,TTBR通过CP15安全协处理器的相关控制寄存器设置.由此可见,敌手需要通过修改相应页表表项和相关控制寄存器,来消除虚拟内存保护机制对内核代码区的保护.
修改相关控制寄存器(MMU,WXN,TTBR)的指令和页表更新操作.ARM架构提供专门修改控制寄存器的指令(ldc和mcr),直接将内核代码中的这2类指令替换为smc指令即可.这类监控点触发时,安全世界需确保:
1)所有关闭MMU保护的操作被禁止.
2)所有关闭WXN保护的操作被禁止.
3)对于更新页表基址寄存器(TTBR)的操作,安全世界需首先确保新页表基址与某一合法进程sw_pcb中保存的页表基址一致,即确保此操作发生在正常的进程切换过程中.如果是进程创建后首次调度产生的TTBR切换,安全世界要确保新进程页表内容不违背正常世界地址空间的权限策略,即内核代码区域必须映射为只读,用户地址空间映射必须包含PXN属性,且对于包含内核代码的物理内存,不能以可写方式映射到其他虚拟地址,这要求安全世界记录所有内核代码对应的物理内存页地址.如果上述策略检查通过,则允许TTBR更新操作执行,否则禁止.
对于修改控制寄存器的操作,ARM提供专门的指令,而页表更新的操作是通过普通的内存读写指令完成的,安全世界无法区分内核对于页表的更新和对非页表内存的更新,而在所有内存写操作处插入监控点会导致监控事件频繁触发,严重影响效率,因此不能通过识别内存写指令的方式部署对页表更新的监控点.TIMA借鉴虚拟化技术中影子页表的管理机制,强制所有包含页表的物理内存映射为只读,每次内核更新页表时,将由于页权限错误产生数据中止异常,跳转到异常向量表执行异常处理程序.因此在异常向量表的数据中止异常处插入一个监控点,即可确保所有的页表更新被安全世界拦截.为保证所有页表内存被映射为只读,安全世界需要在TTBR切换和页表更新监控点中加入新的安全策略,即确保所有页表物理内存为只读且不存在可写的多重映射.这要求安全世界在所有页表创建时,记录其物理地址.ARM-Linux默认采用二级页表格式,对一级页表,其创建发生在内核初始化自身页表swap_pg_dir,并尝试将其写入TTBR时,或进程创建后首次调度,进行TTBR切换时.对二级物理页表,其创建发生在一级页表更新事件中,两者都可以被已有监控点拦截,从而确保上述策略能够被安全世界有效验证.页表更新陷入安全世界的流程如下图所示
在数据中止异常监控事件触发时,安全世界需要对3种不同情况分别进行处理:1)当异常由系统正常功能触发时,如进程创建时的写时拷贝机制,安全世界跳转到正常世界相应的处理函数处即可.2)当异常由合法的页表更新请求触发时,如mmap系统调用,安全世界获取调用参数代替内核完成页表更新操作.虽然页表内存在正常世界中映射为只读,但2个世界具有独立的地址空间映射,安全世界可以将正常世界物理内存映射到自身地址空间中进行修改,因此可以代理页表更新操作.3) 对于其他页表更新请求,安全世界需执行与TTBR修改操作相同的策略检查.安全世界可以读取正常世界的错误地址寄存器(data fault address register, DFAR),错误状态寄存器(data fault status register, DFSR)来获取出错地址和错误类型,以此区分上述3种情况.
综上所述,需要在正常世界内核中插入2类监控点:控制寄存器修改(MMU,WXN,TTBR),数据中止异常,设置相应页表映射权限策略,即可确保内核代码的运行时完整性保护.
4267



被折叠的 条评论
为什么被折叠?



