Người gác cổng

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 thông qua HMAC 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 phục vụ các yêu cầu dựa trên thời gian chờ nhất định và số lần thử 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ẽ sử dụng khoá bí mật dùng chung bắt nguồn từ TEE để ký chứng thực xác thực nhằm gửi đến Kho khoá được hỗ trợ phần cứng. Tức là, quy trình chứng thực của Gatekeeper sẽ thông báo cho Kho khoá rằng các khoá liên kết với quy trình xác thực (ví dụ: khoá mà ứng dụng đã tạo) có thể được phát hành để các ứng dụng sử dụng.

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++ chứa logic độc lập với nền tảng và tương ứng với giao diện Java GateKeeperService.
  • Lớp trừu tượng phần cứng (HAL) của Gatekeeper. Giao diện HAL trong hardware/libhardware/include/hardware/gatekeeper.h và mô-đun triển khai.
  • Gatekeeper (TEE). Đối tác TEE của gatekeeperd. Cách triển khai Gatekeeper dựa trên TEE.

Gatekeeper yêu cầu triển khai Gatekeeper HAL (cụ thể là các hàm trong hardware/libhardware/include/hardware/gatekeeper.h) và thành phần Gatekeeper dành riêng cho TEE (dựa một phần trên tệp tiêu đề system/gatekeeper/include/gatekeeper/gatekeeper.h bao gồm các hàm ảo thuần tuý để tạo/truy cập khoá và tính toán chữ ký).

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 một yêu cầu đến đối tác (Gatekeeper) trong TEE:

Luồng của trình kiểm soát truy cập
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 để tương tác với đối tác TEE của trình nền gatekeeperd nhằm xác thực mật khẩu. Việc triển khai HAL phải có thể ký (đăng ký) và xác minh các blob. Tất cả các phương thức triển khai đều phải tuân thủ định dạng tiêu chuẩn cho mã xác thực (AuthToken) đượ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 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 hàm enrollverify:

  • Hàm enroll nhận 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 đến enroll) phải có cấu trúc như trong system/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, 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 khoá được hỗ trợ phần cứng và đồng hồ đơn điệu, an toàn đồng hồ trong 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 Keymaster 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ý AuthTokens được gửi đến Kho khoá nhằm cung cấp chứng thực xác minh mật khẩu. Trusty Gatekeeper yêu cầu khoá từ Keymaster 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 GateKeeper chung bằng C++ chỉ yêu cầu thêm các quy trình dành riêng cho thiết bị để hoàn tất. Để 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. Đối với TEE GateKeeper, trách nhiệm chính của việc triển khai tuân thủ bao gồm:

  • Tuân thủ HAL của Gatekeeper.
  • Mã xác thực được trả về phải được định dạng theo thông số kỹ thuật của mã xác thực (được mô tả trong phần Xác thực).
  • Trình kiểm soát cổng TEE phải có thể chia sẻ khoá HMAC với Keymaster, 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ị mọi lúc.

Mã nhận dạng bảo mật 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ố ngẫu nhiên giả mã hoá (PRNG) 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à khung Android không cho phép trong trường hợp thông thường. Việc đă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, SID của người dùng sẽ được di chuyển sang tên người dùng mới của mật khẩu, 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 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 ghi vào AuthToken do hàm verify trả về và 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 AuthToken và Kho khoá, hãy xem phần Xác thực). Vì lệnh gọi không đáng tin cậy đến hàm enroll sẽ thay đổi SID người dùng, nên 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. Những kẻ tấn công có thể thay đổi mật khẩu của thiết bị nếu chúng 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 lượt thử brute force trên thông tin xác thực của người dùng. Như minh hoạ trong hardware/libhardware/include/hardware/gatekeeper.h, 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ờ 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 nên xử lý các yêu cầu nếu có thời gian chờ đang chờ xử lý.

GateKeeper phải ghi 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 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).