Đặc quyền của nhà mạng UICC

Android 5.1 đã giới thiệu một cơ chế cấp đặc quyền cho các API liên quan đến chủ sở hữu của ứng dụng thẻ mạch tích hợp phổ quát (UICC). Nền tảng Android tải các chứng chỉ lưu trữ trên UICC và cấp quyền cho các ứng dụng được ký bởi các chứng chỉ này để thực hiện lệnh gọi đến một số API đặc biệt.

Android 7.0 đã mở rộng tính năng này để hỗ trợ các nguồn bộ nhớ khác cho các quy tắc về đặc quyền của nhà mạng UICC, làm tăng đáng kể số lượng nhà cung cấp dịch vụ có thể sử dụng API này. Để tham khảo API, hãy xem CarrierConfigManager; để biết hướng dẫn, hãy xem phần Cấu hình nhà mạng.

Nhà mạng có toàn quyền kiểm soát UICC, vì vậy, cơ chế này cung cấp một cách an toàn và linh hoạt để quản lý các ứng dụng của nhà mạng di động (MNO) được lưu trữ trên các kênh phân phối ứng dụng chung (chẳng hạn như Google Play) trong khi vẫn giữ lại các đặc quyền đặc biệt trên thiết bị và không cần ký ứng dụng bằng chứng chỉ nền tảng trên mỗi thiết bị hoặc cài đặt trước dưới dạng ứng dụng hệ thống.

Quy tắc về UICC

Dung lượng lưu trữ trên UICC tương thích với quy cách Kiểm soát quyền truy cập phần tử bảo mật trên toàn cầu. Giá trị nhận dạng ứng dụng (AID) trên thẻ là A00000015141434C00 và lệnh GET DATA tiêu chuẩn được dùng để tìm nạp các quy tắc được lưu trữ trên thẻ. Bạn có thể cập nhật các quy tắc này thông qua bản cập nhật thẻ qua mạng không dây (OTA).

Hệ phân cấp dữ liệu

Các quy tắc UICC sử dụng hệ phân cấp dữ liệu sau đây (tổ hợp hai ký tự chữ cái và số trong dấu ngoặc đơn là thẻ đối tượng). Mỗi quy tắc là REF-AR-DO (E2) và bao gồm một chuỗi nối REF-DOAR-DO:

  • REF-DO (E1) chứa DeviceAppID-REF-DO hoặc chuỗi nối của DeviceAppID-REF-DOPKG-REF-DO.
    • DeviceAppID-REF-DO (C1) lưu trữ chữ ký SHA-1 (20 byte) hoặc SHA-256 (32 byte) của chứng chỉ.
    • PKG-REF-DO (CA) là chuỗi tên gói đầy đủ được xác định trong tệp kê khai, được mã hoá ASCII, có độ dài tối đa 127 byte.
  • AR-DO (E3) được mở rộng để bao gồm PERM-AR-DO (DB), là một mặt nạ bit 8 byte đại diện cho 64 quyền riêng biệt.

Nếu không có PKG-REF-DO, thì mọi ứng dụng do chứng chỉ ký đều sẽ được cấp quyền truy cập; nếu không, cả chứng chỉ và tên gói đều cần phải khớp.

Ví dụ về quy tắc

Tên ứng dụng là com.google.android.apps.myapp và chứng chỉ SHA-1 trong chuỗi hex là:

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

Quy tắc về UICC trong chuỗi hex là:

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

Hỗ trợ tệp quy tắc truy cập

Android 7.0 hỗ trợ đọc các quy tắc đặc quyền của nhà mạng từ tệp quy tắc truy cập (ARF).

Trước tiên, nền tảng Android sẽ cố gắng chọn ứng dụng quy tắc truy cập (ARA) AID A00000015141434C00. Nếu không tìm thấy AID trên UICC, thì ứng dụng sẽ quay lại ARF bằng cách chọn AID PKCS15 A000000063504B43532D3135. Sau đó, Android sẽ đọc tệp quy tắc kiểm soát quyền truy cập (ACRF) tại 0x4300 và tìm các mục nhập có AID FFFFFFFFFFFF. Các mục nhập có nhiều mã AID sẽ bị bỏ qua, do đó, các quy tắc dành cho các trường hợp sử dụng khác có thể cùng tồn tại.

Ví dụ về nội dung ACRF ở dạng chuỗi hex:

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

