Authentication

Android có khái niệm về trình xác thực người dùng, được dùng để mở khoá thiết bị và kiểm soát quyền truy cập vào khoá mã hoá. Việc này bao gồm các thành phần sau:

  • Nhà cung cấp dịch vụ và bộ nhớ khoá mã hoá. Kho khoá Android cung cấp các dịch vụ mã hoá dựa trên phần cứng cho ứng dụng. Hệ thống Kho khoá Android ở cấp khung được dịch vụ hệ thống keystore2 hỗ trợ. Điều này dựa trên cách triển khai KeyMint (trước đây là Keymaster) dành riêng cho nhà cung cấp, đảm bảo rằng chỉ có thể truy cập vào nội dung khoá trong một môi trường bảo mật dựa trên phần cứng, chẳng hạn như Môi trường thực thi đáng tin cậy (TEE) hoặc Secure Element (SE), chẳng hạn như StrongBox.
  • Trình xác thực người dùng. Chứng thực việc xác thực thành công người dùng. Android hỗ trợ các thành phần xác thực sau:
    • Gatekeeper để xác thực mã PIN, hình mở khoá hoặc mật khẩu trong TEE.
    • (Không bắt buộc) Weaver để xác thực mã PIN, hình mở khoá hoặc mật khẩu trong một phần tử bảo mật.
    • Vân tay để xác thực bằng vân tay.
    • Các phương pháp xác thực bằng sinh trắc học khác. Các thiết bị chạy Android 9 trở lên có thể sử dụng BiometricPrompt làm điểm tích hợp duy nhất cho vân tay và các dữ liệu sinh trắc học khác.
    Các thành phần này truyền đạt trạng thái xác thực của chúng với dịch vụ keystore2 thông qua việc sử dụng mã xác thực (AuthTokens) dựa trên phần cứng.

Mỗi thành phần này đều dành riêng cho nhà cung cấp, nhưng việc triển khai của nhà cung cấp là bắt buộc để đáp ứng thông số kỹ thuật của giao diện Lớp trừu tượng phần cứng (HAL) và để vượt qua các bài kiểm thử tương ứng của bộ kiểm thử nhà cung cấp (VTS).

Các phương thức triển khai của nhà cung cấp thường cũng được chia thành hai phần, được kết nối bằng một cơ chế giao tiếp dành riêng cho nhà cung cấp :

  • Dịch vụ HAL chạy dưới dạng một quy trình hệ thống Android, nhận các yêu cầu Binder từ hệ thống Android.
  • Ứng dụng đáng tin cậy (TA) chạy trong môi trường bảo mật, thực hiện các thao tác bảo mật thực tế.

Đăng ký

Trong lần khởi động đầu tiên của thiết bị sau khi đặt lại về trạng thái ban đầu, tất cả trình xác thực đều được chuẩn bị để nhận thông tin đăng ký thông tin xác thực từ người dùng. Ban đầu, người dùng phải đăng ký mã PIN, hình mở khoá hoặc mật khẩu bằng Gatekeeper (hoặc Weaver, nếu có). Quá trình đăng ký ban đầu này sẽ tạo ra một giá trị nhận dạng bảo mật (SID) ngẫu nhiên, 64 bit cho người dùng. Giá trị này đóng vai trò là giá trị nhận dạng cho người dùng và là mã thông báo liên kết cho tài liệu mã hoá của người dùng. SID người dùng này được liên kết bằng mật mã với mật khẩu của người dùng; việc xác thực thành công với Gatekeeper sẽ tạo ra AuthToken chứa SID người dùng cho mật khẩu đó.

Người dùng muốn thay đổi thông tin xác thực hiện có phải xuất trình thông tin xác thực đó. Nếu thông tin xác thực hiện có được xác minh thành công, thì SID người dùng liên kết với thông tin xác thực hiện có sẽ được chuyển sang thông tin xác thực mới, cho phép người dùng tiếp tục truy cập vào khoá sau khi thay đổi thông tin xác thực.

Trong một số trường hợp, quản trị viên thiết bị có thể thực hiện đăng ký không đáng tin cậy để đăng ký thông tin xác thực mới mà không cần cung cấp thông tin xác thực hiện có. Điều này cho phép người dùng truy cập vào thiết bị, nhưng các khoá được tạo trong SID người dùng cũ sẽ bị mất vĩnh viễn.

Xác thực

Phần này mô tả quy trình xác thực thông thường, bao gồm các hoạt động tương tác giữa nhiều thành phần trong cả Android và môi trường bảo mật. Xin lưu ý rằng tất cả thành phần bảo mật đều dùng chung một khoá HMAC bí mật (mỗi lần khởi động) mà các thành phần này dùng để xác thực thông báo của nhau.

Sau khi thiết lập thông tin xác thực và được chỉ định SID người dùng, người dùng có thể bắt đầu xác thực. Quá trình này bắt đầu khi người dùng cung cấp mã PIN, hình mở khoá, mật khẩu, vân tay hoặc thông tin sinh trắc học mạnh khác. Quy trình xác thực

