這篇是我做 RKA 的實作整理,僅作研究用途。
- 線上播放(GitHub 附件):
rka-demo.mp4
- RKA Demo 影片(MP4, 24 MB):
rka-demo.mp4
- 一開始先顯示 Google Play 版本資訊,並顯示 TrickyStore 設定狀態為不攔截 Play Services。
- 透過 key attestation 顯示目前裝置是 BL。
- 使用 Google Play Integrity API Checker,結果僅取得
BASIC認證。 - 切換為自訂的 TrickyStore 設定後,使用 remote key attestation 進行簽署。
- 可以透過 key attestation app 顯示狀態變成
RemoteKeyProvisioner (RKP)。 - 最後成功取得
STRONG_INTEGRITY。
Android 的 Key Attestation 是「裝置可信度」的重要依據。近年開始大量導入 RKP(Remote Key Provisioning),使憑證鏈的來源從「裝置內部」轉向「遠端配發」。這改變了風險模型,也影響驗證端該如何判斷可信度;因此我把重點放在 RKA 的實作可行性 與 實際運作狀況。
下面是測試環境的基本資訊,不包含任何實作細節:
- 測試日期:2026-02-07
- 測試 App 版本:Google Play 49.9.19-31
- 影片:我會附上可公開的運作影片(不含技術細節)
flowchart TB
subgraph Device["Device / System Space"]
Vending["com.android.vending"]
GMS["com.google.android.gms"]
PIService["Play Integrity Service"]
App["App"]
TrickyStore["TrickyStore"]
App -->|"PI req"| Vending
Vending -->|"delegate"| GMS
GMS --> PIService
TrickyStore -. "intercept" .-> Vending
TrickyStore -. "intercept" .-> GMS
end
RKA["Remote Key Attestation"]:::external
PIBackend["Play Integrity Backend"]:::external
PIService -->|"attest"| RKA
PIService -->|"check collected data"| PIBackend
PIBackend -->|"verdict"| PIService
PIService --> GMS --> Vending -->|"PI res"| App
classDef external fill:#fff,stroke:#999,stroke-width:1px;
註:此流程是簡化版本
GuardSquare 的公開研究報告:
https://www.guardsquare.com/blog/bypassing-key-attestation-api
PlayStrong 的公開流程圖
https://t.me/meetstrong/107
TrickStore
https://github.com/5ec1cff/TrickyStore
- GitHub:@lokey0905