Việc có môi trường thực thi đáng tin cậy trong hệ thống trên một khối xếp (SoC) mang đến cơ hội để các thiết bị Android cung cấp các dịch vụ bảo mật mạnh mẽ, được hỗ trợ phần cứng cho hệ điều hành Android, cho các dịch vụ nền tảng và thậm chí là cho các ứng dụng của bên thứ ba (dưới dạng tiện ích dành riêng cho Android cho Kiến trúc mã hoá Java tiêu chuẩn, hãy xem KeyGenParameterSpec
).
Bảng chú giải thuật ngữ
Dưới đây là thông tin tổng quan nhanh về các thành phần của Kho khoá và mối quan hệ giữa các thành phần đó.
AndroidKeyStore
- API Khung Android và thành phần mà các ứng dụng sử dụng để truy cập vào chức năng Kho khoá. Đây là một cách triển khai các API Kiến trúc mã hoá Java chuẩn, nhưng cũng thêm các tiện ích dành riêng cho Android và bao gồm mã Java chạy trong không gian quy trình của riêng ứng dụng.
AndroidKeyStore
thực hiện các yêu cầu của ứng dụng đối với hành vi của Kho khoá bằng cách chuyển tiếp các yêu cầu đó đến trình nền kho khoá. - trình nền kho khoá
- Trình nền hệ thống Android cung cấp quyền truy cập vào tất cả chức năng của Kho khoá thông qua API liên kết. Trình nền này chịu trách nhiệm lưu trữ keyblob do quá trình triển khai KeyMint (hoặc Keymaster) cơ bản tạo ra, chứa tài liệu khoá bí mật, được mã hoá để Kho khoá có thể lưu trữ nhưng không sử dụng hoặc tiết lộ các keyblob đó.
- Dịch vụ HAL KeyMint
- Máy chủ AIDL triển khai HAL
IKeyMintDevice
, cung cấp quyền truy cập vào TA KeyMint cơ bản. - Ứng dụng đáng tin cậy (TA) của KeyMint
- Phần mềm chạy trong ngữ cảnh bảo mật, thường là trong TrustZone trên SoC ARM, cung cấp tất cả các thao tác mã hoá bảo mật. Ứng dụng này có quyền truy cập vào tài liệu khoá thô và xác thực tất cả các điều kiện kiểm soát quyền truy cập trên khoá trước khi cho phép sử dụng.
LockSettingsService
- Thành phần hệ thống Android chịu trách nhiệm xác thực người dùng, cả mật khẩu và vân tay. Kho khoá không phải là một phần của Keystore, nhưng có liên quan vì Keystore hỗ trợ khái niệm khoá liên kết xác thực: các khoá chỉ có thể được sử dụng nếu người dùng đã xác thực.
LockSettingsService
tương tác với TA Gatekeeper và TA Fingerprint để lấy mã thông báo xác thực. Mã thông báo này được cung cấp cho trình nền kho khoá và được TA KeyMint sử dụng. - Chuyên gia hỗ trợ kỹ thuật Gatekeeper
- Thành phần chạy trong môi trường bảo mật chịu trách nhiệm xác thực mật khẩu của người dùng và tạo mã thông báo xác thực dùng để chứng minh cho TA KeyMint rằng đã xác thực cho một người dùng cụ thể tại một thời điểm cụ thể.
- Fingerprint TA
- Thành phần chạy trong môi trường bảo mật, chịu trách nhiệm xác thực vân tay người dùng và tạo mã thông báo xác thực dùng để chứng minh cho TA KeyMint rằng đã xác thực cho một người dùng cụ thể tại một thời điểm cụ thể.
Kiến trúc
API Kho khoá Android và HAL KeyMint cơ bản cung cấp một tập hợp các nguyên hàm mã hoá cơ bản nhưng đầy đủ để cho phép triển khai các giao thức bằng cách sử dụng khoá được kiểm soát quyền truy cập, được hỗ trợ phần cứng.
KeyMint HAL là một dịch vụ do OEM cung cấp mà dịch vụ Kho khoá sử dụng để cung cấp các dịch vụ mã hoá dựa trên phần cứng. Để đảm bảo an toàn cho tài liệu khoá riêng tư, các hoạt động triển khai HAL không thực hiện bất kỳ thao tác nhạy cảm nào trong không gian người dùng hoặc thậm chí trong không gian hạt nhân. Thay vào đó, dịch vụ HAL KeyMint chạy trong Android sẽ uỷ quyền các thao tác nhạy cảm cho một TA chạy trong một số loại môi trường bảo mật, thường là bằng cách tổng hợp và huỷ tổng hợp các yêu cầu ở một số định dạng dây do triển khai xác định.
Cấu trúc kết quả sẽ có dạng như sau:

