UICC 運營商特權

Android 5.1 引入了一種機制,為與通用集成電路卡 (UICC) 應用程序所有者相關的 API 授予特殊權限。 Android 平台加載存儲在 UICC 上的證書,並向由這些證書籤名的應用程序授予調用少數特殊 API 的權限。

Android 7.0 擴展了此功能,支持 UICC 運營商權限規則的其他存儲源,從而大大增加了可以使用 API 的運營商數量。有關 API 參考,請參閱CarrierConfigManager ;有關說明,請參閱運營商配置

運營商對UICC 擁有完全控制權,因此該機制提供了一種安全靈活的方式來管理來自移動網絡運營商(MNO) 的託管在通用應用程序分發渠道(例如Google Play)上的應用程序,同時保留設備上的特殊權限,而無需使用每個設備平台證書對應用程序進行簽名或預安裝為系統應用程序。

UICC規則

UICC 上的存儲與GlobalPlatform 安全元件訪問控制規範兼容。卡上的應用程序標識符 (AID) 為A00000015141434C00 ,標準GET DATA命令用於獲取卡上存儲的規則。您可以通過卡無線 (OTA) 更新來更新這些規則。

數據層次結構

UICC規則使用以下數據層次結構(括號中的兩個字符的字母和數字組合是對象標籤)。每條規則都是REF-AR-DO ( E2 ) 並且由REF-DOAR-DO的串聯組成:

  • REF-DO ( E1 ) 包含DeviceAppID-REF-DODeviceAppID-REF-DOPKG-REF-DO的串聯。
    • DeviceAppID-REF-DO ( C1 ) 存儲證書的 SHA-1(20 字節)或 SHA-256(32 字節)簽名。
    • PKG-REF-DO ( CA ) 是清單中定義的完整包名稱字符串,ASCII 編碼,最大長度 127 字節。
  • AR-DO ( E3 ) 被擴展為包括PERM-AR-DO ( DB ),它是代表 64 個單獨權限的 8 字節位掩碼。

如果PKG-REF-DO不存在,則任何由該證書籤名的應用程序都將被授予訪問權限;否則證書和包名稱都需要匹配。

規則示例

應用程序名稱為com.google.android.apps.myapp ,十六進製字符串形式的 SHA-1 證書為:

AB:CD:92:CB:B1:56:B2:80:FA:4E:14:29:A6:EC:EE:B6:E5:C1:BF:E4

十六進製字符串中 UICC 的規則是:

E243 <= 43 is value length in hex
  E135
    C114 ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4
    CA1D 636F6D2E676F6F676C652E616E64726F69642E617070732E6D79617070
  E30A
    DB08 0000000000000001

訪問規則文件支持

Android 7.0 添加了對從訪問規則文件 (ARF) 中讀取運營商權限規則的支持。

Android 平台首先嘗試選擇訪問規則應用程序 (ARA) AID A00000015141434C00 。如果在 UICC 上找不到 AID,則會通過選擇 PKCS15 AID A000000063504B43532D3135回退到 ARF。然後,Android 讀取0x4300處的訪問控制規則文件 (ACRF),並查找 AID FFFFFFFFFFFF的條目。具有不同 AID 的條目將被忽略,因此其他用例的規則可以共存。

十六進製字符串中的 ACRF 內容示例:

30 10 A0 08 04 06 FF FF FF FF FF FF 30 04 04 02 43 10

訪問控制條件文件 (ACCF) 內容示例:

30 16 04 14 61 ED 37 7E 85 D3 86 A8 DF EE 6B 86 4B D8 5B 0B FA A5 AF 81

在上面的示例中, 0x4310 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81 。由該證書籤名的應用程序被授予運營商特權。

啟用的API

Android 支持以下 API。

電話管理器

電話回撥

TelephonyCallback具有帶有回調方法的接口,可在註冊狀態更改時通知調用應用程序:

訂閱管理器

短信管理器

運營商配置管理器

有關說明,請參閱運營商配置

錯誤報告管理器

啟動連接錯誤報告的方法,這是錯誤報告的專門版本,僅包含用於調試連接相關問題的信息: startConnectivityBugreport

網絡統計管理器

ImsMm電話管理器

ImsRcsManager

供應管理器

Euicc管理器

切換到(啟用)給定訂閱的方法: switchToSubscription

運營商消息服務

當發送或接收新的 SMS 和 MMS 時接收來自系統的呼叫的服務。要擴展此類,請使用android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE權限在清單文件中聲明該服務,並包含帶有#SERVICE_INTERFACE操作的意圖過濾器。方法包括:

承運服務

向系統公開特定於運營商的功能的服務。要擴展此類,請使用android.Manifest.permission#BIND_CARRIER_SERVICES權限在應用清單文件中聲明該服務,並使用CARRIER_SERVICE_INTERFACE操作包含一個意圖過濾器。如果服務具有長期綁定,請在服務的元數據中將android.service.carrier.LONG_LIVED_BINDING設置為true

