Microdroid

Microdroid là một hệ điều hành Android mini chạy trên pVM. Bạn không cần phải sử dụng Microdroid, bạn có thể khởi động VM với bất kỳ HĐH nào. Tuy nhiên, các trường hợp sử dụng chính của pVM không phải là chạy một hệ điều hành độc lập mà là cung cấp một môi trường thực thi biệt lập để chạy một phần ứng dụng với khả năng đảm bảo tính toàn vẹn và bảo mật mạnh mẽ hơn những gì Android có thể cung cấp.

Với các hệ điều hành truyền thống, việc cung cấp tính bảo mật và tính toàn vẹn cao đòi hỏi khối lượng công việc khá lớn (thường bị trùng lặp) vì hệ điều hành truyền thống không phù hợp với kiến ​​trúc tổng thể của Android. Ví dụ: với kiến ​​trúc Android tiêu chuẩn, các nhà phát triển cần triển khai một phương tiện tải và thực thi một cách an toàn một phần ứng dụng của họ trong pVM và tải trọng được xây dựng dựa trên glibc. Ứng dụng Android sử dụng Bionic, giao tiếp yêu cầu giao thức tùy chỉnh qua vsock và việc gỡ lỗi bằng adb là một thách thức.

Microdroid lấp đầy những khoảng trống này bằng cách cung cấp hình ảnh hệ điều hành có sẵn được thiết kế để yêu cầu ít nỗ lực nhất từ ​​các nhà phát triển để chuyển một phần ứng dụng của họ sang pVM. Mã gốc được xây dựng dựa trên Bionic, giao tiếp diễn ra qua Binder và cho phép nhập APEX từ Android và hiển thị một tập hợp con của API Android, chẳng hạn như kho khóa cho các hoạt động mã hóa bằng các khóa được hỗ trợ bằng phần cứng. Nhìn chung, các nhà phát triển nên tìm cho Microdroid một môi trường quen thuộc với các công cụ mà họ đã quen thuộc trong hệ điều hành Android đầy đủ.

Đặc trưng

Microdroid là phiên bản rút gọn của Android với một số thành phần bổ sung dành riêng cho pVM. Microdroid hỗ trợ:

  • Một tập hợp con các API NDK (tất cả các API để triển khai libc và Bionic của Android đều được cung cấp)
  • Các tính năng gỡ lỗi, chẳng hạn như adb, logcat, Tombstone và gdb
  • Đã xác minh Boot và kích hoạt SELinux
  • Đang tải và thực thi tệp nhị phân, cùng với các thư viện dùng chung, được nhúng trong APK
  • RPC kết nối qua vsock và trao đổi tệp bằng kiểm tra tính toàn vẹn ngầm định
  • Đang tải APEX

Microdroid không hỗ trợ:

  • API Android Java trong gói android.\*

  • Máy chủ hệ thống và Zygote

  • Đồ họa/Giao diện người dùng

  • HAL

Kiến trúc microdroid

Microdroid tương tự như Cuttlefish ở chỗ cả hai đều có kiến ​​trúc tương tự như Android tiêu chuẩn. Microdroid bao gồm các hình ảnh phân vùng sau được nhóm lại với nhau trong một hình ảnh đĩa tổng hợp:

  • bootloader - Xác minh và khởi động kernel.
  • boot.img - Chứa kernel và init ramdisk.
  • vendor_boot.img - Chứa các mô-đun hạt nhân dành riêng cho VM, chẳng hạn như virtio.
  • super.img - Bao gồm các phân vùng logic của hệ thống và nhà cung cấp.
  • vbmeta.img - Chứa siêu dữ liệu khởi động đã được xác minh.

Các hình ảnh phân vùng được gửi trong Virtualization APEX và được VirtualizationService đóng gói trong một hình ảnh đĩa tổng hợp. Ngoài hình ảnh đĩa tổng hợp hệ điều hành chính, VirtualizationService chịu trách nhiệm tạo các phân vùng khác sau:

  • payload - Một tập hợp các phân vùng được hỗ trợ bởi APEX và APK của Android
  • instance - Một phân vùng được mã hóa để duy trì dữ liệu khởi động được xác minh theo từng phiên bản, chẳng hạn như muối trên mỗi phiên bản, khóa công khai APEX đáng tin cậy và bộ đếm khôi phục

