Fix Play Integrity on rooted Android phones.
本文Ivon教學如何在Root裝置通過Play Integrity。
測試環境:Sony Xperia 10 V,LineageOS 23 (Android 16),已解鎖Bootloader。

1. Play Integrity原理 #
(如果你對原理沒興趣請直接跳下一段)
根據官方文件,Play Integrity API是Google提供的安全性機制,用於讓APP開發者能夠驗證是否執行於無篡改的環境,保護APP的安全性。
Play Integrity API會透過各種方式(或稱「訊號」)評估裝置是否可信任,包括在本機進行評估,還有連線到Google伺服器進行比對。APP會透過Play Integrity API確認結果,才決定是否要讓你使用他們的服務。最常見的例子就是Google Wallet了,一旦偵測到Root環境,還有Play Integrity不通過,就會拒絕付款!
Play Integrity API底層技術,其中一部分依賴Android系統的Android Key Attestation,這是AOSP共通的標準。它可以透過手機硬體隔離區的TEE(可信執行環境)生成一對不可偽造的密碼學金鑰與憑證鏈,藉此向外界(Google伺服器、銀行、遊戲等APP)證明該裝置的「硬體真實性」與「系統完整性」未經竄改。
粗淺的來說,Play Integrity分爲以下等級,越後面的越難通過。而且就算你全部通過了,APP可能還是會檢查其他面向來偵測你是否有Root。
- NO_INTEGRITY
- MEETS_BASIC_INTEGRITY
- MEETS_DEVICE_INTEGRITY
- MEETS_STRONG_INTEGRITY
通常解鎖Bootloader或者Root後的裝置會顯示為NO_INTEGRITY,因爲Google認定你裝置不可信。
有些APP會看Play Integrity有沒有達到MEETS_DEVICE_INTEGRITY或MEETS_BASIC_INTEGRITY才給用。金融類的APP通常會要求最高安全等級的MEETS_STRONG_INTEGRITY。
MEETS_BASIC_INTEGRITY #
MEETS_BASIC_INTEGRITY是檢查你的手機有無Root環境,包括針對Magisk和Xposed的檢測。Google並未公開所有判定依據,這方面是黑箱作業,反正Google肯定有在盯著Root社群看大家在玩什麼新花樣。
要通過這個等級比較簡單,僅僅是確認你的手機的Root環境不要被Play Integrity API發現就行了。不會要求要有keybox.xml。
MEETS_DEVICE_INTEGRITY #
MEETS_DEVICE_INTEGRITY會檢查手機的指紋ro.build.fingerprint以及安全修補等級ro.build.version.security_patch是否與出廠時提交給Google伺服器的相符。
在Android 13以下系統,因爲有的裝置缺乏Key Attestation的機制,Play Integrity API允許MEETS_DEVICE_INTEGRITY認證指紋,硬體金鑰不可用的時候回退到軟體金鑰,不需要做其他檢查。
要通過這個等級的話,駭客們提出的做法是搜刮許多舊Android機器的指紋來用,然後將系統版本僞裝成Android 13以下。
但是,Android 13以上的系統就不能這樣做了,Play Integrity API會開始查驗硬體金鑰。
MEETS_STRONG_INTEGRITY #
若要通過MEETS_STRONG_INTEGRITY的話,就得經過複雜的手續了,除了偵測Root還會抓解鎖Bootloader。
過去許多Android裝置在出廠時,OEM會將Attestation Key與對應的信任鏈(有些裝置採用keybox.xml格式)安全地佈署到硬體TEE或StrongBox裡面。Android 13之後的裝置多半採用Remote Key Provisioning (RKP),不再依賴傳統的keybox.xml。硬體TEE負責保護這些私鑰,並在需要進行Key Attestation時使用私鑰產生硬體簽章,而私鑰本身永遠不會離開TEE。
這個簽章的信任鏈組成是:Google Attestation Root Key → Vendor Intermediate CA → Device Hardware Key
若其中任何一張憑證驗證失敗,或者遭撤銷,或信任根不符,整個Attestation都會失效。
Play Integrity API會去檢查這個硬體簽章。如果keybox.xml標記爲尚未解鎖而且有效,裝置就能通過MEETS_STRONG_INTEGRITY。但,解鎖Bootloader後TEE就會自動標記Verified Boot State爲Unlocked導致失效。換言之,Play Integrity API只要檢查keybox.xml是否爲解鎖狀態,搭配其他訊號判斷,就能篤定你是否有解鎖Bootloader,從而拒絕通過。
所以我們可以說,要騙過Play Integrity API,得準備有效的且未標記爲解鎖的keybox.xml。
TEE會透過非對稱加密演算法給用keybox.xml的私鑰簽章,然後傳給Google伺服器做驗證。由於是通過硬體加密生成的簽章,非對稱加密在數學上無法逆向,沒有任何軟體能破解。故,駭客們只能去攔截Play Integrity API讀取keybox.xml的過程,他們透過軟體自行讀取外洩的合法keybox.xml並在外部完成簽章,最後假冒成硬體回傳的正確結果來欺騙Play Integrity API。
本來keybox.xml應該是在沒有解鎖Bootloader的手機才能取得的,但是駭客們透過技術手段將其取出(利用漏洞,或者從工廠大批次生產的OEM裡面偷),複製到其他裝置使用,藉此騙過Play Integrity API,讓它認爲你的裝置是可信的環境。
當然Google沒有那麼笨,一旦伺服器覺得你的金鑰異常,一個金鑰太多人用,就會撤銷認證。那因爲keybox.xml必須由Google簽署才可信,被撤銷後當然就整組失效了。使用者就得換新的金鑰。於是乎這就變成了貓捉老鼠的遊戲!
2. 先嘗試隱藏Root #
現階段要隱藏Root的話不推薦使用Magisk,請改用KernelSU的方案。
嘗試隱藏Root權限管理器的APP本身,例如將Magisk偽裝為其他套件名稱。或者使用Hide-My-Applist阻止特定APP讀取APP列表。
3. 通過Play Integrity步驟 #
Play Integriy有分多個等級,我們的基本目標是先通過MEETS_BASIC_INTEGRITY,大部分APP只要求到這個,這相對來說比較容易。長遠目標是達到MEETS_STRONG_INTEGRITY,這比較難達成,因爲需要有效的keybox.xml。通過Play Integrity的關鍵是紀載金鑰的keybox.xml檔案。
撰文當下,我認爲比較簡單方法是使用「TEESimulator」搭配「Tricky Addon Enhanced」,此模組會自動下載通過認證的keybox.xml並套用。由於keybox.xml可能隨時會被Google抓到後撤銷,因此需要定期更新新的keybox.xml。
-
這個模組需要Zygisk。請刷NeoZygisk這類的Zygisk模組,這個模組兼具隱藏自身Zygisk的功能。到Github Releases下載.zip檔案並刷入。重開機。
-
刷入TEESimulator模組,這個模組會修改Android Key Attestation機制,用軟體模擬硬體TEE行爲,使之能達到
MEETS_BASIC_INTEGRITY等級。另有更新比較勤勞的分支TEESimulator-RS。到Github Releases下載.zip檔案並刷入。 -
刷入Tricky Addon Enhanced模組,用於自動從Yurikey或KOWX712的倉庫取得keybox.xml,並給TEESimulator提供WebUI。到Github Releases下載.zip檔案並刷入,重開機。
-
在Root模組管理界面,開啟TEESimulator的網頁界面,點右上角,全選APP,按下保存。

-
點右上角,金鑰自動化 → 取得金鑰

-
點右上角,設置安全補丁 → 獲取安全補丁日期,自動,按下保存

4. 查看是否有通過Play Integrity #
我們將用開源的Simple Play Integrity Checker和Google Play本身作為檢測Play Integrity是否有通過的證明。
-
開啟Simple Play Integrity Checker,點選check查看Play Integrity狀態。有了
MEETS_DEVICE_INTEGRITY以上等級的話,對大多數APP來說已經足夠。
-
當然有
MEETS_STRONG_INTEGRITY更好。
-
開啟Google Play,點右上角設定 → 關於,在Play商店版本點七下,就會出現開發人員選項。
-
開啟Google Play,點右上角設定 → 開發人員選項 → Play Integrity,點選檢查完整性,有出現
MEETS_DEVICE_INTEGRITY以上等級的話就是成功了。
-
以上步驟確認完成之後,開啟系統設定,找到Play商店,點選清除應用程式資料。這樣Play商店才會讓你下載需要Play Integrity的APP。