平台將CarrierService與特殊標誌綁定,讓Carrier服務進程在特殊的應用程序備用桶中運行。這使運營商服務應用程序免受應用程序空閒限制,並使其在設備內存較低時更有可能保持活動狀態。但是,如果運營商服務應用程序因任何原因崩潰,它將失去所有上述權限,直到應用程序重新啟動並重新建立綁定。因此保持運營商服務應用的穩定至關重要。

CarrierService中的方法包括:

電話服務提供商

內容提供商 API,允許對電話數據庫進行修改(插入、刪除、更新、查詢)。值字段在Telephony.Carriers中定義;有關更多詳細信息,請參閱Telephony類參考

Wifi網絡建議

構建WifiNetworkSuggestion對象時,可以使用以下方法設置訂閱ID或訂閱組:

安卓平台

在檢測到的 UICC 上,平台構建內部 UICC 對象,其中包括作為 UICC 一部分的運營商特權規則。 UiccCarrierPrivilegeRules.java加載規則,從 UICC 卡中解析它們,並將它們緩存在內存中。當需要進行權限檢查時, UiccCarrierPrivilegeRules會將調用者證書與自己的規則一一進行比較。如果 UICC 被刪除,則規則將與 UICC 對像一起被銷毀。

驗證

要使用CtsCarrierApiTestCases.apk通過兼容性測試套件 (CTS)驗證實現,您必須擁有具有正確 UICC 規則或 ARF 支持的開發人員 UICC。請您選擇的 SIM 卡供應商按照本節所述準備具有正確 ARF 的開發人員 UICC,並使用該 UICC 運行測試。 UICC 不需要主動蜂窩服務即可通過 CTS 測試。

準備 UICC

對於 Android 11 及更低版本, CtsCarrierApiTestCases.apkaosp-testkey 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81

從 Android 12 開始, CtsCarrierApiTestCases.apkcts-uicc-2021-testkey簽名CE:7B:2B:47:AE:2B:75:52:C8:F9:2C:C2:91:24:27:98:83:04:1F:B6:23:A5:F1:94:A8:2C:9B:F1:5D:49:2A:A0

要在 Android 12 中運行 CTS 運營商 API 測試,設備需要使用具有 CTS 運營商權限的 SIM 卡,且滿足最新版本的第三方GSMA TS.48 測試配置文件規範中指定的要求。

同樣的 SIM 卡也可用於 Android 12 之前的版本。

修改 CTS SIM 配置文件

  1. 添加:訪問規則應用主控 (ARA-M) 或 ARF 中的 CTS 運營商權限。兩個簽名都必須在運營商特權規則中進行編碼:
    1. 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
    2. CE:7B:2B:47:AE:2B:75:52:C8:F9:2C:C2:91:24:27:98:83:04:1F:B6:23:A5:F1:94:A8:2C:9B:F1:5D:49:2A:A0
  2. 創建: TS.48 中不存在且 CTS 需要的 ADF USIM 基本文件 (EF):
    1. EF_MBDN (6FC7),記錄大小:28,記錄數量:4
      • 內容
        1. 記錄1:566F696365204D61696CFFFFFFFF06915155555555FF…FF
        2. Rec2-n:FF…FF
    2. EF_EXT6 (6FC8),記錄大小:13,記錄數量:1
      • 內容:00FF…FF
        1. EF_MBI (6FC9),記錄大小:4,記錄數量:1
      • 內容:Rec1:01010101
        1. EF_MWIS (6FCA),記錄大小:5,記錄數量:1
      • 內容:0000000000
  3. 修改: USIM服務表:啟用服務n°47、n°48
    1. EF_UST (6F38)
      • 內容: 9EFFBF1DFFFE0083410310010400406E01
  4. 修改: DF-5GS 和 DF-SAIP 文件
    1. DF-5GS - EF_5GS3GPPLOCI (USIM/5FC0/4F01)
      • 內容: FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
    2. DF-5GS - EF_5GSN3GPPLOCI (USIM/5FC0/4F02)
      • 內容: FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
    3. DF-5GS - EF SUCI_Calc_Info (USIM/5FC0/4F07)
      • 內容: A0020000FF…FF
    4. DF-SAIP - EF SUCI_Calc_Info_USIM (USIM/5FD0/4F01)
      • 內容: A0020000FF…FF
  5. 修改:在包含此指定的各個 EF 中使用運營商名稱字符串Android CTS
    1. EF_SPN(USIM/6F46)
      • 內容: 01416E64726F696420435453FF..FF
    2. EF_PNN(USIM/6FC5)
      • 內容: Rec1 430B83413759FE4E934143EA14FF..FF

匹配測試配置文件結構

下載並匹配以下通用測試配置文件結構的最新版本。這些配置文件不會有個性化的 CTS 運營商特權規則或上面列出的其他修改。

