摘要
如今人们经常在手机上进行账号登录、金钱交易等安全敏感的操作。为了保护这些操作,手机需要能把可信和不可信的程序有效隔离开来。于是,手机厂商通过ARM TrustZone硬件隔离技术实现了“可信执行环境”(Trusted ExecutionEnvironments)。TrustZone为手机上所有安全敏感的程序和数据提供了至关重要的一层保护,一旦TrustZone被黑客攻破,整个手机的安全性都会受到威胁。然而,近日弗罗里达州立大学(FloridaState University)和百度安全实验室联合研究发现,TrustZone的底层安全系统(TrustZone OS,简称TZOS)和上层安全应用(TrustZone App,简称TA或者Trustlet)都存在降级攻击的风险——攻击者在TrustZone之外,可以用低版本TZOS/Trustlet替换当前手机上运行的版本,然后利用低版本TZOS/Trustlet的漏洞攻入TrustZone。经验证,包括华为、三星、Google等厂商的多款很流行的手机都存在这一漏洞。经研究者的不懈努力和厂商的积极配合,目前包括华为在内的几家厂商已着手进行修复。
背景
TrustZone是ARM提供的硬件安全隔离技术 [1],它将手机隔离成两个世界:可信世界(Secure World)和不可信世界(Normal World),两个世界通过Secure Monitor切换和通信,如图 1所示。一般人们习惯直接用“TrustZone”等价指代“Secure World”。
图 1:ARM TrustZone安全隔离示意图
以Android为例,应用程序(Apps)、Android系统、以及底层的Linux内核都运行在Normal World里,而诸如数字版权保护(Digital Rights Management,简称DRM)和一些登录、支付协议的加解密过程和数据则存在于Secure World/TrustZone里。Secure World/TrustZone里的程序可以自由访问Normal World里的内容,但反过来是禁止的。因此理论上,即便攻击者攻陷了Normal World里的组件,也无法偷盗或篡改TrustZone里的内容。
不过,Trustlet(可信世界里的安全应用程序)和TZOS(可信世界里的安全操作系统)并非固化在硬件里的。其中,Trustlet是可以运行时从Normal World动态加载的,TZOS是包含在手机ROM里跟着OTA(Over-the-air Update)升级一起更新的。为了防止攻击者篡改或替换Trustlet和TZOS,一般手机厂商都用私钥对它们做了签名,并在手机上植入相应的公钥进行签名验证,保证Trustlet和TZOS一定都是厂商自己发布或信任的。具体而言,TZOS的签名验证发生在启动阶段,由Bootloader验证,一旦发现验签失败会拒绝继续启动过程;而Trustlet的签名验证发生在它们的动态加载阶段,由TZOS完成,一旦验签失败则不允许执行。
漏洞描述
如前所述,一般手机厂商均对TrustZone里的Trustlet和TZOS做了签名和验签,有效地防止了它们被篡改。但是,根据弗罗里达州立大学(Florida State University)和百度安全实验室的联合研究,主流手机厂商均没有对Trustlet和TZOS的版本号做校验。理想情况下,Trustlet和TZOS升级时只能用新版本覆盖旧版本(版本号只能增大),但实际实验发现,包括华为、三星、GoogleNexus等厂商的多款很流行的手机并没有做这一检查。因此,只要攻击者拿到了手机Root权限(攻陷Normal World),他可以用有可利用漏洞的Trustlet/TZOS旧版本覆盖当前Trustlet/TZOS,然后通过既有漏洞的利用进一步攻陷TrustZone。虽然研究者只在有限的机器上做了验证,但考虑到这几个主流厂商的核心机型全军覆没,研究者预计这是一个广泛影响所有Android设备的安全问题。
漏洞实例
以Google Nexus 6为例,其旧版本的DRM Trustlet存在可以让Normal World攻击者获得TrustZone执行权限的CVE-2015-6639漏洞 [2],并且已有公开的漏洞利用代码 [3]。经实验发现,尽管当手机升级之后(例如更新到N6F26Y这一编号的ROM)这一漏洞得到了修复,但拥有Root权限的攻击者仍然可以用旧版(例如LMY48M这一编号的ROM)中提取的Trustlet覆盖新版Trustlet,并成功将其运行起来。一旦旧版Trustlet运行在了TrustZone里,攻击者即可发起既有攻击拿到TrustZone的执行权限。因此,即便手机进行了升级和漏洞修补,仍然没有阻止攻击者进入TrustZone。
类似地,针对TZOS也可以做类似的降级攻击。研究者用旧版ROM里提取的TZOS覆盖了升级之后的手机里TZOS所在分区,手机仍然通过了Bootloader验证、能够正常启动。攻击者可以因此攻击TZOS的漏洞动态获得TrustZone里的内核权限——攻击者这样就可以获得一切藏在TrustZone里的秘密和能力。
解决方案与漏洞公开
既然漏洞是由版本降级引起的,最直接的解决方案便是在Trustlet/TZOS升级替换时进行版本检查,只允许新版本覆盖旧版本。弗罗里达州立大学(Florida State University)和百度安全实验室的研究者联系了实验中验证的所有设备的厂商,在厂商的积极配合下,目前包括华为在内的几家厂商已着手进行修复。考虑到这几个主流厂商的核心机型全军覆没,研究者预计这是一个广泛影响所有Android设备的安全问题,因此将漏洞细节予以整理和公开 [4][5]。目前已有国内外媒体对此问题进行了关注和报道 [6][7]。Google Project Zero也独立地对这一问题进行了研究和披露 [8]。希望各大Android厂商对这一问题引起重视,尽快进行全面地修复。此外,一些厂商逐渐在手机上引入Security Enclave处理器,相当于在TrustZone之下引入一层额外的隔离和保护。Security Enclave如果设计或实现时考虑不当,也会面临同样的威胁,因此也希望厂商予以注意。
参考文献
[1]http://www.arm.com/products/processors/technologies/trustzone/index.php
[2]https://nvd.nist.gov/vuln/detail/CVE-2015-6639
[3] https://github.com/laginimaineb/cve-2015-6639
[4] https://arxiv.org/abs/1707.05082
[5] https://arxiv.org/pdf/1707.05082.pdf
[6] https://www.bleepingcomputer.com/news/security/trustzone-downgrade-attack-opens-android-devices-to-old-vulnerabilities
[7] http://bobao.360.cn/news/detail/4292.html
[8] https://bugs.chromium.org/p/project-zero/issues/detail?id=1167
原文可点击“阅读原文”查看