小米手機可信執行環境安全漏洞
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中有三級密鑰:設備密鑰(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日志中發現部分加密的內容:

漏洞CVE編號為CVE-2020-14125,小米已于2022年6月修復了該漏洞。