Weaver

Lớp trừu tượng phần cứng (HAL) của Weaver (IWeaver.aidl) được giới thiệu trong Android 8.1, cung cấp một giao diện bảo mật để xác thực người dùng bằng Hệ số kiến thức màn hình khoá (LSKF) như mã PIN, hình mở khoá và mật khẩu.

Weaver thay thế chức năng xác minh LSKF của Gatekeeper. Tuy nhiên, Gatekeeper vẫn được dùng để tạo mã thông báo xác thực phần cứng.

Trong Android 9 trở lên, CDD 9.11.2 yêu cầu các thiết bị hỗ trợ StrongBox cung cấp phần cứng bảo mật chuyên dụng để hỗ trợ quy trình xác thực người dùng an toàn. Việc triển khai Weaver HAL bằng phần cứng bảo mật này đáp ứng yêu cầu "xác thực người dùng bảo mật".

Trên các thiết bị không có Secure Element (SE) chuyên dụng, Weaver vẫn có thể được triển khai trong Môi trường thực thi đáng tin cậy (TEE) như Trusty.

Thành phần

Weaver bao gồm 3 thành phần:

  • Giao diện AIDL của Weaver (IWeaver): Thông số kỹ thuật chính thức của HAL. Android 13 trở xuống dùng HIDL thay vì AIDL.
  • Dịch vụ Lớp trừu tượng phần cứng (HAL) Weaver: Một quy trình Android dành riêng cho nhà cung cấp, triển khai giao diện IWeaver.
  • Ứng dụng đáng tin cậy (TA) Weaver: Logic cốt lõi chạy trong một môi trường an toàn. Nó thực hiện quy trình xác minh LSKF và áp dụng giới hạn số lần gọi. Dịch vụ HAL giao tiếp với TA bằng một kênh bảo mật dành riêng cho quá trình triển khai.

Giao diện

Giao diện của Weaver trình bày một mảng có kích thước cố định gồm các khe cắm liên tục, mỗi khe cắm chứa một khoá có kích thước cố định và một giá trị có kích thước cố định. Mỗi khe cắm được xác định bằng mã nhận dạng của khe cắm, một số nguyên trong khoảng [0, numSlots - 1]. Bạn chỉ có thể truy cập vào giá trị của một khe khi cung cấp khoá khớp với khoá đã lưu trữ.

Giao diện của Weaver bao gồm:

  • getConfig(): Truy xuất số lượng vùng quảng cáo, kích thước khoá và kích thước giá trị mà quá trình triển khai hỗ trợ.
  • write(): Ghi đè vị trí được chỉ định bằng một cặp khoá-giá trị mới. Thao tác này là thao tác nguyên tử và khiến dữ liệu trước đó không thể khôi phục vĩnh viễn (xoá an toàn).
  • read(): Cố gắng truy xuất giá trị của khe được chỉ định. Thao tác này chỉ thành công khi thời gian chờ giới hạn tốc độ (do TA thực thi) không hoạt động và khoá được cung cấp khớp chính xác với khoá đã lưu trữ.

Để biết toàn bộ quy cách giao diện, hãy xem IWeaver.aidl.

Sử dụng bằng Android

Khi có một chế độ triển khai Weaver, LockSettingsService trong máy chủ hệ thống Android sẽ dùng chế độ này để bảo vệ dữ liệu người dùng. Đối với mỗi người dùng trên thiết bị, LockSettingsService sẽ quản lý một khe Weaver:

  • Khoá vùng quảng cáo (weaverKey): Một hàm băm của LSKF của người dùng. Nếu người dùng không có phương thức khoá màn hình, thì một chuỗi mặc định sẽ được dùng.
  • Giá trị khe cắm (weaverSecret): Một bí mật mật mã học được tạo ngẫu nhiên có entropy cao.

weaverSecret được thiết kế để chỉ được truy xuất bằng một trong hai cách:

  • Cung cấp weaverKey chính xác cho Weaver TA trong chính sách giới hạn tốc độ của nó.
  • Xâm nhập vào môi trường bảo mật nơi Weaver TA chạy. Đây là một thử thách rất khó.

LockSettingsService sử dụng cả weaverKeyweaverSecret để mã hoá Mật khẩu tổng hợp của người dùng. Vì Mật khẩu tổng hợp bảo vệ bộ nhớ được mã hoá bằng thông tin đăng nhập (CE) của người dùng cho Mã hoá dựa trên tệp (FBE)các khoá liên kết với hoạt động xác thực của người dùng trong Kho khoá Android, nên dữ liệu vẫn không thể truy cập được cho đến khi Weaver phát hành mã bí mật.

Weaver so với Gatekeeper

Trước đây, Gatekeeper HAL đóng hai vai trò riêng biệt trong một lệnh gọi verify():

  1. Xác minh: Kiểm tra LSKF, với tính năng giới hạn tốc độ được TEE thực thi.
  2. Chứng thực: Phát hành một HardwareAuthToken để thông báo cho KeyMint (trước đây là Keymaster) rằng quá trình xác thực LSKF đã thành công.

Lý do chuyển sang Weaver

Với việc ra mắt mã thông báo đặt lại mật mã an toàn trong Android 8.1, "Mật khẩu giả" đã trở thành khoá bí mật mật mã chính. Giờ đây, hai vai trò nêu trên được xử lý bằng các quy trình đăng ký Gatekeeper riêng biệt, một cho LSKF trong userId + 100000 và một cho Mật khẩu tổng hợp trong userId.

Weaver được giới thiệu để đảm nhận vai trò đầu tiên, sử dụng giao diện HAL đơn giản hơn với khả năng hỗ trợ các hoạt động triển khai dựa trên Phần tử bảo mật (SE).

Tính năng Weaver Người gác cổng
Xoá an toàn Bạn cần xoá một cách an toàn và dễ dàng triển khai vì giao diện này sử dụng một số lượng cố định các khe cắm có kích thước cố định. Không bắt buộc phải xoá an toàn và rất khó triển khai vì giao diện hỗ trợ số lượng đăng ký không giới hạn.
Phần cứng Được tối ưu hoá cho SE, nhưng cũng hoạt động trong TEE. Chỉ có TEE. Việc triển khai tính năng này trong một SE không mang lại lợi ích bảo mật với thiết kế hiện tại.
Xử lý lỗi Mã lỗi rõ ràng hơn Mã lỗi không rõ ràng. Do đó, màn hình khoá không phân biệt giữa LSKF không chính xác và các lỗi không liên quan.
Tính nguyên tố Mã trong LockSettingsService sử dụng Weaver để thực hiện các thay đổi LSKF một cách riêng lẻ. Dữ liệu mới được ghi vào một vùng Weaver mới và vùng cũ chỉ bị xoá khi an toàn. Mã trong LockSettingsService sử dụng Gatekeeper không thực hiện các thay đổi LSKF một cách riêng lẻ. Mọi dữ liệu người dùng có thể bị mất nếu xảy ra lỗi trong quá trình thay đổi LSKF.

Mã tham chiếu

Mã tham chiếu cho các hoạt động triển khai Weaver trong các phần tử bảo mật tương thích với ISO/IEC7816-4 có trong AOSP: external/libese/.

Thử nghiệm

Để xác thực quá trình triển khai Weaver, hãy sử dụng VtsHalWeaverTargetTest:

atest VtsHalWeaverTargetTest

hoặc:

vts-tradefed run vts -m VtsHalWeaverTargetTest