Hệ thống con Gatekeeper thực hiện quy trình xác thực bằng hình mở khoá/mật khẩu thiết bị trong Môi trường thực thi đáng tin cậy (TEE). Gatekeeper đăng ký và xác minh mật khẩu bằng khoá bí mật dựa trên phần cứng. Ngoài ra, Gatekeeper sẽ điều chỉnh tốc độ cho các lần xác minh không thành công liên tiếp và phải từ chối yêu cầu dịch vụ dựa trên một thời gian chờ nhất định và một số lần xác minh không thành công liên tiếp nhất định.
Khi người dùng xác minh mật khẩu, Gatekeeper sẽ phát ra một mã xác thực được ký bằng khoá HMAC cho mỗi lần khởi động. Khoá này chỉ có sẵn cho các thành phần bảo mật và mã này sẽ được gửi đến Kho khoá dựa trên phần cứng. Tức là mã thông báo xác thực Gatekeeper sẽ thông báo cho Kho khoá rằng các ứng dụng có thể dùng các khoá liên kết với quy trình xác thực (ví dụ: các khoá mà ứng dụng đã tạo).
Kiến trúc
Gatekeeper bao gồm 3 thành phần chính:
gatekeeperd
(Trình nền Gatekeeper) – Một dịch vụ C++ Binder trong Android chứa logic độc lập với nền tảng triển khai giao diện AIDLIGateKeeperService
, dựa trên một hoạt động triển khai cụ thể của nhà cung cấp cơ bản đối vớiIGatekeeper
.- Dịch vụ lớp trừu tượng phần cứng (HAL) Gatekeeper – Một phương thức triển khai dành riêng cho nhà cung cấp của giao diện AIDL
IGatekeeper
. Dịch vụ HAL này chạy trong Android, nhưng chức năng cốt lõi của Gatekeeper cần chạy trong một môi trường an toàn, vì vậy, dịch vụ này thường giao tiếp với TA Gatekeeper. - Ứng dụng đáng tin cậy (TA) Gatekeeper – Một phương thức triển khai dành riêng cho nhà cung cấp chạy trong TEE và thực hiện quy trình xác minh mật khẩu hoặc hình mở khoá thực tế.
LockSettingsService
đưa ra một yêu cầu (thông qua Binder) đến trình nền gatekeeperd
trong hệ điều hành Android. Sau đó, trình nền gatekeeperd
sẽ đưa ra yêu cầu về dịch vụ HAL IGatekeeper
và yêu cầu đó sẽ đến lượt TA Gatekeeper tương ứng trong TEE:

Hình 1. Luồng dữ liệu cấp cao để xác thực bằng GateKeeper.
Trình nền gatekeeperd
cho phép các API khung Android truy cập vào HAL và tham gia báo cáo hoạt động xác thực thiết bị cho Kho khoá.
Trình nền gatekeeperd
chạy trong quy trình riêng và tách biệt với máy chủ hệ thống.
Triển khai HAL
Trình nền gatekeeperd
sử dụng HAL IGatekeeper
để tương tác với TA Gatekeeper cơ bản cho hoạt động xác thực bằng mật khẩu. Việc triển khai TA Gatekeeper phải có khả năng ký (đăng ký) và xác minh các blob. Tất cả các hoạt động triển khai đều phải tuân thủ định dạng tiêu chuẩn cho mã thông báo xác thực (HardwareAuthToken
) được tạo trên mỗi lần xác minh mật khẩu thành công. Để biết thông tin chi tiết về nội dung và ngữ nghĩa của HardwareAuthToken
, hãy xem định nghĩa về HardwareAuthToken.aidl
.
Các quy trình triển khai IGatekeeper
HAL của nhà cung cấp phải triển khai các hàm enroll
và verify
:
- Phương thức
enroll
lấy một blob mật khẩu, ký tên và trả về chữ ký dưới dạng một giá trị nhận dạng. Blob được trả về (từ lệnh gọi đếnenroll
) phải có cấu trúc như trongsystem/gatekeeper/include/gatekeeper/password_handle.h
. - Hàm
verify
phải so sánh chữ ký do mật khẩu đã cung cấp tạo ra và đảm bảo chữ ký đó khớp với mã nhận dạng mật khẩu đã đăng ký.
Khoá dùng để đăng ký và xác minh không bao giờ được thay đổi và có thể được dẫn xuất lại ở mỗi lần khởi động thiết bị.
Trusty và các cách triển khai khác
Hệ điều hành Trusty là hệ điều hành đáng tin cậy nguồn mở của Google dành cho các môi trường TEE và chứa một chế độ triển khai đã được phê duyệt của Gatekeeper. Tuy nhiên, bất kỳ TEE OS nào cũng có thể triển khai Gatekeeper miễn là TEE có quyền truy cập vào một khoá liên tục dựa trên phần cứng và một đồng hồ đơn điệu, bảo mật đếm ngược khi tạm ngưng.
Trusty sử dụng một hệ thống IPC nội bộ để truyền đạt trực tiếp một bí mật được chia sẻ giữa KeyMint (trước đây là Keymaster) và việc triển khai Gatekeeper của Trusty (Trusty Gatekeeper). Khoá bí mật dùng chung này được dùng để ký AuthToken được gửi đến Keystore nhằm cung cấp chứng thực về việc xác minh mật khẩu. Trusty Gatekeeper yêu cầu khoá từ KeyMint cho mỗi lần sử dụng và không duy trì hoặc lưu vào bộ nhớ đệm giá trị. Các hoạt động triển khai có thể chia sẻ khoá bí mật này theo bất kỳ cách nào không ảnh hưởng đến tính bảo mật.
Khoá HMAC dùng để đăng ký và xác minh mật khẩu được lấy và chỉ được lưu giữ trong Gatekeeper.
Android cung cấp một phương thức triển khai Gatekeeper C++ chung, chỉ yêu cầu thêm các quy trình dành riêng cho thiết bị để hoàn tất; phương thức triển khai Trusty dựa trên phương thức này. Để triển khai TEE Gatekeeper bằng mã dành riêng cho thiết bị cho TEE của bạn, hãy tham khảo các hàm và nhận xét trong system/gatekeeper/include/gatekeeper/gatekeeper.h
. Các trách nhiệm chính của một hoạt động triển khai tuân thủ bao gồm:
- Tuân thủ HAL
IGatekeeper
. - Mã thông báo xác thực được trả về phải được định dạng theo quy cách
HardwareAuthToken
(được mô tả trong phần Xác thực). - Gatekeeper TEE phải có khả năng chia sẻ khoá HMAC với KeyMint, bằng cách yêu cầu khoá thông qua TEE IPC theo yêu cầu hoặc duy trì bộ nhớ đệm hợp lệ của giá trị này mọi lúc.
Mã nhận dạng an toàn (SID) của người dùng
SID người dùng là thông tin đại diện TEE của một người dùng (không có mối liên kết chặt chẽ với mã nhận dạng người dùng Android). SID được tạo bằng một trình tạo số giả ngẫu nhiên (PRNG) mã hoá bất cứ khi nào người dùng đăng ký mật khẩu mới mà không cung cấp mật khẩu trước đó. Đây được gọi là quy trình đăng ký lại không đáng tin cậy và thường chỉ xảy ra khi người dùng lần đầu tiên đặt mật khẩu hoặc hình mở khoá.
Việc đăng ký lại đáng tin cậy xảy ra khi người dùng cung cấp một mật khẩu hợp lệ trước đó, chẳng hạn như khi thay đổi mật khẩu. Trong trường hợp này, SID người dùng sẽ được di chuyển sang mã nhận dạng mật khẩu mới, giữ lại các khoá được liên kết với mã nhận dạng đó.
SID người dùng được đưa vào quy trình xác thực HMAC cùng với mật khẩu trong mã nhận dạng mật khẩu khi mật khẩu được đăng ký.
SID người dùng có trong HardwareAuthToken
do hàm verify()
trả về và được liên kết với tất cả các khoá Keystore liên kết với hoạt động xác thực (để biết thông tin chi tiết về định dạng HardwareAuthToken
và Keystore, hãy xem phần Xác thực).
Xin lưu ý rằng vì một lệnh gọi không đáng tin cậy đến hàm enroll()
sẽ thay đổi SID của người dùng, nên lệnh gọi này sẽ khiến các khoá được liên kết với mật khẩu đó trở nên vô dụng. Kẻ tấn công có thể thay đổi mật khẩu của thiết bị nếu kiểm soát được hệ điều hành Android, nhưng chúng sẽ phá huỷ các khoá nhạy cảm được bảo vệ bằng quyền truy cập vào hệ thống trong quá trình này.
Điều tiết yêu cầu
Gatekeeper phải có khả năng điều chỉnh một cách an toàn các nỗ lực tấn công giả mạo trên thông tin đăng nhập của người dùng. Như minh hoạ trong GatekeeperVerifyResponse.aidl
, HAL cung cấp khả năng trả về thời gian chờ tính bằng mili giây. Thời gian chờ này thông báo cho ứng dụng không gọi lại Gatekeeper cho đến khi hết thời gian chờ.
Gatekeeper không được xử lý các yêu cầu nếu có thời gian chờ đang diễn ra.
Gatekeeper phải ghi bộ đếm lỗi trước khi xác minh mật khẩu người dùng. Nếu quá trình xác minh mật khẩu thành công, bộ đếm số lần thất bại sẽ được xoá. Điều này ngăn chặn các cuộc tấn công ngăn chặn việc điều tiết bằng cách vô hiệu hoá MMC nhúng (eMMC) sau khi đưa ra lệnh gọi verify
. Hàm enroll
cũng xác minh mật khẩu người dùng (nếu được cung cấp) và phải được điều tiết theo cách tương tự.
Nếu được thiết bị hỗ trợ, bạn nên ghi bộ đếm lỗi vào bộ nhớ bảo mật. Nếu thiết bị không hỗ trợ tính năng mã hoá dựa trên tệp hoặc nếu bộ nhớ bảo mật quá chậm, thì các hoạt động triển khai có thể sử dụng trực tiếp Khối bộ nhớ được bảo vệ chống phát lại (RPMB).