Hình 1. Quyền truy cập vào KeyMint.
API HAL KeyMint là cấp thấp, được các thành phần nội bộ của nền tảng sử dụng và không hiển thị cho các nhà phát triển ứng dụng. API Java cấp cao hơn dành cho ứng dụng được mô tả trên trang web dành cho Nhà phát triển Android.
Kiểm soát quyền truy cập
Kho khoá Android cung cấp một thành phần trung tâm để lưu trữ và sử dụng các khoá mã hoá được hỗ trợ phần cứng, cả cho ứng dụng và các thành phần hệ thống khác. Do đó, quyền truy cập vào bất kỳ khoá riêng lẻ nào thường chỉ giới hạn ở ứng dụng hoặc thành phần hệ thống đã tạo khoá đó.
Miền kho khoá
Để hỗ trợ tính năng kiểm soát quyền truy cập này, các khoá được xác định cho Kho khoá bằng một trình mô tả khoá. Chỉ số mô tả khoá này cho biết một miền mà chỉ số mô tả thuộc về, cùng với một danh tính trong miền đó.
Ứng dụng Android truy cập vào Kho khoá bằng Kiến trúc mã hoá Java chuẩn, giúp xác định các khoá bằng bí danh chuỗi. Phương thức nhận dạng này liên kết với miền APP
của Kho khoá trong nội bộ; UID của phương thức gọi cũng được đưa vào để phân biệt các khoá của nhiều ứng dụng, ngăn một ứng dụng truy cập vào khoá của ứng dụng khác.
Trong nội bộ, mã khung cũng nhận được một mã khoá dạng số duy nhất sau khi khoá được tải. Mã nhận dạng dạng số này được dùng làm giá trị nhận dạng cho nội dung mô tả khoá trong miền KEY_ID
. Tuy nhiên, việc kiểm soát quyền truy cập vẫn được thực hiện: ngay cả khi một ứng dụng phát hiện mã nhận dạng khoá cho khoá của một ứng dụng khác, ứng dụng đó vẫn không thể sử dụng khoá đó trong trường hợp bình thường.
Tuy nhiên, một ứng dụng có thể cấp quyền sử dụng khoá cho một ứng dụng khác (như được xác định bằng UID). Thao tác cấp này trả về một giá trị nhận dạng cấp duy nhất, được dùng làm giá trị nhận dạng cho nội dung mô tả khoá trong miền GRANT
. Xin nhắc lại, việc kiểm soát quyền truy cập vẫn được thực hiện: ngay cả khi một ứng dụng bên thứ ba phát hiện mã nhận dạng cấp cho khoá của bên được cấp, ứng dụng đó vẫn không thể sử dụng khoá đó.
Kho khoá cũng hỗ trợ hai miền khác cho chỉ số mô tả khoá, được dùng cho các thành phần hệ thống khác và không dùng được cho các khoá do ứng dụng tạo:
- Miền
BLOB
cho biết không có giá trị nhận dạng nào cho khoá trong chỉ số mô tả khoá; thay vào đó, chỉ số mô tả khoá sẽ giữ chính keyblob và ứng dụng sẽ xử lý bộ nhớ keyblob. Phương thức này được các ứng dụng (ví dụ:vold
) sử dụng khi cần truy cập vào Kho khoá trước khi phân vùng dữ liệu được gắn. - Miền
SELINUX
cho phép các thành phần hệ thống chia sẻ khoá, với quyền truy cập do một giá trị nhận dạng dạng số tương ứng với nhãn SELinux quản lý (xem chính sách SELinux cho keystore_key).
Chính sách SELinux cho keystore_key
Các giá trị giá trị nhận dạng dùng cho chỉ số mô tả khoá Domain::SELINUX
được định cấu hình trong tệp chính sách SELinux keystore2_key_context
.
Mỗi dòng trong các tệp này liên kết một số với một nhãn SELinux, ví dụ:
# wifi_key is a keystore2_key namespace intended to be used by wpa supplicant and # Settings to share keystore keys. 102 u:object_r:wifi_key:s0
Thành phần cần quyền truy cập vào khoá có mã nhận dạng 102 trong miền SELINUX
phải có chính sách SELinux tương ứng. Ví dụ: để cho phép wpa_supplicant
lấy và sử dụng các khoá này, hãy thêm dòng sau vào hal_wifi_supplicant.te
:
allow hal_wifi_supplicant wifi_key:keystore2_key { get, use };
Giá trị nhận dạng dạng số cho các khoá Domain::SELINUX
được chia thành các dải để hỗ trợ nhiều phân vùng mà không xảy ra xung đột:
Phân vùng | Phạm vi | Tệp cấu hình |
---|---|---|
Hệ thống | 0 ... 9.999 | /system/etc/selinux/keystore2_key_contexts, /plat_keystore2_key_contexts
|
Hệ thống mở rộng | 10.000 – 19.999 | /system_ext/etc/selinux/system_ext_keystore2_key_contexts, /system_ext_keystore2_key_contexts
|
Sản phẩm | 20.000 ... 29.999 | /product/etc/selinux/product_keystore2_key_contexts, /product_keystore2_key_contexts
|
Nhà cung cấp | 30.000 ... 39.999 | /vendor/etc/selinux/vendor_keystore2_key_contexts, /vendor_keystore2_key_contexts
|
Các giá trị cụ thể sau đây đã được xác định cho phân vùng hệ thống:
ID không gian tên | Nhãn SEPolicy | UID | Mô tả |
---|---|---|---|
0 | su_key |
Không áp dụng | Khoá siêu người dùng. Chỉ dùng để kiểm thử trên các bản dựng userdebug và eng. Không liên quan đến bản dựng người dùng. |
1 | shell_key |
Không áp dụng | Không gian tên có sẵn cho shell. Chủ yếu dùng để kiểm thử, nhưng cũng có thể dùng trên các bản dựng của người dùng từ dòng lệnh. |
100 | vold_key |
Không áp dụng | Dành cho vold sử dụng. |
101 | odsign_key |
Không áp dụng | Được trình nền ký trên thiết bị sử dụng. |
102 | wifi_key |
AID_WIFI(1010) |
Được hệ thống con Wifi của Android sử dụng, bao gồm cả wpa_supplicant . |
103 | locksettings_key |
Không áp dụng | Được LockSettingsService sử dụng |
120 | resume_on_reboot_key |
AID_SYSTEM(1000) |
Được máy chủ hệ thống của Android sử dụng để hỗ trợ tiếp tục khi khởi động lại. |
Truy cập vào vectơ
Kho khoá cho phép kiểm soát những thao tác có thể thực hiện trên một khoá, ngoài việc kiểm soát quyền truy cập tổng thể vào một khoá. Các quyền keystore2_key
được mô tả trong tệp KeyPermission.aidl
.
Quyền của hệ thống
Ngoài các chế độ kiểm soát quyền truy cập theo khoá được mô tả trong Chính sách SELinux cho keystore_key, bảng sau đây mô tả các quyền SELinux khác cần thiết để thực hiện nhiều thao tác bảo trì và hệ thống:
Quyền | Ý nghĩa |
---|---|
add_auth
|
Bắt buộc phải có để thêm mã thông báo xác thực vào Kho khoá; do các nhà cung cấp dịch vụ xác thực như Gatekeeper hoặc BiometricManager sử dụng. |
clear_ns
|
Bắt buộc để xoá tất cả các khoá trong một không gian tên cụ thể; được dùng làm thao tác bảo trì khi gỡ cài đặt ứng dụng. |
list
|
Hệ thống yêu cầu để liệt kê các khoá theo nhiều thuộc tính, chẳng hạn như quyền sở hữu hoặc liệu các khoá đó có được liên kết với thông tin xác thực hay không. Quyền này không bắt buộc đối với các phương thức gọi liệt kê không gian tên của riêng chúng (thuộc quyền get_info ). |
lock
|
Bắt buộc phải thông báo cho kho khoá rằng thiết bị đã bị khoá, từ đó loại bỏ các khoá siêu cấp để đảm bảo rằng các khoá liên kết xác thực không dùng được. |
unlock
|
Bắt buộc phải thông báo cho kho khoá rằng thiết bị đã được mở khoá, khôi phục quyền truy cập vào các khoá siêu bảo vệ khoá liên kết xác thực. |
reset
|
Bắt buộc để đặt lại Kho khoá về trạng thái mặc định của nhà sản xuất, xoá tất cả các khoá không quan trọng đối với hoạt động của hệ điều hành Android. |
Nhật ký
Trong Android 5 trở xuống, Android có một API dịch vụ mã hoá đơn giản, được hỗ trợ phần cứng, do các phiên bản 0.2 và 0.3 của lớp trừu tượng phần cứng Keymaster (HAL) cung cấp. Kho khoá cung cấp các thao tác ký và xác minh số, cùng với việc tạo và nhập các cặp khoá ký bất đối xứng. Tính năng này đã được triển khai trên nhiều thiết bị, nhưng có nhiều mục tiêu bảo mật không thể dễ dàng đạt được chỉ bằng một API chữ ký. Android 6.0 đã mở rộng API Kho khoá để cung cấp nhiều chức năng hơn.
Android 6.0
Trong Android 6.0, Keymaster 1.0 đã thêm các thuật toán mã hoá đối xứng nguyên gốc, AES và HMAC, cũng như một hệ thống kiểm soát quyền truy cập cho các khoá được hỗ trợ phần cứng. Các chế độ kiểm soát truy cập được chỉ định trong quá trình tạo khoá và được thực thi trong suốt thời gian hoạt động của khoá. Bạn có thể hạn chế việc chỉ sử dụng được khoá sau khi người dùng được xác thực và chỉ cho các mục đích cụ thể hoặc với các tham số mật mã cụ thể.
Ngoài việc mở rộng phạm vi các thuật toán mã hoá gốc, Kho khoá trong Android 6.0 còn bổ sung những tính năng sau:
- Một lược đồ kiểm soát mức sử dụng để cho phép hạn chế mức sử dụng khoá, nhằm giảm thiểu rủi ro về bảo mật do sử dụng sai khoá
- Một lược đồ kiểm soát quyền truy cập để cho phép hạn chế khoá cho người dùng, ứng dụng và phạm vi thời gian đã chỉ định
Android 7.0
Trong Android 7.0, Keymaster 2 đã thêm tính năng hỗ trợ chứng thực khoá và liên kết phiên bản.
Chứng thực khoá cung cấp chứng chỉ khoá công khai chứa nội dung mô tả chi tiết về khoá và các chế độ kiểm soát quyền truy cập của khoá, để xác minh từ xa sự tồn tại của khoá trong phần cứng bảo mật và cấu hình của khoá.
Liên kết phiên bản liên kết các khoá với hệ điều hành và phiên bản cấp bản vá. Điều này đảm bảo rằng kẻ tấn công phát hiện ra điểm yếu trong phiên bản cũ của hệ thống hoặc phần mềm TEE không thể khôi phục thiết bị về phiên bản dễ bị tấn công và sử dụng các khoá được tạo bằng phiên bản mới hơn. Ngoài ra, khi một khoá có phiên bản và cấp bản vá nhất định được sử dụng trên một thiết bị đã được nâng cấp lên phiên bản hoặc cấp bản vá mới hơn, khoá đó sẽ được nâng cấp trước khi có thể sử dụng và phiên bản khoá trước đó sẽ không hợp lệ. Khi thiết bị được nâng cấp, các phím sẽ chuyển tiếp cùng với thiết bị, nhưng mọi thao tác quay lại thiết bị về bản phát hành trước đó sẽ khiến các phím không sử dụng được.
Android 8.0
Trong Android 8.0, Keymaster 3 đã chuyển đổi từ HAL cấu trúc C kiểu cũ sang giao diện HAL C++ được tạo từ một định nghĩa trong ngôn ngữ định nghĩa giao diện phần cứng mới (HIDL). Trong quá trình thay đổi, nhiều loại đối số đã thay đổi, mặc dù các loại và phương thức có mối tương ứng một với một với các loại cũ và phương thức cấu trúc HAL.
Ngoài bản sửa đổi giao diện này, Android 8.0 còn mở rộng tính năng chứng thực của Keymaster 2 để hỗ trợ chứng thực giấy tờ tuỳ thân. Chứng thực danh tính cung cấp một cơ chế hạn chế và không bắt buộc để chứng thực mạnh mẽ các giá trị nhận dạng phần cứng, chẳng hạn như số sê-ri thiết bị, tên sản phẩm và mã điện thoại (IMEI hoặc MEID). Để triển khai phần bổ sung này, Android 8.0 đã thay đổi giản đồ chứng thực ASN.1 để thêm tính năng chứng thực giấy tờ tuỳ thân. Các hoạt động triển khai Keymaster cần tìm một số cách an toàn để truy xuất các mục dữ liệu có liên quan, cũng như xác định một cơ chế để vô hiệu hoá tính năng một cách an toàn và vĩnh viễn.
Android 9
Trong Android 9, các bản cập nhật bao gồm:
- Cập nhật lên Keymaster 4
- Hỗ trợ các phần tử bảo mật được nhúng
- Hỗ trợ nhập khoá an toàn
- Hỗ trợ mã hoá 3DES
- Thay đổi liên kết phiên bản để
boot.img
vàsystem.img
có các phiên bản được đặt riêng biệt cho phép cập nhật độc lập
Android 10
Android 10 đã ra mắt phiên bản 4.1 của HAL Keymaster, trong đó thêm:
- Hỗ trợ các khoá chỉ có thể sử dụng khi thiết bị được mở khoá
- Hỗ trợ các khoá chỉ có thể dùng trong giai đoạn khởi động sớm
- Hỗ trợ không bắt buộc cho khoá bộ nhớ được gói bằng phần cứng
- Hỗ trợ không bắt buộc cho tính năng chứng thực dành riêng cho thiết bị trong StrongBox
Android 12
Android 12 đã ra mắt HAL KeyMint mới, thay thế HAL Keymaster nhưng cung cấp chức năng tương tự. Ngoài tất cả các tính năng nêu trên, HAL KeyMint cũng bao gồm:
- Hỗ trợ thoả thuận về khoá ECDH
- Hỗ trợ khoá chứng thực do người dùng chỉ định
- Hỗ trợ các khoá có số lần sử dụng hạn chế
Android 12 cũng bao gồm một phiên bản mới của trình nền hệ thống kho khoá, được viết lại bằng Rust và được gọi là keystore2
Android 13
Android 13 đã thêm phiên bản 2 của HAL KeyMint, bổ sung tính năng hỗ trợ cho Curve25519 cho cả việc ký và thoả thuận khoá.