Hệ thống con Gatekeeper thực hiện xác thực mẫu thiết bị / mật khẩu trong Môi trường thực thi tin cậy (TEE). Gatekeeper đăng ký và xác minh mật khẩu thông qua HMAC với khóa bí mật được hỗ trợ bằng phần cứng. Ngoài ra, Gatekeeper điều chỉnh các nỗ lực xác minh không thành công liên tiếp và phải từ chối các yêu cầu dịch vụ dựa trên thời gian chờ nhất định và số lần thử liên tiếp không thành công nhất định.
Khi người dùng xác minh mật khẩu của họ, Gatekeeper sử dụng bí mật được chia sẻ có nguồn gốc từ TEE để ký xác nhận xác thực để gửi đến Kho khóa được hỗ trợ bằng phần cứng . Nghĩa là, chứng thực Gatekeeper thông báo cho Keystore rằng các khóa ràng buộc xác thực (ví dụ: khóa mà ứng dụng đã tạo) có thể được phát hành để ứng dụng sử dụng.
Ngành kiến trúc
Gatekeeper liên quan đến ba thành phần chính:
-
gatekeeperd
(Trình nền người gác cổng). Một dịch vụ liên kết C ++ chứa logic độc lập với nền tảng và tương ứng với giao diệnGateKeeperService
Java. - Lớp trừu tượng phần cứng Gatekeeper (HAL) . Giao diện HAL trong
hardware/libhardware/include/hardware/gatekeeper.h
và mô-đun triển khai. - Người gác cổng (TEE) . Đối tác TEE của
gatekeeperd
. Một triển khai dựa trên TEE của Gatekeeper.
Gatekeeper yêu cầu triển khai Gatekeeper HAL (cụ thể là các chức năng trong hardware/libhardware/include/hardware/gatekeeper.h
) và thành phần Gatekeeper dành riêng cho TEE (một phần dựa trên tệp tiêu đề system/gatekeeper/include/gatekeeper/gatekeeper.h
bao gồm các chức năng ảo thuần túy để tạo / truy cập khóa và chữ ký điện toán).
LockSettingsService
thực hiện một yêu cầu (thông qua Binder) đến trình nền gatekeeperd
trong hệ điều hành Android. Sau đó, daemon gatekeeperd
thực hiện một yêu cầu đến đối tác của nó (Gatekeeper) trong TEE:

