Người gác cổng

Hệ thống con Gatekeeper thực hiện xác thực mẫu/mật khẩu thiết bị 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 bằng khóa bí mật được hỗ trợ bằng phần cứng. Ngoài ra, Gatekeeper ngăn chặn các nỗ lực xác minh thất bại 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ử thất bại liên tiếp 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 chia sẻ có nguồn gốc từ TEE để ký xác thực xác thực nhằm gửi đến Keystore được hỗ trợ bằng phần cứng . Nghĩa là, chứng thực của Gatekeeper thông báo cho Keystore rằng các khóa được ràng buộc xác thực (ví dụ: các khóa mà ứng dụng đã tạo) có thể được giải phóng để ứng dụng sử dụng.

Ngành kiến ​​​​trúc

Gatekeeper bao gồm ba thành phần chính:

  • gatekeeperd (Gatekeeper daemon). 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 của 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) . Bản sao TEE của gatekeeperd . Triển khai Gatekeeper dựa trên TEE.

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 đưa ra một yêu cầu (thông qua Binder) đến daemon gatekeeperd trong hệ điều hành Android. Sau đó, daemon gatekeeperd sẽ đưa ra yêu cầu đến đối tác của nó (Người giữ cổng) trong TEE:

Luồng người gác cổng
Hình 1. Luồng dữ liệu cấp cao để xác thực bằng GateKeeper

Trình nền của người gatekeeperd cung cấp cho 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

Trình nền của người gatekeeperd sử dụng HAL để tương tác với bản sao TEE của trình nền của người gatekeeperd cổng để 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ả quá trình triển khai dự kiến ​​sẽ tuân thủ định dạng 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 enrollverify :

  • Hàm enroll lấy một blob mật khẩu, ký tên và trả về chữ ký dưới dạng tay cầm. Blob được trả về (từ lệnh gọi đến enroll ) phải có cấu trúc được hiển thị trong system/gatekeeper/include/gatekeeper/password_handle.h .
  • Hàm verify phải so sánh chữ ký do mật khẩu được cung cấp tạo ra và đảm bảo nó khớp với phần xử lý mật khẩu đã đăng ký.

Khóa dùng để đăng ký và xác minh không bao giờ được thay đổi và phải có thể lấy lại được mỗi lần khởi động thiết bị.

Sự tin cậy 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 đang tích tắc ở trạng thái treo .

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 Gatekeeper của Trusty ( Trusty Gatekeeper ). Bí mật chung này được sử dụng để ký AuthTokens được gửi tới Keystore nhằm 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 trữ giá trị. 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 dùng để đăng ký và xác minh mật khẩu được lấy và lưu giữ duy nhất trong GateKeeper.

Android cung cấp cách triển khai GateKeeper C++ chung, chỉ yêu cầu bổ sung các quy trình dành riêng cho thiết bị để hoàn tất. Để triển khai TEE Gatekeeper với mã dành riêng cho thiết bị 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, trách nhiệm chính của việc triển khai tuân thủ bao gồm:

  • Tuân thủ Gatekeeper HAL.
  • AuthToken được 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ó khả năng 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 luôn duy trì bộ đệm giá trị hợp lệ.

ID bảo mật người dùng (SID)

SID người dùng là đại diện TEE của người dùng (không có kết nối mạnh 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 cung cấp mật khẩu trước đó. Điều này được gọi là đăng ký lại không đáng tin cậy và không được khung Android cho phép trong các 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 trước đó hợp lệ; trong trường hợp này, SID người dùng được di chuyển sang phần xử lý mật khẩu mới, bảo toàn các khóa được liên kết với nó.

SID người dùng được HMAC'ed cùng với mật khẩu trong phần xử lý mật khẩu khi mật khẩu được đăng ký.

SID người dùng được ghi vào AuthToken do hàm verify trả về và được liên kết với tất cả các khóa Kho khóa đượ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ì lệnh gọi không đáng tin cậy tới chức năng enroll sẽ thay đổi SID người dùng, lệnh gọi sẽ khiến 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 của thiết bị nếu chúng kiểm soát 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ệ gốc 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 các nỗ lực bạo lực một cách an toàn đối với thông tin xác thực của người dùng. Như được hiển thị trong hardware/libhardware/include/hardware/gatekeeper.h , HAL cung cấp khả năng 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 không nên phục vụ các yêu cầu nếu có thời gian chờ chờ.

GateKeeper phải viế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 điều tiết bằng cách vô hiệu hóa MMC (eMMC) được nhúng sau khi thực hiện lệnh 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ợ, chúng tôi khuyên bạn nên ghi bộ đếm lỗi vào bộ 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ộ nhớ an toàn quá chậm thì việc triển khai có thể sử dụng trực tiếp Khối bộ nhớ được bảo vệ bằng phát lại (RPMB).