Authentication

Android có khái niệm về trình xác thực người dùng 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 liên quan đến 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 lại 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ô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).
  • Trình xác thực người dùng. Chứng thực việc xác thực người dùng thành công. Android hỗ trợ các thành phần xác thực sau:
    • Cổng kiểm soát để xác thực bằng 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 vân tay.
    • Các phương thức xác thực sinh trắc học khác. Các thiết bị đi kèm với Android 9 trở lên có thể sử dụng BiometricPrompt làm một điểm tích hợp duy nhất cho vân tay và các thông tin sinh trắc học khác.
    Các thành phần này thông báo 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ã thông báo xác thực (AuthTokens) được hỗ trợ phần cứng .

Mỗi thành phần trong số này là dành riêng cho nhà cung cấp, nhưng nhà cung cấp phải triển khai để đáp ứng quy cách 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ử bộ kiểm thử nhà cung cấp (VTS) tương ứng.

Quá trình 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 liên kết 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 của 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ó). Lần đăng ký ban đầu này sẽ tạo một giá trị nhận dạng bảo mật (SID) 64 bit cho người dùng được tạo ngẫu nhiên, đó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 phương thức mã hoá với mật khẩu của người dùng; các lần xác thực thành công với Gatekeeper sẽ dẫn đến 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 cung cấp thông tin xác thực đó. Nếu xác minh thành công thông tin xác thực hiện có, 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 các 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 quá trình đă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ó. Thao tác 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ả cá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) để xác thực tin nhắn của nhau.

Sau khi thiết lập thông tin xác thực và được chỉ định một SID người dùng, người dùng có thể bắt đầu quy trình xác thực. Quy 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 thức xác thực và dịch vụ liên kết 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 nhận dạng sinh trắc học thích hợp (ví dụ: fingerprintd đối với vân tay hoặc faced đối với 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, quá trình xác thực bằng sinh trắc học cũng 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, tạo AuthToken:
    • Để xác thực bằng mã PIN/hình mở khoá/mật khẩu, gatekeeperd sẽ gửi hàm băm mã PIN, hình mở khoá hoặc mật khẩu đến TA Gatekeeper trong TEE thông qua dịch vụ HAL Gatekeeper. Nếu xác thực trong TEE thành công, Gatekeeper TA sẽ phát một AuthToken chứa SID người dùng tương ứng (được ký bằng khoá HMAC dùng chung).
    • Đối với quy trình 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 Fingerprint TA trong TEE thông qua Fingerprint HAL. Nếu xác thực trong TEE thành công, TA vân tay sẽ phát ra một AuthToken (được ký bằng khoá HMAC AuthToken).
    • Đối với các phương thức xác thực 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 và TA sinh trắc học 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 khoá này đến TA KeyMint. TA này sẽ xác minh các khoá đó 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 cho phép sử dụng khoá hay không dựa trên dấu thời gian đó.

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 các mã này đế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 không thể thực hiện được, vì dịch vụ này có thông tin về các AuthToken có sẵn trong hệ thống, giúp tiết kiệm một 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ị

Trong 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ả các thành phần TEE (Cổng bảo vệ, KeyMint/Keymaster và các 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 tạo 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 dùng 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 nội bộ giữa các quy trình (phụ thuộc vào nền tảng) để chia sẻ khoá HMAC.

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

Hệ điều hành Trusty chạy bên cạnh 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 trữ trong KeyMint; Fingerprint và 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ị.