Daemon gatekeeperd
cung cấp cho các API khung Android quyền truy cập vào HAL và tham gia báo cáo xác thực thiết bị cho Keystore. Daemon gatekeeperd
chạy trong quy trình riêng của nó và tách biệt với máy chủ hệ thống.
Triển khai HAL
Daemon gatekeeperd
sử dụng HAL để tương tác với đối tác TEE của gatekeeperd
daemon để xác thực mật khẩu. Việc triển khai HAL phải có khả năng ký (đăng ký) và xác minh các đốm màu. Tất cả các triển khai dự kiến sẽ tuân theo định dạng tiêu chuẩn cho mã thông báo xác thực (AuthToken) được tạo trên mỗi lần xác minh mật khẩu thành công. Để biết chi tiết về nội dung và ngữ nghĩa của AuthToken, hãy xem định dạng AuthToken .
Việc triển khai tệp tiêu đề hardware/libhardware/include/hardware/gatekeeper.h
phải triển khai các chức năng enroll
và verify
:
- Chức năng
enroll
nhận một đốm mật khẩu, ký tên vào nó và trả về chữ ký dưới dạng một chốt điều khiển. Khối được trả về (từ một cuộc gọienroll
) phải có cấu trúc được hiển thị trongsystem/gatekeeper/include/gatekeeper/password_handle.h
. - Chức năng
verify
phải so sánh chữ ký được tạo ra bởi mật khẩu được cung cấp và đảm bảo nó khớp với xử lý mật khẩu đã đăng ký.
Khóa được sử dụng để đăng ký và xác minh không bao giờ được thay đổi và phải được dẫn xuất lại mỗi lần khởi động thiết bị.
Trusty và cá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à có triển khai GateKeeper đã được phê duyệt. Tuy nhiên, bạn có thể sử dụng bất kỳ Hệ điều hành TEE nào để triển khai Gatekeeper miễn là TEE có quyền truy cập vào khóa được hỗ trợ bằng phần cứng và đồng hồ đơn điệu, an toàn có dấu hiệu tạm ngừng .
Trusty sử dụng hệ thống IPC nội bộ để truyền đạt bí mật được chia sẻ trực tiếp giữa Keymaster và việc triển khai Trusty của Gatekeeper (Người gác cổng đáng tin cậy ). Bí mật được chia sẻ này được sử dụng để ký AuthTokens được gửi đến Keystore để cung cấp chứng thực xác minh mật khẩu. Trusty Gatekeeper yêu cầu khóa từ Keymaster cho mỗi lần sử dụng và không lưu giữ hoặc lưu giá trị vào bộ nhớ cache. Việc triển khai có thể tự do chia sẻ bí mật này theo bất kỳ cách nào mà không ảnh hưởng đến bảo mật.
Khóa HMAC được sử dụng để đăng ký và xác minh mật khẩu được lấy và duy nhất được lưu giữ trong GateKeeper.
Android cung cấp triển khai C ++ chung của GateKeeper chỉ yêu cầu bổ sung các quy trình dành riêng cho thiết bị là hoàn tất. Để triển khai TEE Gatekeeper với mã thiết bị cụ thể cho TEE của bạn, hãy tham khảo các chức năng và nhận xét trong system/gatekeeper/include/gatekeeper/gatekeeper.h
. Đối với TEE GateKeeper, các trách nhiệm chính của việc triển khai tuân thủ bao gồm:
- Tuân thủ Gatekeeper HAL.
- AuthTokens trả về phải được định dạng theo đặc tả AuthToken (được mô tả trong Xác thực ).
- TEE Gatekeeper phải có thể chia sẻ khóa HMAC với Keymaster, bằng cách yêu cầu khóa thông qua TEE IPC theo yêu cầu hoặc duy trì bộ nhớ đệm hợp lệ của giá trị mọi lúc.
ID bảo mật của người dùng (SID)
User SID là đại diện TEE của người dùng (không có kết nối mạnh mẽ với ID người dùng Android). SID được tạo bằng trình tạo số giả ngẫu nhiên mật mã (PRNG) bất cứ khi nào người dùng đăng ký mật khẩu mới mà không cần cung cấp mật khẩu trước đó. Đây được gọi là đăng ký lại không đáng tin cậy và không được phép bởi khung Android trong các trường hợp bình thường. Đăng ký lại đáng tin cậy xảy ra khi người dùng cung cấp mật khẩu hợp lệ, trước đó; trong trường hợp này, User SID được di chuyển sang trình xử lý mật khẩu mới, bảo toàn các khóa được liên kết với nó.
User SID là HMAC'ed cùng với mật khẩu trong trình điều khiển mật khẩu khi mật khẩu được đăng ký.
SID của người dùng được ghi vào AuthToken do chức năng verify
trả về và được liên kết với tất cả các khóa Kho khóa có ràng buộc xác thực (để biết chi tiết về định dạng AuthToken và Kho khóa, hãy xem Xác thực ). Vì một lệnh gọi không đáng tin cậy đến chức năng enroll
sẽ thay đổi User SID, lệnh gọi sẽ làm cho các khóa liên kết với mật khẩu đó trở nên vô dụng. Những kẻ tấn công có thể thay đổi mật khẩu cho thiết bị nếu chúng điều khiển hệ điều hành Android, nhưng chúng sẽ phá hủy các khóa nhạy cảm, được bảo vệ bằng root trong quá trình này.
Yêu cầu điều chỉnh
GateKeeper phải có khả năng ngăn chặn một cách an toàn các nỗ lực bạo lực đối với thông tin đăng nhập của người dùng. Như được hiển thị trong hardware/libhardware/include/hardware/gatekeeper.h
, HAL cung cấp việc trả về thời gian chờ tính bằng mili giây. Thời gian chờ thông báo cho khách hàng không gọi lại GateKeeper cho đến khi hết thời gian chờ; GateKeeper sẽ không yêu cầu dịch vụ nếu có thời gian chờ xử lý.
GateKeeper phải ghi một bộ đếm lỗi trước khi xác minh mật khẩu người dùng. Nếu xác minh mật khẩu thành công, bộ đếm lỗi sẽ bị xóa. Điều này ngăn chặn các cuộc tấn công ngăn chặn việc điều chỉnh bằng cách vô hiệu hóa MMC được nhúng (eMMC) sau khi thực hiện cuộc gọi verify
. Chức năng 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 chỉnh theo cách tương tự.
Nếu được thiết bị hỗ trợ, bạn nên ghi bộ đếm lỗi để lưu trữ an toàn. Nếu thiết bị không hỗ trợ mã hóa dựa trên tệp hoặc nếu bộ lưu trữ an toàn quá chậm, việc triển khai có thể sử dụng trực tiếp Khối bộ nhớ được Bảo vệ Phát lại (RPMB).