Hệ thống con của Gatekeeper thực hiện xác thực mật khẩu/hình mở khoá 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 tiết 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 thời gian chờ nhất định và số lần 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 một mã thông báo xác thực được ký bằng khoá HMAC mỗi lần khởi động chỉ dành cho các thành phần bảo mật và mã thông báo này được gửi đến Kho khoá dựa trên phần cứng. Tức là mã xác thực của Gatekeeper sẽ thông báo cho Kho khoá rằng các ứng dụng có thể sử dụng khoá liên kết với xác thực (ví dụ: 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) – Dịch vụ liên kết C++ 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 phương thức triển khai cơ bản dành riêng cho nhà cung cấp củaIGatekeeper
.- Dịch vụ lớp trừu tượng phần cứng (HAL) của Gatekeeper – Phương thức triển khai giao diện AIDL
IGatekeeper
dành riêng cho nhà cung cấp. 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ô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 của trình kiểm soát truy cập (TA) – 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 mẫu thực tế.
LockSettingsService
đưa ra một yêu cầu (thông qua Binder) để truy cập vào 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 này sẽ chuyển đến 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
cấp cho các API khung Android quyền truy cập vào HAL và tham gia báo cáo quy trình xác thực của 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 nhằm xác thực mật khẩu. Việc triển khai TA của Gatekeeper phải có khả năng ký (đăng ký) và xác minh blob. Tất cả các phương thức triển khai dự kiến sẽ tuân thủ định dạng chuẩn cho mã xác thực (HardwareAuthToken
) được tạo trong 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 HardwareAuthToken.aidl
.
Việc triển khai HAL IGatekeeper
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ý blob đó và trả về chữ ký dưới dạng một handle. 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 tên người dùng mật khẩu đã đăng ký.
Khoá dùng để đăng ký và xác minh không được thay đổi và phải có thể lấy lại được mỗi khi khởi động thiết bị.
Trusty và các phương thức 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 môi trường TEE và chứa cách triển khai Gatekeeper đã được phê duyệt. Tuy nhiên, mọi hệ điều hành TEE đều có thể triển khai Gatekeeper, miễn là TEE có quyền truy cập vào khoá dựa trên phần cứng ổn định và đồng hồ đơn điệu, an toàn đánh dấu thời gian ở trạng thái tạm ngưng.
Trusty sử dụng một hệ thống IPC nội bộ để giao tiếp trực tiếp khoá bí mật dùng chung giữa KeyMint và cách triển khai Trusty của Gatekeeper (Trusty Gatekeeper). Khoá bí mật dùng chung này được dùng để ký mã thông báo xác thực được gửi đến Kho khoá 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 lưu trữ hoặc lưu vào bộ nhớ đệm giá trị. Các phương thức triển khai có thể tự do chia sẻ khoá bí mật này theo bất kỳ cách nào không làm ả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à lưu trữ riêng trong Gatekeeper.
Android cung cấp một phương thức triển khai C++ Gatekeeper 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, 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 việc 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
(mô tả trongHardwareAuthToken.aidl
). - Trình kiểm soát cổng TEE phải có thể chia sẻ khoá HMAC với KeyMint bằng một trong những cách sau:
- Thoả thuận bí mật dùng chung: Trình kiểm soát truy cập có thể tham gia vào quá trình đàm phán khoá HMAC mỗi khi khởi động bằng cách triển khai HAL
ISharedSecret
. Điều này đòi hỏi cả Gatekeeper và KeyMint đều có quyền truy cập vào một khoá bí mật dùng chung được chia sẻ trước. - Truy cập trực tiếp: Trình kiểm soát truy cập có thể truy xuất khoá HMAC từ KeyMint bằng cơ chế giao tiếp liên quy trình nội bộ của TEE, theo yêu cầu hoặc khi sử dụng lần đầu (sau đó được lưu vào bộ nhớ đệm).
- Thoả thuận bí mật dùng chung: Trình kiểm soát truy cập có thể tham gia vào quá trình đàm phán khoá HMAC mỗi khi khởi động bằng cách triển khai HAL
Mã nhận dạng an toàn của người dùng (SID)
SID người dùng là đạ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 trình tạo số giả ngẫu nhiên (PRNG) mã hoá mỗi khi 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à trường hợp đăng ký lại không đáng tin cậy và thường chỉ xảy ra khi người dùng đặt mật khẩu hoặc hình mở khoá lần đầu tiên.
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 của người dùng sẽ được di chuyển sang tên người dùng mật khẩu mới, giữ lại các khoá đã liên kết với tên người dùng đó.
SID của 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 tên người dùng khi mật khẩu được đăng ký.
SID của người dùng được đưa vào HardwareAuthToken
do hàm verify()
trả về và được liên kết với tất cả khoá Kho khoá liên kết với xác thực (để biết thông tin chi tiết về định dạng HardwareAuthToken
và Kho khoá, hãy xem phần Xác thực).
Xin lưu ý rằng khi một lệnh gọi không đáng tin cậy đến hàm enroll()
thay đổi SID của người dùng, lệnh gọi đó sẽ khiến các khoá 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ẽ huỷ bỏ các khoá nhạy cảm được bảo vệ bằng quyền truy cập gốc trong quá trình này.
Yêu cầu điều tiết
Gatekeeper phải có khả năng điều tiết an toàn các nỗ lực tấn công bằng phương thức brute-force trên thông tin xác thực của người dùng. Như minh hoạ trong GatekeeperVerifyResponse.aidl
, HAL cung cấp tính năng trả về thời gian chờ tính bằng mili giây. Thời gian chờ sẽ thông báo cho ứng dụng không gọi lại Gatekeeper cho đến khi hết thời gian chờ.
Trình kiểm soát truy cập không nên xử lý các yêu cầu nếu có yêu cầu đang chờ hết thời gian chờ.
Trình kiểm soát truy cập phải ghi một bộ đếm lỗi trước khi xác minh mật khẩu của người dùng. Nếu xác minh mật khẩu thành công, bộ đếm lỗi sẽ được xoá. Điều này giúp 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 tắt MMC (eMMC) được nhúng 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ó) và phải được điều tiết theo cách tương tự.
Nếu 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ợ phương thức mã hoá dựa trên tệp hoặc nếu bộ nhớ bảo mật quá chậm, thì quá trình triển khai có thể trực tiếp sử dụng Khối bộ nhớ được bảo vệ chống phát lại (RPMB).