小米手機可信執行環境安全漏洞

語言: CN / TW / HK

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/