Check Point研究人员小米手机TEE中发现一个安全漏洞。
Check Point 安全研究人员在依赖联发科芯片提供可信执行环境(TEE)进行签名的小米手机中发现一个安全漏洞,攻击者利用该漏洞可以使用第三方没有权限的应用对虚假支付包进行签名。
在小米使用的可信APP格式中发现一个安全漏洞,漏洞CVE编号为CVE-2020-14125,漏洞产生的原因是由于缺乏版本控制。攻击者利用该漏洞可以实现降级攻击,即攻击者可以使用老版本、有漏洞版本的APP替换新版本、安全的APP。
TEE
TEE可以创建可信操作系统管理的虚拟安全环境,用于运行可信APP。可信APP实现特定的安全特征。普通操作系统可以发送命令给可信APP,并接收响应,如安卓系统。
基于高通芯片的小米设备使用QSEE可信操作系统,基于联发科芯片的设备使用的是Kinibi TEE架构。在这两类芯片中,小米都嵌入和签名了自己的可信应用。TEE可以创建单独的虚拟空间用来存储对交易进行签名的安全密钥。
可信APP文件格式
小米设备可信APP保存在/vendor/thh/ta目录下,每个APP都是未加密的二进制文件。Kinibi OS的可信APP一般是MCLF格式。但小米APP二进制文件是ELF文件格式。
图 可信APP格式
可信APP可以被降级
可以看出,可信APP的文件格式中没有版本控制域。也就是说攻击者可以用可信APP的老版本来覆写新版本的APP文件。因为老版本APP的签名是正确的,所以仍然可以在TEE中成功加载。
因此,攻击者可以绕过小米或联发科在可信APP中的安全更新,并将其降级为未修复的版本。
研究人员在运行MIUI Global 12.5.6.0 OS的测试设备上用从运行MIUI Global 10.4.1.0 OS的设备上提取的老版本成功覆写了thhadmin可信APP。虽然老版本thhadmin APP的代码与原版本不同,但仍然成功启动了。
寻找可信APP中的漏洞
小米遵循了GlobalPlatform TEE客户端API规范,其中定义了客户端与TEE的通信API。该API在/vendor/lib/libTEECommon.so 库中实现。小米在实现可信APP时遵循GlobalPlatform TEE Internal Core API规范。每个APP都会导出TA Interface”,这是创建APP实例的、通知实例有新客户端连接、通知实例有客户端调用命令的入口点。
研究人员对可信APP进行模糊测试发现了多个安全漏洞,攻击者利用这些安全漏洞可以泄露保存的密钥、或在APP环境下执行代码。比如,下图中的堆溢出,攻击者可以用0x42424242地址的数据覆写0x41414141字节的堆内存。
图 构造的输入缓存
腾讯Tencent Soter
小米设备内嵌了一个名为Tencent Soter的移动支付框架,为第三方安卓应用提供融入支付能力的API。Tencent Soter是腾讯公司的软件平台,主要功能是对移动APP和远程后端服务器之间传输的支付包进行验证。Tencent soter架构如下所示:
图 Tencent soter架构
在Tencent soter中有三级密钥:设备密钥(ATTK)、应用密钥(ASK)、业务密钥(Authkey)。这些密钥都是RSA-2048非对称密钥,并且由TEE进行安全保护和存储。
ATTK私钥是在设备出厂前由TEE生成的。公钥安全地传输到腾讯的TAM服务器,私钥保存在TEE中。第三方APP可以要求在TEE中生成ASK密钥。密钥对生成后,私钥就保存在TEE中,公钥和ATTK签名就返回给APP。然后APP将密钥和签名发送回后端服务器。TAM使用ATTK公钥验证包的合法性。如果合法,第三方就会在服务器上保存ASK公钥。AuthKey的生成与ASK非常类似,唯一不同的是第三方APP会使用ASK公钥检查AuthKey的合法性。
所有的关键数据存储和操作都是依赖于TEE中。但是Tencent soter并不提供TEE相关的代码,实现是由芯片或设备厂商完成的。
Soter可信app中的安全漏洞
在开始签名时,soter app会提供一个initSigh (command ID 0x100C)函数来接收AuthKey name和挑战字符串作为参数。Tencent soter定义了AuthKey name是多个永久字符串的连接,比如进程ID、支付场景id,比如“Wechatuid777777_demo_salt_account_1_scene1”。
initSigh handler 会连接密钥名和挑战到一个固定大小的缓存中,但是并不会检查是否溢出。代码如下:
因此,攻击者可以提过一个大于0x198字节的挑战或大于0x8C字节的密钥名来覆写堆内容。
Soter APP奔溃后,就可以在安卓kernel日志中发现部分加密的内容:
然后,攻击者可以利用该漏洞来执行特定代码,或提取soter私钥。soter私钥泄露后,攻击者就可以在soter可信APP中执行任意代码或对伪造的支付包进行签名。
漏洞CVE编号为CVE-2020-14125,小米已于2022年6月修复了该漏洞。
完整技术细节参见:https://research.checkpoint.com/2022/researching-xiaomis-tee/