Abstract

作者的目标是对trustlet的command handler函数进行AFL测试。

作者设计了一个loader程序,可以在Android设备的normal world加载并运行trustlet。为了解决syscall的处理问题,作者向QSEOS中加载修补过的trustlet副本作为proxy trustlet。为了能够加载被修补过的代码,作者利用了两个1day漏洞来绕过QSEOS对trustlet的的校验流程。最终使用AFL测试工具完成了测试。

Backguard

在普通世界中运行TA

基本思路

创建一个运行在normal world用户态的程序(trustlet loader),它:

失败原因:

待解决问题:

  1. 如何获取安全世界中,trustlet和cmnlib的基地址
  2. 如何dump trustlet和cmnlib的数据段
  3. 如何能在normal world执行trustlet中的syscall

解决方案

Untitled

修补加载到安全世界中的trustlet

通过字节码修补创建一个proxy trustlet。扩展现有trustlet的command handler函数,增加一个自定义的command ID,例如0x99,这个command ID所提供的服务是:

  1. 返回trustlet的基地址
  2. 从secapp区域中读取内存
  3. 向secapp区域中写入内存
  4. 执行一个请求指定的的syscall

前三个自定义功能,能够帮助我们获得cmnlib的数据段地址(例如对于prov这个trustlet,cmnlib的数据段地址被存储在0x83D4偏移处,这种方法是通用的、每个trustlet都可以访问cmblib的内存)。

新的command ID的处理代码,提供了上面提到的那些功能

新的command ID的处理代码,提供了上面提到的那些功能

重定向syscall

修改qemu,使其能够特殊处理SVC 0x1400SVC 0x14F9,将normal world发来的syscall转发到proxy trustlet里。

栈地址不一致问题

在设计之初,normal world的trustlet和secure world的proxy trustlet具有不同的栈地址,本质是loader并没有为调用cmd_handler()设置独立的栈地址。这对于程序的运行没有影响,但是由于syscall的参数可能包含指向用户空间栈上内容的指针。为了确保QSEOS在处理syscall时能够访问到正确的数据,必须在secapp地址范围内为cmd_handler()初始化一个栈,它们都能访问到的地址范围。解决办法是由loader扩展trustlet的数据段(data segment),在跳转到command handler之前,先将loader的SP寄存器指向数据段的末尾。

prov这个trustlet具体的修补

如何加载运行修补后的proxy trustlet?

从启动流程来看

Primary Bootloader(PBL, in ROM)Secondary BootLoader(SBL)Little Kernel applications bootloader && QSEOS->trustlets

即使unlock bootloader或者取得root权限也无法打破该流程。

使用漏洞

使用两个1-day漏洞CVE-2015-6639、CVE-2016-2431,从而作者得以修改Nexus 6设备上的QSEOS的数据段。作者攻击了QSEOS的验证机制。具体来说:

Untitled

Fuzzing of trusted app

到此为止,作者在Android上结合qemu通过模拟的方式运行了一个trustlet的command handler。另外将一个被修补过的trustlet副本作为proxy trustlet加载到真实的QSEOS中。

使用AFL工具测试TA的command handler,并在安装最新rom的Nexus 6设备上发现了prov这个teustlet的一个漏洞。

测试别的设备上的trustlet

在Nexus6上运行新的设备上的trustlet,所要付出的努力,比在新设备中利用类似的QSEOS漏洞来创建这样的测试环境要简单的多。

作者提出了两种测试方法:

  1. 重用之前的由prov这个trustlet修补成的proxy trustlet,作为新的trustlet在QSEOS中的代理
  2. 以每个新的trustlet作为基础进行修补产生proxy trustlet,加载到QSEOS中作为代理

作者使用第二种方法,通过改编LG和三星设备中的trustlet,然后将其在Nexus6上部署,测试发现了额外的几个漏洞:

dxhdcp2 (LVE-SMP-190005), sec_store (SVE-2019-13952), authnr (SVE-2019-13949) and esecomm (SVE-2019-13950), kmota (CVE-2019-10574), tzpr25 (acknowledged by Samsung), prov (Motorola is working on a fix).