運行測試

為了方便起見,CTS 支持設備令牌,該令牌限制測試僅在配置有相同令牌的設備上運行。運營商 API CTS 測試支持設備令牌sim-card-with-certs 。例如,以下設備令牌將運營商 API 測試限制為僅在設備abcd1234上運行:

cts-tradefed run cts  --device-token abcd1234:sim-card-with-certs

在不使用設備令牌的情況下運行測試時,測試將在所有設備上運行。

常問問題

如何在 UICC 上更新證書?

A:使用現有的卡OTA更新機制。

UICC可以與其他規則共存嗎?

A:同一個AID下的UICC上有其他安全規則也可以;平台會自動過濾掉它們。

當依賴 UICC 證書的應用程序被刪除時會發生什麼?

答:應用程序會失去其權限,因為與 UICC 關聯的規則在 UICC 刪除時被破壞。

UICC 上的證書數量有限制嗎?

A:平台不限制證書數量;但由於檢查是線性的,過多的規則可能會導致檢查延遲。

我們可以使用此方法支持的 API 數量是否有限制?

答:不可以,但我們將範圍限制為與運營商相關的 API。

是否有一些 API 被禁止使用此方法?如果是這樣,你如何執行它們? (也就是說,您是否有測試來驗證此方法支持哪些 API?)

答:請參閱 Android 兼容性定義文檔 (CDD) 的API 行為兼容性部分。我們進行了一些 CTS 測試,以確保 API 的權限模型不會更改。

它如何與多 SIM 卡功能配合使用?

A:使用用戶指定的默認SIM卡。

這是否與其他 SE 訪問技術(例如 SEEK)相互作用或重疊?

答:舉個例子,SEEK 使用與 UICC 上相同的 AID。因此,規則共存並通過 SEEK 或UiccCarrierPrivileges進行過濾。

什麼時候是檢查運營商特權的好時機?

A:SIM狀態加載廣播後。

OEM 可以禁用部分運營商 API 嗎?

A:不會。我們認為目前的API是最小的集合,未來我們計劃使用位掩碼進行更細粒度的控制。

setOperatorBrandOverride是否會覆蓋所有其他形式的操作員名稱字符串?例如,SE13、UICC SPN 或基於網絡的 NITZ?

是的,運營商品牌覆蓋具有最高優先級。設置後,它將覆蓋所有其他形式的操作員名稱字符串。

injectSmsPdu方法調用的作用是什麼?

答:此方法方便短信在雲端備份/恢復。 injectSmsPdu調用啟用恢復功能。

對於短信過濾, onFilterSms調用是否基於短信UDH端口過濾?或者運營商應用程序是否可以訪問所有傳入的短信?

答:運營商可以訪問所有短信數據。

DeviceAppID-REF-DO支持 32 字節的擴展似乎與當前 GP 規範(僅允許 0 或 20 字節)不兼容,那麼為什麼要引入此更改呢? SHA-1 不足以避免衝突嗎?您是否已經向 GP 提出了這一更改,因為這可能與現有的 ARA-M/ARF 向後不兼容?

答:為了提供面向未來的安全性,除了 SHA-1(目前 GP SEAC 標準中的唯一選項)之外,此擴展還為DeviceAppID-REF-DO引入了 SHA-256。我們強烈建議使用 SHA-256。

如果DeviceAppID為 0(空),是否將該規則應用於特定規則未涵蓋的所有設備應用?

答:運營商 API 需要填充DeviceAppID-REF-DO 。為空旨在用於測試目的,不建議用於操作部署。

根據您的規範,不應接受僅單獨使用PKG-REF-DO而不使用DeviceAppID-REF-DO 。但規範的表 6-4 中仍然將其描述為擴展REF-DO的定義。這是故意的嗎?當REF-DO中僅使用PKG-REF-DO時,代碼的行為如何?

答:最新版本中刪除了將PKG-REF-DO作為REF-DO中的單值項的選項。 PKG-REF-DO只能與DeviceAppID-REF-DO結合使用。

我們假設我們可以授予對所有基於運營商的權限的訪問或具有更細粒度的控制。如果是,那麼什麼定義了位掩碼和實際權限之間的映射?每個班級一個權限?每種方法一個權限?從長遠來看,64 個單獨的權限足夠嗎?

A:這是為將來保留的,我們歡迎提出建議。

能否進一步專門為Android定義DeviceAppID ?這是用於簽署給定應用程序的發布者證書的 SHA-1(20 字節)哈希值,因此該名稱不應該反映該目的嗎? (該名稱可能會讓許多讀者感到困惑,因為該規則適用於使用同一發布者證書籤名的所有應用程序。)

A:現有規範支持DeviceAppID存儲證書。我們試圖盡量減少規範更改,以降低採用的障礙。詳情請參見UICC 規則