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-DO
和AR-DO
的串聯組成:
-
REF-DO
(E1
) 包含DeviceAppID-REF-DO
或DeviceAppID-REF-DO
和PKG-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。
電話管理器
- 讓運營商應用程序向 UICC 詢問質詢/響應的方法:
getIccAuthentication
。 - 檢查調用應用程序是否已被授予運營商權限的方法:
hasCarrierPrivileges
。 - 覆蓋品牌和編號的方法:
- UICC直接通信方法:
- 將設備模式設置為全局的方法:
setPreferredNetworkTypeToGlobal
。 - 獲取設備或網絡身份的方法:
- 國際移動設備識別碼 (IMEI):
getImei
- 移動設備標識符(MEID):
getMeid
- 網絡訪問標識符 (NAI):
getNai
- SIM 序列號:
getSimSerialNumber
- 國際移動設備識別碼 (IMEI):
- 獲取運營商配置的方法:
getCarrierConfig
- 獲取數據傳輸的網絡類型方法:
getDataNetworkType
- 獲取語音服務網絡類型的方法:
getVoiceNetworkType
- 獲取UICC SIM(USIM)應用信息的方法:
- SIM 序列號:
getSimSerialNumber
- 卡信息:
getUiccCardsInfo
- GID1(組ID級別1):
getGroupIdLevel1
- 第 1 行的電話號碼字符串:
getLine1Number
- 禁止的公共陸地移動網絡 (PLMN):
getForbiddenPlmns
- 等效家庭 PLMN:
getEquivalentHomePlmns
- SIM 序列號:
- 獲取或設置語音信箱號碼的方法:
- 發送特殊撥號代碼的方法:
sendDialerSpecialCode
- 重置無線調製解調器的方法:
rebootModem
- 獲取或設置網絡選擇模式的方法:
- 請求網絡掃描的方法:
requestNetworkScan
- 獲取或設置允許/首選網絡類型的方法:
- 檢查每個用戶設置是否啟用移動數據或漫遊的方法:
- 檢查或設置數據連接原因的方法:
- 獲取緊急號碼列表的方法:
getEmergencyNumberList
- 控制機會網絡的方法:
- 設置或清除蜂窩信號強度更新請求的方法:
電話回撥
TelephonyCallback
具有帶有回調方法的接口,可在註冊狀態更改時通知調用應用程序:
- 消息等待指示器發生變化:
onMessageWaitingIndicatorChanged
- 呼叫轉移指示器發生變化:
onCallForwardingIndicatorChanged
- IP 多媒體系統 (IMS) 呼叫斷開原因已更改:
onImsCallDisconnectCauseChanged
- 精確數據連接狀態改變:
onPreciseDataConnectionStateChanged
- 當前緊急號碼列表已更改:
onEmergencyNumberListChanged
- 活動數據訂閱 ID 已更改:
onActiveDataSubscriptionIdChanged
- 運營商網絡發生變化:
onCarrierNetworkChange
- 網絡註冊或位置/路由/跟踪區域更新失敗:
onRegistrationFailed
- 限制信息變更:
onBarringInfoChanged
- 當前物理通道配置已更改:
onPhysicalChannelConfigChanged
訂閱管理器
- 獲取各種訂閱信息的方法:
- 獲取活躍訂閱數量的方法:
getActiveSubscriptionInfoCount
- 管理訂閱組的方法:
- 獲取或設置運營商與特定訂戶之間的計費關係計劃描述的方法:
- 臨時覆蓋運營商和特定訂戶之間的計費關係計劃以被視為不計量的方法:
setSubscriptionOverrideUnmetered
- 臨時覆蓋運營商和特定訂閱者之間的計費關係計劃以被視為擁塞的方法:
setSubscriptionOverrideCongested
- 檢查具有給定上下文的應用程序是否有權根據其元數據管理給定訂閱的方法:
canManageSubscription
短信管理器
- 讓調用者創建新傳入 SMS 消息的方法:
injectSmsPdu
。 - 發送基於文本的 SMS 消息而不寫入 SMS 提供程序的方法:
sendTextMessageWithoutPersisting
運營商配置管理器
- 通知配置更改的方法:
notifyConfigChangedForSubId
。 - 獲取默認訂閱的運營商配置的方法:
getConfig
- 獲取指定訂閱的運營商配置的方法:
getConfigForSubId
有關說明,請參閱運營商配置。
錯誤報告管理器
啟動連接錯誤報告的方法,這是錯誤報告的專門版本,僅包含用於調試連接相關問題的信息: startConnectivityBugreport
網絡統計管理器
- 查詢網絡使用情況摘要方法:
querySummary
- 查詢網絡使用歷史的方法:
queryDetails
- 註冊或取消註冊網絡使用回調的方法:
ImsMm電話管理器
- 註冊或註銷IMS MmTel註冊回調的方法:
ImsRcsManager
- 註冊或註銷IMS RCS註冊回調的方法:
- 獲取 IMS 註冊狀態或傳輸類型的方法:
供應管理器
- 註冊和取消註冊 IMS 功能配置更新回調的方法:
- 與 IMS MmTel 或 RCS 功能的配置狀態相關的方法:
Euicc管理器
切換到(啟用)給定訂閱的方法: switchToSubscription
運營商消息服務
當發送或接收新的 SMS 和 MMS 時接收來自系統的呼叫的服務。要擴展此類,請使用android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE
權限在清單文件中聲明該服務,並包含帶有#SERVICE_INTERFACE
操作的意圖過濾器。方法包括:
- 過濾入站短信的方法:
onFilterSms
- 攔截設備發送的短信方法:
onSendTextSms
- 攔截設備發送的二進制短信的方法:
onSendDataSms
- 攔截設備發送的長短信的方法:
onSendMultipartTextSms
- 攔截設備發送的彩信方法:
onSendMms
- 下載收到的彩信的方法:
onDownloadMms
承運服務
向系統公開特定於運營商的功能的服務。要擴展此類,請使用android.Manifest.permission#BIND_CARRIER_SERVICES
權限在應用清單文件中聲明該服務,並使用CARRIER_SERVICE_INTERFACE
操作包含一個意圖過濾器。如果服務具有長期綁定,請在服務的元數據中將android.service.carrier.LONG_LIVED_BINDING
設置為true
。
平台將CarrierService
與特殊標誌綁定,讓Carrier服務進程在特殊的應用程序備用桶中運行。這使運營商服務應用程序免受應用程序空閒限制,並使其在設備內存較低時更有可能保持活動狀態。但是,如果運營商服務應用程序因任何原因崩潰,它將失去所有上述權限,直到應用程序重新啟動並重新建立綁定。因此保持運營商服務應用的穩定至關重要。
CarrierService
中的方法包括:
- 要覆蓋並設置運營商特定配置:
onLoadConfig
- 通過運營商應用程序通知系統即將發生的運營商網絡有意更改:
notifyCarrierNetworkChange
電話服務提供商
內容提供商 API,允許對電話數據庫進行修改(插入、刪除、更新、查詢)。值字段在Telephony.Carriers
中定義;有關更多詳細信息,請參閱Telephony
類參考
Wifi網絡建議
構建WifiNetworkSuggestion
對象時,可以使用以下方法設置訂閱ID或訂閱組:
- 設置訂閱ID的方法:
setSubscriptionId
- 設置訂閱組的方法:
setSubscriptionGroup
安卓平台
在檢測到的 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.apk
由aosp-testkey
61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
。
從 Android 12 開始, CtsCarrierApiTestCases.apk
由cts-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 配置文件
- 添加:訪問規則應用主控 (ARA-M) 或 ARF 中的 CTS 運營商權限。兩個簽名都必須在運營商特權規則中進行編碼:
-
61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
-
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
-
- 創建: TS.48 中不存在且 CTS 需要的 ADF USIM 基本文件 (EF):
- EF_MBDN (6FC7),記錄大小:28,記錄數量:4
- 內容
- 記錄1:566F696365204D61696CFFFFFFFF06915155555555FF…FF
- Rec2-n:FF…FF
- 內容
- EF_EXT6 (6FC8),記錄大小:13,記錄數量:1
- 內容:00FF…FF
- EF_MBI (6FC9),記錄大小:4,記錄數量:1
- 內容:Rec1:01010101
- EF_MWIS (6FCA),記錄大小:5,記錄數量:1
- 內容:0000000000
- 內容:00FF…FF
- EF_MBDN (6FC7),記錄大小:28,記錄數量:4
- 修改: USIM服務表:啟用服務n°47、n°48
- EF_UST (6F38)
- 內容:
9EFFBF1DFFFE0083410310010400406E01
- 內容:
- EF_UST (6F38)
- 修改: DF-5GS 和 DF-SAIP 文件
- DF-5GS - EF_5GS3GPPLOCI (USIM/5FC0/4F01)
- 內容:
FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
- 內容:
- DF-5GS - EF_5GSN3GPPLOCI (USIM/5FC0/4F02)
- 內容:
FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
- 內容:
- DF-5GS - EF SUCI_Calc_Info (USIM/5FC0/4F07)
- 內容:
A0020000FF…FF
- 內容:
- DF-SAIP - EF SUCI_Calc_Info_USIM (USIM/5FD0/4F01)
- 內容:
A0020000FF…FF
- 內容:
- DF-5GS - EF_5GS3GPPLOCI (USIM/5FC0/4F01)
- 修改:在包含此指定的各個 EF 中使用運營商名稱字符串Android CTS :
- EF_SPN(USIM/6F46)
- 內容:
01416E64726F696420435453FF..FF
- 內容:
- EF_PNN(USIM/6FC5)
- 內容:
Rec1 430B83413759FE4E934143EA14FF..FF
- 內容:
- EF_SPN(USIM/6F46)
匹配測試配置文件結構
下載並匹配以下通用測試配置文件結構的最新版本。這些配置文件不會有個性化的 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 規則。