Hình 1. Quy trình xác thực

  1. Người dùng cung cấp một phương pháp xác thực và dịch vụ liên quan sẽ gửi yêu cầu đến dịch vụ HAL.
    • Đối với mã PIN, hình mở khoá hoặc mật khẩu, LockSettingsService sẽ gửi yêu cầu đến gatekeeperd.
    • Quy trình xác thực dựa trên sinh trắc học phụ thuộc vào phiên bản Android. Trên các thiết bị chạy Android 8.x trở xuống, FingerprintService sẽ gửi yêu cầu đến fingerprintd). Trên các thiết bị chạy Android 9 trở lên, BiometricPrompt sẽ gửi yêu cầu đến trình nền sinh trắc học thích hợp (ví dụ: fingerprintd cho vân tay hoặc faced cho khuôn mặt) bằng cách sử dụng lớp BiometricManager thích hợp, chẳng hạn như FingerprintManager hoặc FaceManager. Bất kể phiên bản nào, quy trình xác thực bằng sinh trắc học đều diễn ra không đồng bộ sau khi yêu cầu được gửi.
  2. Dịch vụ HAL gửi dữ liệu đến TA tương ứng, sau đó TA sẽ tạo một AuthToken:
    • Để xác thực bằng mã PIN/hình mở khoá/mật khẩu, gatekeeperd sẽ gửi mã PIN, hình mở khoá hoặc hàm băm mật khẩu đến Gatekeeper TA trong TEE, thông qua dịch vụ Gatekeeper HAL. Nếu quá trình xác thực trong TEE thành công, thì Gatekeeper TA sẽ phát ra một AuthToken chứa SID người dùng tương ứng (đã ký bằng khoá HMAC dùng chung).
    • Để xác thực vân tay, fingerprintd sẽ theo dõi các sự kiện vân tay và gửi dữ liệu đến TA vân tay trong TEE, thông qua HAL vân tay. Nếu xác thực trong TEE thành công, Fingerprint TA sẽ phát ra một AuthToken (đã ký bằng khoá HMAC AuthToken).
    • Đối với các phương thức xác thực bằng sinh trắc học khác, trình nền sinh trắc học thích hợp sẽ theo dõi sự kiện sinh trắc học và gửi sự kiện đó đến dịch vụ HAL sinh trắc học và TA thích hợp.
  3. AuthToken đã ký thu được sẽ được chuyển đến dịch vụ hệ thống keystore2 thông qua giao diện Binder.
  4. Dịch vụ keystore2 đính kèm AuthTokens để yêu cầu KeyMint (trước đây là Keymaster) thực hiện các thao tác mã hoá. Dịch vụ HAL KeyMint sẽ chuyển các thông tin này đến TA KeyMint. TA KeyMint sẽ xác minh các thông tin này bằng khoá HMAC được chia sẻ với Gatekeeper và các thành phần TEE sinh trắc học được hỗ trợ. KeyMint tin tưởng dấu thời gian trong mã thông báo là thời gian xác thực gần đây nhất, quyết định xem có cho phép sử dụng khoá dựa trên dấu thời gian hay không.

Quy trình xác thực không yêu cầu giao tiếp trực tiếp giữa các TA trong môi trường bảo mật: AuthTokens chuyển từ TA trình xác thực đến dịch vụ keystore2 trong Android, sau đó chuyển chúng đến TA KeyMint. Điều này cũng cho phép dịch vụ keystore2 nhanh chóng từ chối các yêu cầu chắc chắn sẽ không thành công, vì dịch vụ này biết về AuthToken có sẵn trong hệ thống, giúp tiết kiệm IPC có thể tốn kém vào TEE.

Định dạng AuthToken

Định dạng của AuthToken được cung cấp theo thông số kỹ thuật AIDL trong HardwareAuthToken.aidl.

Quy trình khởi động thiết bị

Mỗi lần khởi động thiết bị, khoá HMAC AuthToken phải được tạo và chia sẻ với tất cả thành phần TEE (Gatekeeper, KeyMint và TA sinh trắc học được hỗ trợ). Để ngăn chặn các cuộc tấn công phát lại, khoá HMAC phải được tạo ngẫu nhiên mỗi khi thiết bị khởi động lại.

Có hai cách phổ biến để TA có quyền truy cập vào khoá HMAC dùng chung này:

  • Thoả thuận bí mật dùng chung: Dịch vụ keystore2 thực hiện giao thức thoả thuận khoá nhiều chiều khi khởi động thiết bị, cho phép lấy khoá HMAC một cách an toàn giữa các TA tham gia. Tuy nhiên, các TA tham gia phải có quyền truy cập vào một khoá bí mật chung được chia sẻ trước.
  • Truy cập trực tiếp: Các TA nằm trong cùng một môi trường bảo mật có thể sử dụng cơ chế giao tiếp liên quy trình nội bộ (phụ thuộc vào nền tảng) để chia sẻ khoá HMAC.

Trong cả hai trường hợp, khoá HMAC không bao giờ được cung cấp bên ngoài TEE.

Hệ điều hành Trusty chạy cùng với Android là một ví dụ về TEE, nhưng bạn có thể sử dụng các TEE khác. Trusty sử dụng hệ thống IPC nội bộ để giao tiếp trực tiếp giữa KeyMint và Gatekeeper hoặc TA sinh trắc học thích hợp. Khoá HMAC chỉ được lưu giữ trong KeyMint; Vân tay và Gatekeeper yêu cầu khoá từ KeyMint cho mỗi lần sử dụng và không lưu giữ hoặc lưu giá trị vào bộ nhớ đệm.

Vì một số TEE thiếu cơ sở hạ tầng IPC, nên không có hoạt động giao tiếp nào diễn ra giữa các ứng dụng trong TEE. Điều này cũng cho phép dịch vụ kho khoá nhanh chóng từ chối các yêu cầu chắc chắn sẽ không thành công vì dịch vụ này biết bảng xác thực trong hệ thống, giúp tiết kiệm IPC có thể tốn kém vào TEE.