小米MIUI Powerkeeper應用程式中的Zip Slip任意檔案覆蓋漏洞

概述

小米MIUI Powerkeeper應用程式中的Zip Slip任意檔案覆蓋漏洞

MIUI(米柚)是小米公司旗下基於Android系統深度最佳化、定製、開發的第三方手機作業系統。Powerkeeper應用程式是一款預裝在一系列MIUI裝置上的系統app。

研究人員在Powerkeeper應用程式中發現了一個任意檔案覆蓋漏洞,該漏洞是由於其配置檔案提取的不安全實現導致的,具有篡改配置檔案許可權的攻擊者能夠以系統使用者身份在裝置上寫入任意檔案。

此外,由於配置檔案是使用純HTTP連線下載的,沒有進行完整性檢查。這使得同一網路上的攻擊者可以透過MITM中間人攻擊篡改可下載的配置檔案。

技術細節

Powerkeeper應用程式的“CloudUpdateJobService”透過“com。miui。powerkeeper。utils。ThermalStoreUtils”類中定義的“downLoadConfigureDefault”函式在後臺檢查更新,這會觸發裝置上配置的熱更新。

配置檔案是從“http://file。market。xiaomi。com/download/”下載的,其中“exloc”值是從另一個託管在“https://ccc。sys。intl。xiaomi。com/api/v1/base/profile/thermal/thermal_config_path/”的CDN伺服器中讀取的。

由於配置檔案是透過純HTTP連線下載的,應用程式中沒有對其進行額外的完整性檢查,使得同一網路上的攻擊者可以透過MITM中間人攻擊篡改可下載的配置檔案。

下載配置檔案後,會透過“FileUtil。unZipFile”函式進行不安全解壓縮,該函式由“com。miui。powerkeeper。utils。ThermalStoreUtils”類中定義的“unZipConfig”函式觸發。不安全解壓函式的程式碼片段如下所示:

entry = (ZipEntry)entries。nextElement();if(!entry。isDirectory()) {        v5 = zipfile。getInputStream(entry);        bis = new BufferedInputStream(v5);        File v8 = new File(unzip_dir + File。separator + entry。getName());        File v0_13 = v8。getParentFile();        if(v0_13 != null && !v0_13。exists()) {                v0_13。mkdirs();        }            fos = new FileOutputStream(v8);        v0_10 = new BufferedOutputStream(fos, 0x800);        byte[] v1_4 = new byte[0x800];        while(true) {                int v2_2 = bis。read(v1_4, 0, 0x800);                if(v2_2 == -1) {                        goto label_200;                }                        v0_10。write(v1_4, 0, v2_2);        } }

從以上程式碼片段中可以看出,解壓縮的檔案路徑是透過字串連線構建的,使用zip條目的路徑,並且沒有對檔案路徑進行檢查。這將構成“Zip Slip”漏洞,該漏洞其實也是目錄遍歷的一種,可透過應用程式解壓惡意的壓縮檔案來進行攻擊。利用該漏洞,攻擊者能夠以系統身份覆蓋應用程式的合法可執行檔案或配置檔案。

請注意,透過將“android:sharedUserId”屬性設定為“android。uid。system”,Powerkeeper應用程式也以系統使用者身份執行。這可能會導致嚴重的系統漏洞,因為攻擊者可能會覆蓋系統使用者擁有的檔案(如果不受 SELinux 保護)。

影響

同一網路上的攻擊者可以濫用Powerkeeper應用程式以系統使用者的身份在裝置上寫入任意檔案。

緩解措施

建議受影響的使用者儘快檢查上述的不安全實現,確保在執行任何敏感檔案操作之前會對檔案路徑進行驗證,還可以對下載的配置檔案實施完整性檢查。小米已於2021年4月13日獲悉此安全漏洞,該漏洞被記錄為CVE-2021-0501。