Trình tự khởi động

Trình tự khởi động Microdroid xảy ra sau khi khởi động Thiết bị . Khởi động thiết bị được thảo luận trong tài liệu Kiến trúc . Hình 1 cho thấy các bước diễn ra trong trình tự khởi động Microdroid:

Luồng khởi động an toàn của phiên bản microdroid

Hình 1. Luồng khởi động an toàn của phiên bản microdroid

Dưới đây là giải thích về các bước:

  1. Bộ nạp khởi động được crosvm tải vào bộ nhớ và pvmfw bắt đầu thực thi. Trước khi chuyển sang bộ nạp khởi động, pvmfw thực hiện hai tác vụ:

    • Xác minh bộ nạp khởi động để kiểm tra xem nó có đến từ một nguồn đáng tin cậy hay không (Google hoặc OEM).
    • Đảm bảo rằng cùng một bộ tải khởi động được sử dụng nhất quán trên nhiều lần khởi động của cùng một pVM thông qua việc sử dụng hình ảnh phiên bản. Cụ thể, pVM ban đầu được khởi động với một hình ảnh phiên bản trống. pvmfw lưu trữ danh tính của bộ nạp khởi động trong hình ảnh phiên bản và mã hóa nó. Vì vậy, vào lần tiếp theo pVM được khởi động với cùng một hình ảnh phiên bản, pvmfw sẽ giải mã danh tính đã lưu từ hình ảnh phiên bản đó và xác minh rằng nó giống với hình ảnh phiên bản đã được lưu trước đó. Nếu danh tính khác nhau, pvmfw sẽ từ chối khởi động.

    Bộ nạp khởi động sau đó sẽ khởi động Microdroid.

  2. Bộ nạp khởi động truy cập vào đĩa phiên bản. Tương tự như pvmfw, bộ nạp khởi động có một ổ đĩa phiên bản chứa thông tin về hình ảnh phân vùng được sử dụng trong phiên bản này trong các lần khởi động trước, bao gồm cả khóa chung.

  3. Bộ tải khởi động xác minh vbmeta và các phân vùng được xâu chuỗi, chẳng hạn như bootsuper , và nếu thành công, sẽ lấy ra các bí mật pVM giai đoạn tiếp theo. Sau đó, Microdroid trao quyền kiểm soát kernel.

  4. Bởi vì siêu phân vùng đã được bộ nạp khởi động xác minh (bước 3), kernel sẽ gắn kết siêu phân vùng đó một cách vô điều kiện. Giống như Android đầy đủ, siêu phân vùng bao gồm nhiều phân vùng logic được gắn trên dm-verity. Sau đó, quyền kiểm soát được chuyển đến quy trình init , quy trình này sẽ bắt đầu các dịch vụ gốc khác nhau. Tập lệnh init.rc tương tự như tập lệnh của Android đầy đủ nhưng được điều chỉnh cho phù hợp với nhu cầu của Microdroid.

  5. Quá trình init khởi động trình quản lý Microdroid để truy cập vào hình ảnh cá thể. Dịch vụ quản lý Microdroid giải mã hình ảnh bằng cách sử dụng khóa được truyền từ giai đoạn trước và đọc khóa chung cũng như bộ đếm khôi phục của APK và APEX ứng dụng khách mà pVM này tin tưởng. Thông tin này sau này được zipfuseapexd sử dụng khi họ gắn APK ứng dụng khách và các APEX được yêu cầu tương ứng.

  6. Dịch vụ quản lý Microdroid bắt đầu apexd .

  7. apexd gắn kết các APEX tại thư mục /apex/<name> . Sự khác biệt duy nhất giữa cách Android và Microdroid mounta APEXes là trong Microdroid, các tệp APEX đến từ các thiết bị khối ảo ( /dev/vdc1 , …), không phải từ các tệp thông thường ( /system/apex/*.apex ).

  8. zipfuse là hệ thống tệp FUSE của Microdroid. zipfuse gắn APK ứng dụng khách, về cơ bản là tệp Zip dưới dạng hệ thống tệp. Bên dưới, tệp APK được pVM chuyển dưới dạng thiết bị khối ảo với dm-verity, giống như APEX. APK chứa tệp cấu hình có danh sách APEX mà nhà phát triển ứng dụng đã yêu cầu cho phiên bản pVM này. Danh sách này được apexd sử dụng khi kích hoạt APEX.

  9. Luồng khởi động quay trở lại dịch vụ quản lý Microdroid. Sau đó, dịch vụ quản lý sẽ liên lạc với VirtualizationService của Android bằng Binder RPC để có thể báo cáo các sự kiện quan trọng như sự cố hoặc tắt máy và chấp nhận các yêu cầu như chấm dứt pVM. Dịch vụ người quản lý đọc vị trí của tệp nhị phân chính từ tệp cấu hình của APK và thực thi nó.

Trao đổi tập tin (AuthFS)

Thông thường, các thành phần Android sử dụng tệp cho đầu vào, đầu ra và trạng thái cũng như chuyển các tệp này dưới dạng bộ mô tả tệp ( loại ParcelFileDescriptor trong AIDL) với quyền truy cập được kiểm soát bởi nhân Android. AuthFS tạo điều kiện thuận lợi cho chức năng tương tự để trao đổi tệp giữa các điểm cuối không tin cậy lẫn nhau trên các ranh giới pVM.

Về cơ bản, AuthFS là một hệ thống tệp từ xa có tính năng kiểm tra tính toàn vẹn minh bạch đối với các hoạt động truy cập riêng lẻ, tương tự như fs-verity . Việc kiểm tra này cho phép giao diện người dùng, chẳng hạn như chương trình đọc tệp chạy trong pVM, phát hiện xem phần phụ trợ không đáng tin cậy, điển hình là Android, có bị giả mạo nội dung tệp hay không.

Để trao đổi tệp, phần phụ trợ ( fd\_server ) được bắt đầu với cấu hình trên mỗi tệp chỉ định xem nó dành cho đầu vào (chỉ đọc) hay đầu ra (đọc-ghi). Đối với đầu vào, giao diện người dùng thực thi rằng nội dung khớp với hàm băm đã biết, trên đầu cây Merkle để xác minh khi truy cập. Đối với đầu ra, AuthFS duy trì nội bộ một cây băm gồm các nội dung được quan sát từ các hoạt động ghi và có thể thực thi tính toàn vẹn khi dữ liệu được đọc lại.

Phương thức vận chuyển cơ bản hiện dựa trên Binder RPC, tuy nhiên điều đó có thể thay đổi trong tương lai để tối ưu hóa hiệu suất.

Quản lý khóa

pVM được cung cấp khóa niêm phong ổn định phù hợp với dữ liệu liên tục được bảo vệ và khóa chứng thực phù hợp để tạo chữ ký do pVM tạo ra có thể xác minh được.

Chất kết dính RPC

Phần lớn các giao diện của Android được thể hiện bằng AIDL , được xây dựng dựa trên trình điều khiển nhân Binder Linux. Để hỗ trợ giao diện giữa các pVM, giao thức Binder đã được viết lại để hoạt động trên các socket, vsock trong trường hợp các pVM. Hoạt động trên các ổ cắm cho phép sử dụng giao diện AIDL hiện có của Android trong môi trường mới này.

Để thiết lập kết nối, một điểm cuối, chẳng hạn như tải trọng pVM, tạo đối tượng RpcServer , đăng ký đối tượng gốc và bắt đầu lắng nghe các kết nối mới. Khách hàng có thể kết nối với máy chủ này bằng cách sử dụng đối tượng RpcSession , lấy đối tượng Binder và sử dụng nó giống hệt như đối tượng Binder được sử dụng với trình điều khiển Binder kernel.