Ví dụ về nội dung tệp điều kiện kiểm soát quyền truy cập (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

Trong ví dụ trên, 0x4310 là địa chỉ của ACCF, chứa hàm băm chứng chỉ 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81. Các ứng dụng được ký bằng chứng chỉ này được cấp đặc quyền của nhà mạng.

API đã bật

Android hỗ trợ các API sau.

TelephonyManager

TelephonyCallback

TelephonyCallback có giao diện với phương thức gọi lại để thông báo cho ứng dụng gọi khi trạng thái đã đăng ký thay đổi:

SubscriptionManager

SmsManager

  • Phương thức cho phép phương thức gọi tạo tin nhắn SMS đến mới: injectSmsPdu.
  • Phương thức gửi tin nhắn SMS dạng văn bản mà không cần ghi vào trình cung cấp SMS: sendTextMessageWithoutPersisting

CarrierConfigManager

  • Phương thức thông báo cấu hình đã thay đổi: notifyConfigChangedForSubId.
  • Phương thức để lấy cấu hình nhà mạng cho gói thuê bao mặc định: getConfig
  • Phương thức để lấy cấu hình nhà mạng cho gói thuê bao đã chỉ định: getConfigForSubId

Để biết hướng dẫn, hãy xem phần Cấu hình nhà mạng.

BugreportManager

Phương thức bắt đầu báo cáo lỗi kết nối. Đây là một phiên bản chuyên biệt của báo cáo lỗi chỉ bao gồm thông tin để gỡ lỗi các vấn đề liên quan đến khả năng kết nối: startConnectivityBugreport

NetworkStatsManager

ImsMmTelManager

ImsRcsManager

ProvisioningManager

EuiccManager

Phương thức chuyển sang (bật) gói thuê bao đã cho: switchToSubscription

Dịch vụ nhắn tin của nhà mạng

Dịch vụ nhận cuộc gọi từ hệ thống khi gửi hoặc nhận tin nhắn SMS và MMS mới. Để mở rộng lớp này, hãy khai báo dịch vụ trong tệp kê khai với quyền android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE và thêm một bộ lọc ý định bằng thao tác #SERVICE_INTERFACE. Các phương thức bao gồm:

  • Phương thức lọc tin nhắn SMS đến: onFilterSms
  • Phương thức chặn tin nhắn SMS văn bản được gửi từ thiết bị: onSendTextSms
  • Phương thức chặn tin nhắn SMS nhị phân được gửi từ thiết bị: onSendDataSms
  • Phương thức chặn tin nhắn SMS dài được gửi từ thiết bị: onSendMultipartTextSms
  • Phương thức chặn tin nhắn MMS được gửi từ thiết bị: onSendMms
  • Phương thức tải tin nhắn MMS đã nhận xuống: onDownloadMms

CarrierService

Dịch vụ hiển thị các chức năng dành riêng cho nhà mạng cho hệ thống. Để mở rộng lớp này, hãy khai báo dịch vụ trong tệp kê khai ứng dụng bằng quyền android.Manifest.permission#BIND_CARRIER_SERVICES và đưa bộ lọc ý định vào thao tác CARRIER_SERVICE_INTERFACE. Nếu dịch vụ có liên kết tồn tại trong thời gian dài, hãy đặt android.service.carrier.LONG_LIVED_BINDING thành true trong siêu dữ liệu của dịch vụ.

Nền tảng liên kết CarrierService với các cờ đặc biệt để cho phép quy trình dịch vụ của nhà mạng chạy trong một vùng chờ ứng dụng đặc biệt. Điều này sẽ miễn cho ứng dụng dịch vụ của nhà mạng khỏi hạn chế về trạng thái rảnh của ứng dụng và giúp ứng dụng có nhiều khả năng duy trì hoạt động khi bộ nhớ của thiết bị sắp hết. Tuy nhiên, nếu ứng dụng dịch vụ của nhà mạng gặp sự cố vì bất kỳ lý do gì, ứng dụng đó sẽ mất tất cả các đặc quyền nêu trên cho đến khi ứng dụng khởi động lại và liên kết được thiết lập lại. Vì vậy, điều quan trọng là phải duy trì sự ổn định cho ứng dụng dịch vụ của nhà mạng.

Các phương thức trong CarrierService bao gồm:

  • Cách ghi đè và đặt cấu hình dành riêng cho nhà mạng: onLoadConfig
  • Để thông báo cho hệ thống về việc ứng dụng của nhà mạng cố ý thay đổi mạng của nhà mạng: notifyCarrierNetworkChange

Nhà cung cấp dịch vụ điện thoại

API trình cung cấp nội dung để cho phép sửa đổi (chèn, xoá, cập nhật, truy vấn) đối với cơ sở dữ liệu điện thoại. Các trường giá trị được xác định tại Telephony.Carriers; để biết thêm thông tin chi tiết, hãy tham khảo tài liệu tham khảo lớp Telephony

WifiNetworkSuggestion

Khi tạo đối tượng WifiNetworkSuggestion, hãy sử dụng các phương thức sau để đặt mã thuê bao hoặc nhóm thuê bao:

Nền tảng Android

Trên một UICC đã phát hiện, nền tảng sẽ tạo các đối tượng UICC nội bộ bao gồm các quy tắc đặc quyền của nhà mạng trong UICC. UiccCarrierPrivilegeRules.java tải quy tắc, phân tích cú pháp các quy tắc đó từ thẻ UICC và lưu vào bộ nhớ đệm. Khi cần kiểm tra đặc quyền, UiccCarrierPrivilegeRules sẽ so sánh từng chứng chỉ của phương thức gọi với các quy tắc của riêng phương thức đó. Nếu UICC bị xoá, các quy tắc sẽ bị huỷ cùng với đối tượng UICC.

Xác nhận kết quả

Để xác thực quá trình triển khai thông qua Bộ kiểm tra tính tương thích (CTS) bằng CtsCarrierApiTestCases.apk, bạn phải có UICC dành cho nhà phát triển có đúng quy tắc UICC hoặc khả năng hỗ trợ ARF. Hãy yêu cầu nhà cung cấp thẻ SIM mà bạn chọn chuẩn bị UICC dành cho nhà phát triển với ARF phù hợp như mô tả trong phần này, đồng thời sử dụng UICC đó để chạy kiểm thử. UICC không yêu cầu dịch vụ di động đang hoạt động để vượt qua các bài kiểm thử CTS.

Chuẩn bị UICC

Đối với Android 11 trở xuống, CtsCarrierApiTestCases.apk do aosp-testkey ký, với giá trị băm 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81.

Kể từ Android 12, CtsCarrierApiTestCases.apk được ký bằng cts-uicc-2021-testkey, giá trị băm 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.

Để chạy các thử nghiệm API nhà mạng CTS trong Android 12, thiết bị cần sử dụng thẻ SIM có đặc quyền nhà mạng CTS đáp ứng các yêu cầu được chỉ định trong phiên bản mới nhất của thông số kỹ thuật Hồ sơ kiểm thử GSMA TS.48 của bên thứ ba.

Bạn cũng có thể dùng cùng một SIM cho các phiên bản trước Android 12.

Sửa đổi hồ sơ SIM CTS

  1. Thêm: Đặc quyền của nhà mạng trong CTS trong quy tắc truy cập chính của ứng dụng (ARA-M) hoặc ARF. Cả hai chữ ký đều phải được mã hoá trong các quy tắc đặc quyền của nhà mạng:
    1. Hash1(SHA1): 61:ED:37:7E:85:D3:86:A8:DF:EE:6B:86:4B:D8:5B:0B:FA:A5:AF:81
    2. Hàm băm2(SHA256): 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. Tạo: Các tệp cơ bản (EF) của ADF USIM không có trong phiên bản TS.48 và cần thiết cho bộ thử nghiệm tương thích (CTS):
    1. EF_MBDN (6FC7), kích thước bản ghi: 28, số bản ghi: 4 
      • Nội dung
        1. Rec1: 566F696365204D61696CFFFFFFFF0691515555555FF…FF
        2. Rec2-n: FF…FF
    2. EF_EXT6 (6FC8), kích thước bản ghi: 13, số bản ghi: 1 
      • Nội dung: 00FF…FF
        1. EF_MBI (6FC9), kích thước bản ghi: 4, số bản ghi: 1
      • Nội dung: Rec1: 01010101
        1. EF_MWIS (6FCA), kích thước bản ghi: 5, số bản ghi: 1
      • Nội dung: 0000000000
  3. Sửa đổi: Bảng dịch vụ USIM: Bật dịch vụ số 47, số 48
    1. EF_UST (6F38)
      • Nội dung: 9EFFBF1DFFFE0083410310010400406E01
  4. Chỉnh sửa: Tệp DF-5GS và DF-SAIP
    1. DF-5GS – EF_5GS3GPPLOCI (USIM/5FC0/4F01)
      • Nội dung: FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
    2. DF-5GS – EF_5GSN3GPPLOCI (USIM/5FC0/4F02)
      • Nội dung: FFFFFFFFFFFFFFFFFFFFFFFFFF42F618FFFFFE01
    3. DF-5GS – EF SUCI_Calc_Info (USIM/5FC0/4F07)
      • Nội dung: A0020000FF…FF
    4. DF-SAIP - EF SUCI_Calc_Info_USIM (USIM/5FD0/4F01)
      • Nội dung: A0020000FF…FF
  5. Sửa đổi: Sử dụng chuỗi tên nhà mạng Android CTS trong các EF tương ứng có chứa ký hiệu sau:
    1. EF_SPN (USIM/6F46)
      • Nội dung: 01416E64726F696420435453FF..FF
    2. EF_PNN (USIM/6FC5)
      • Nội dung: Rec1 430B83413759FE4E934143EA14FF..FF

So khớp cấu trúc hồ sơ kiểm thử

Tải xuống và so khớp phiên bản mới nhất của các cấu trúc hồ sơ kiểm thử chung sau đây. Các hồ sơ này sẽ không có quy tắc Đặc quyền của nhà mạng CTS được cá nhân hoá hoặc các sửa đổi khác nêu trên.

Chạy chương trình kiểm thử

Để thuận tiện, CTS hỗ trợ mã thông báo thiết bị hạn chế các chương trình kiểm thử chỉ chạy trên các thiết bị được định cấu hình bằng cùng một mã thông báo. Các chương trình kiểm thử CTS API của nhà mạng hỗ trợ mã thông báo thiết bị sim-card-with-certs. Ví dụ: mã thông báo thiết bị sau đây giới hạn các hoạt động kiểm thử API của nhà mạng để chỉ chạy trên thiết bị abcd1234:

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

Khi chạy kiểm thử mà không sử dụng mã thông báo của thiết bị, kiểm thử sẽ chạy trên mọi thiết bị.

Câu hỏi thường gặp

Làm cách nào để cập nhật chứng chỉ trên UICC?

Đáp: Sử dụng cơ chế cập nhật thẻ OTA hiện có.

UICC có thể cùng tồn tại với các quy tắc khác không?

Đáp: Bạn có thể có các quy tắc bảo mật khác trên UICC trong cùng một AID; nền tảng sẽ tự động lọc ra các quy tắc đó.

Điều gì sẽ xảy ra khi UICC bị xoá đối với một ứng dụng dựa vào các chứng chỉ trên đó?

Đáp: Ứng dụng sẽ mất các đặc quyền vì các quy tắc liên kết với UICC bị huỷ khi xoá UICC.

Có giới hạn về số lượng chứng chỉ trên UICC không?

Đáp: Nền tảng không giới hạn số lượng chứng chỉ; nhưng vì quá trình kiểm tra là tuyến tính, nên quá nhiều quy tắc có thể gây ra độ trễ cho quá trình kiểm tra.

Có giới hạn về số lượng API mà chúng tôi có thể hỗ trợ bằng phương thức này không?

Đáp: Không, nhưng chúng tôi giới hạn phạm vi ở các API liên quan đến nhà mạng.

Có một số API bị cấm sử dụng phương thức này không? Nếu có, bạn sẽ thực thi như thế nào? (nghĩa là bạn có thử nghiệm nào để xác thực API nào được hỗ trợ bằng phương thức này không?)

Đáp: Hãy xem phần Khả năng tương thích về hành vi của API trong Tài liệu định nghĩa về khả năng tương thích với Android (CDD). Chúng tôi có một số thử nghiệm CTS để đảm bảo rằng mô hình cấp quyền của các API không thay đổi.

Tính năng nhiều SIM hoạt động như thế nào?

Đáp: SIM mặc định do người dùng chỉ định sẽ được sử dụng.

Điều này có tương tác hoặc chồng chéo với các công nghệ truy cập vào SE khác, chẳng hạn như SEEK không?

Đáp: Ví dụ: SEEK sử dụng cùng một AID như trên UICC. Vì vậy, các quy tắc cùng tồn tại và được lọc bằng hàm SEEK hoặc UiccCarrierPrivileges.

Khi nào nên kiểm tra đặc quyền của nhà mạng?

Đáp: Sau khi phát đi thông báo trạng thái SIM đã tải.

Nhà sản xuất thiết bị gốc có thể tắt một phần API của nhà mạng không?

Đáp: Không. Chúng tôi tin rằng các API hiện tại là tập hợp tối thiểu và chúng tôi dự định sử dụng mặt nạ bit để kiểm soát chi tiết hơn trong tương lai.

setOperatorBrandOverride có ghi đè TẤT CẢ các dạng chuỗi tên toán tử khác không? Ví dụ: SE13, UICC SPN hay NITZ dựa trên mạng?

Có, cơ chế ghi đè thương hiệu của nhà vận hành có mức độ ưu tiên cao nhất. Khi được đặt, giá trị này sẽ ghi đè TẤT CẢ các dạng chuỗi tên toán tử khác.

Lệnh gọi phương thức injectSmsPdu có tác dụng gì?

Đáp: Phương thức này hỗ trợ sao lưu/khôi phục tin nhắn SMS trên đám mây. Lệnh gọi injectSmsPdu sẽ bật chức năng khôi phục.

Đối với tính năng lọc tin nhắn SMS, lệnh gọi onFilterSms có dựa trên tính năng lọc cổng UDH của SMS không? Hay ứng dụng của nhà mạng có quyền truy cập TẤT CẢ tin nhắn đến không?

Đáp: Nhà mạng có quyền truy cập vào tất cả dữ liệu SMS.

Tiện ích của DeviceAppID-REF-DO để hỗ trợ 32 byte có vẻ không tương thích với thông số kỹ thuật GP hiện tại (chỉ cho phép 0 hoặc 20 byte). Vậy tại sao bạn lại giới thiệu thay đổi này? SHA-1 chưa đủ để tránh xung đột? Bạn đã đề xuất thay đổi này cho GP chưa, vì thay đổi này có thể không tương thích ngược với ARA-M/ARF hiện có?

Đáp: Để mang lại khả năng bảo mật phù hợp trong tương lai, tiện ích này ra mắt SHA-256 cho DeviceAppID-REF-DO ngoài SHA-1, hiện là lựa chọn duy nhất trong tiêu chuẩn GP SEAC. Bạn nên sử dụng thuật toán SHA-256.

Nếu DeviceAppID là 0 (trống), bạn có áp dụng quy tắc này cho tất cả ứng dụng thiết bị không thuộc một quy tắc cụ thể không?

Đáp: API của nhà mạng yêu cầu bạn phải điền DeviceAppID-REF-DO. Bạn không nên làm trống thuộc tính này cho mục đích kiểm thử và khi triển khai vận hành.

Theo thông số kỹ thuật của bạn, bạn không nên chấp nhận PKG-REF-DO chỉ được sử dụng mà không DeviceAppID-REF-DO. Tuy nhiên, phần này vẫn được mô tả trong Bảng 6-4 của quy cách là mở rộng định nghĩa của REF-DO. Bạn có chủ ý làm vậy không? Mã sẽ hoạt động như thế nào khi chỉ sử dụng PKG-REF-DO trong REF-DO?

Đáp: Tuỳ chọn đặt PKG-REF-DO làm một mục giá trị duy nhất trong REF-DO đã bị xoá trong phiên bản mới nhất. PKG-REF-DO chỉ nên xảy ra khi kết hợp với DeviceAppID-REF-DO.

Chúng tôi giả định rằng chúng tôi có thể cấp quyền truy cập vào tất cả các quyền dựa trên nhà mạng hoặc có quyền kiểm soát chi tiết hơn. Nếu có, điều gì xác định mối liên kết giữa mặt nạ bit và quyền thực tế? Một quyền cho mỗi lớp? Một quyền cho mỗi phương thức? Về lâu dài, liệu có đủ 64 quyền riêng biệt không?

Đáp: Chúng tôi sẽ xem xét việc này trong tương lai và rất mong nhận được ý kiến đề xuất của bạn.

Bạn có thể xác định thêm DeviceAppID cho Android cụ thể không? Đây là giá trị băm SHA-1 (20 byte) của chứng chỉ Nhà xuất bản dùng để ký ứng dụng nhất định, vậy tên này có phản ánh mục đích đó không? (Tên này có thể gây nhầm lẫn cho nhiều người đọc vì quy tắc này sẽ áp dụng cho tất cả các ứng dụng ký bằng cùng một chứng chỉ Nhà xuất bản đó.)

Đáp: Thông số kỹ thuật hiện có hỗ trợ DeviceAppID lưu trữ chứng chỉ. Chúng tôi đã cố gắng giảm thiểu các thay đổi về thông số kỹ thuật để giảm rào cản áp dụng. Để biết thông tin chi tiết, hãy xem Quy tắc về UICC.