Để ngăn chặn việc chạy tải trọng tuỳ ý bên trong pVM, Khung ảo hoá Android (AVF) sử dụng phương pháp bảo mật phân lớp, trong đó mỗi lớp bổ sung thêm các biện pháp thực thi. Dưới đây là danh sách các lớp bảo mật AVF:
Android đảm bảo rằng chỉ những ứng dụng có quyền pVM mới được phép tạo hoặc kiểm tra pVM.
Trình tải khởi động – Trình tải khởi động đảm bảo rằng chỉ những hình ảnh pVM do Google hoặc nhà cung cấp thiết bị ký mới được phép khởi động và tuân thủ quy trình Khởi động đã xác minh của Android. Cấu trúc này ngụ ý rằng các ứng dụng chạy pVM không thể gói hạt nhân của riêng mình.
pVM cung cấp khả năng phòng thủ chuyên sâu, chẳng hạn như với SELinux, cho các tải trọng chạy trong pVM. Tính năng phòng thủ chuyên sâu không cho phép ánh xạ dữ liệu dưới dạng tệp thực thi (
neverallow execmem
) và đảm bảo rằng W^X áp dụng cho tất cả các loại tệp.
Mô hình bảo mật
Tính bảo mật, tính toàn vẹn và khả năng sẵn có (bộ ba CIA) tạo nên một mô hình được thiết kế để hướng dẫn các chính sách bảo mật thông tin:
- Tính bảo mật là một bộ quy tắc giới hạn quyền truy cập vào thông tin.
- Tính toàn vẹn là sự đảm bảo rằng thông tin là đáng tin cậy và chính xác.
- Khả năng cung cấp là yếu tố đảm bảo rằng các pháp nhân được uỷ quyền có thể truy cập đáng tin cậy vào thông tin.
Tính bảo mật và tính toàn vẹn
Tính bảo mật bắt nguồn từ các thuộc tính tách biệt bộ nhớ do trình điều khiển ảo hoá pKVM thực thi. pKVM theo dõi quyền sở hữu bộ nhớ của từng trang bộ nhớ vật lý và mọi yêu cầu của chủ sở hữu về việc chia sẻ trang. pKVM đảm bảo rằng chỉ những pVM được cấp quyền (máy chủ lưu trữ và khách) mới có trang được ánh xạ trong bảng trang giai đoạn 2 do trình điều khiển ảo hoá kiểm soát. Cấu trúc này duy trì rằng nội dung của bộ nhớ do một pVM sở hữu vẫn là riêng tư, trừ phi chủ sở hữu chia sẻ nội dung đó một cách rõ ràng với một pVM khác.
Các quy định hạn chế để duy trì tính bảo mật cũng áp dụng cho mọi thực thể trong hệ thống thực hiện quyền truy cập bộ nhớ thay mặt cho pVM, cụ thể là các thiết bị có khả năng DMA và các dịch vụ chạy trong các lớp đặc quyền hơn. Nhà cung cấp hệ thống trên chip (SoC) phải đáp ứng một bộ yêu cầu mới thì mới có thể hỗ trợ pKVM. Nếu không, chúng tôi không thể đảm bảo tính bảo mật.
Tính toàn vẹn áp dụng cho dữ liệu trong bộ nhớ và tính toán. pVM không thể:
- Sửa đổi bộ nhớ của nhau khi chưa có sự đồng ý.
- Ảnh hưởng đến trạng thái CPU của nhau.
Các yêu cầu này do trình điều khiển ảo hoá thực thi. Tuy nhiên, các vấn đề liên quan đến tính toàn vẹn của dữ liệu cũng phát sinh với bộ nhớ dữ liệu ảo khi phải áp dụng các giải pháp khác, chẳng hạn như dm-verity hoặc AuthFS.
Các nguyên tắc này không khác gì cách tách biệt quy trình do Linux cung cấp, trong đó quyền truy cập vào các trang bộ nhớ được kiểm soát bằng bảng trang giai đoạn 1 và các nút chuyển đổi ngữ cảnh hạt nhân giữa các quy trình. Tuy nhiên, phần EL2 của pKVM (thực thi các thuộc tính này) có diện tích tấn công nhỏ hơn 3 bậc so với toàn bộ nhân Linux (khoảng 10 nghìn so với 20 triệu dòng mã) và do đó, mang lại sự đảm bảo chắc chắn hơn cho các trường hợp sử dụng quá nhạy cảm để dựa vào tính năng tách biệt quy trình.
Do kích thước của nó, pKVM rất phù hợp để xác minh chính thức. Chúng tôi đang tích cực hỗ trợ nghiên cứu học thuật nhằm mục đích chứng minh chính thức các thuộc tính này trên tệp nhị phân pKVM thực tế.
Phần còn lại của trang này đề cập đến các đảm bảo về tính bảo mật và tính toàn vẹn mà mỗi thành phần xung quanh pKVM cung cấp.
Trình điều khiển ảo hoá
pKVM là một trình điều khiển ảo hoá dựa trên KVM, giúp tách biệt pVM và Android thành các môi trường thực thi không tin cậy lẫn nhau. Các thuộc tính này sẽ giữ nguyên trong trường hợp bị xâm phạm trong bất kỳ pVM nào, bao gồm cả máy chủ lưu trữ. Các trình điều khiển ảo hoá thay thế tuân thủ AVF cần cung cấp các thuộc tính tương tự.
pVM không thể truy cập vào một trang thuộc về một thực thể khác, chẳng hạn như pVM hoặc trình điều khiển ảo hoá, trừ phi chủ sở hữu trang chia sẻ một cách rõ ràng. Quy tắc này bao gồm pVM máy chủ và áp dụng cho cả quyền truy cập CPU và DMA.
Trước khi một trang do pVM sử dụng được trả về máy chủ lưu trữ, chẳng hạn như khi pVM bị huỷ bỏ, trang đó sẽ bị xoá sạch.
Bộ nhớ của tất cả pVM và phần mềm pVM từ một lần khởi động thiết bị sẽ bị xoá trước khi trình tải khởi động hệ điều hành chạy trong lần khởi động thiết bị tiếp theo.
Khi một trình gỡ lỗi phần cứng (chẳng hạn như SJTAG) được đính kèm, pVM sẽ không thể truy cập vào các khoá đã tạo trước đó.
Chương trình cơ sở pVM không khởi động nếu không xác minh được hình ảnh ban đầu.
Chương trình cơ sở pVM sẽ không khởi động nếu tính toàn vẹn của
instance.img
bị xâm phạm.Chuỗi chứng chỉ DICE và Giá trị nhận dạng thiết bị phức hợp (CDI) được cung cấp cho một thực thể pVM chỉ có thể được lấy từ thực thể cụ thể đó.
Hệ điều hành khách
Microdroid là ví dụ về một hệ điều hành chạy trong pVM. Microdroid bao gồm một trình tải khởi động dựa trên U-boot, GKI và một tập hợp con của không gian người dùng Android cũng như một trình chạy tải trọng. Các thuộc tính này sẽ giữ nguyên trong trường hợp có sự xâm phạm trong bất kỳ pVM nào, bao gồm cả máy chủ lưu trữ. Các hệ điều hành thay thế chạy trong pVM phải cung cấp các thuộc tính tương tự.
Microdroid sẽ không khởi động nếu không xác minh được
boot.img
,super.img
,vbmeta.img
hoặcvbmeta\_system.img
.Microdroid sẽ không khởi động nếu quá trình xác minh APK không thành công.
Cùng một thực thể Microdroid sẽ không khởi động ngay cả khi APK đã được cập nhật.
Microdroid sẽ không khởi động nếu có bất kỳ APEX nào không xác minh được.
Microdroid sẽ không khởi động (hoặc khởi động ở trạng thái ban đầu sạch) nếu
instance.img
được sửa đổi bên ngoài pVM khách.Microdroid cung cấp chứng thực cho chuỗi khởi động.
Mọi nội dung sửa đổi (chưa ký) đối với hình ảnh ổ đĩa được chia sẻ với pVM khách đều gây ra lỗi I/O ở phía pVM.
Chuỗi chứng chỉ DICE và CDI được cung cấp cho một thực thể pVM chỉ có thể được lấy từ thực thể cụ thể đó.
Các hoạt động ghi vào phương tiện lưu trữ được mã hoá là bảo mật, tuy nhiên không có biện pháp bảo vệ tính năng khôi phục ở mức độ chi tiết của một khối mã hoá. Hơn nữa, việc can thiệp tuỳ ý bên ngoài vào một khối dữ liệu sẽ khiến khối đó xuất hiện dưới dạng rác đối với Microdroid, thay vì được phát hiện rõ ràng dưới dạng lỗi I/O.
Android
Đây là những thuộc tính do Android duy trì dưới dạng máy chủ lưu trữ nhưng không đúng trong trường hợp máy chủ lưu trữ bị xâm phạm:
pVM khách không thể tương tác trực tiếp với (chẳng hạn như để tạo kết nối
vsock
) các pVM khách khác.Chỉ
VirtualizationService
trong pVM lưu trữ mới có thể tạo kênh giao tiếp với pVM.Chỉ những ứng dụng được ký bằng khoá nền tảng mới có thể yêu cầu quyền tạo, sở hữu hoặc tương tác với pVM.
Giá trị nhận dạng, được gọi là giá trị nhận dạng ngữ cảnh (CID), dùng trong việc thiết lập các kết nối
vsock
giữa máy chủ và pVM sẽ không được sử dụng lại khi pVM máy chủ đang chạy. Ví dụ: bạn không thể thay thế một pVM đang chạy bằng một pVM khác.
Phạm vi cung cấp
Trong ngữ cảnh của pVM, khả năng sử dụng đề cập đến việc máy chủ lưu trữ phân bổ đủ tài nguyên cho máy khách để máy khách có thể thực hiện các tác vụ mà chúng được thiết kế để thực hiện.
Trách nhiệm của máy chủ bao gồm việc lên lịch cho CPU ảo của pVM. KVM, không giống như các trình điều khiển ảo hoá Loại 1 thông thường (chẳng hạn như Xen), đưa ra quyết định thiết kế rõ ràng để uỷ quyền việc lập lịch biểu tải cho nhân máy chủ. Do kích thước và độ phức tạp của trình lập lịch biểu hiện nay, quyết định thiết kế này làm giảm đáng kể kích thước của cơ sở điện toán đáng tin cậy (TCB) và cho phép máy chủ đưa ra các quyết định lập lịch biểu sáng suốt hơn để tối ưu hoá hiệu suất. Tuy nhiên, một máy chủ độc hại có thể chọn không bao giờ lên lịch cho khách.
Tương tự, pKVM cũng uỷ quyền xử lý ngắt vật lý cho nhân máy chủ để giảm độ phức tạp của trình điều khiển ảo hoá và để máy chủ chịu trách nhiệm lên lịch. Chúng tôi nỗ lực đảm bảo rằng việc chuyển tiếp các ngắt của khách chỉ dẫn đến việc từ chối dịch vụ (quá ít, quá nhiều hoặc ngắt bị định tuyến sai).
Cuối cùng, quy trình giám sát máy ảo (VMM) của máy chủ chịu trách nhiệm phân bổ bộ nhớ và cung cấp các thiết bị ảo, chẳng hạn như thẻ mạng. Một VMM độc hại có thể giữ lại tài nguyên của máy khách.
Mặc dù pKVM không cung cấp tình trạng còn chỗ cho khách, nhưng thiết kế này bảo vệ tình trạng còn chỗ của máy chủ khỏi những khách độc hại vì máy chủ luôn có thể ngăn chặn hoặc chấm dứt một khách và thu hồi tài nguyên của khách đó.
Khởi động an toàn
Dữ liệu được liên kết với các thực thể của pVM và tính năng khởi động bảo mật đảm bảo rằng bạn có thể kiểm soát quyền truy cập vào dữ liệu của một thực thể. Lần khởi động đầu tiên của một thực thể sẽ cung cấp thực thể đó bằng cách tạo ngẫu nhiên một muối bí mật cho pVM và trích xuất thông tin chi tiết, chẳng hạn như khoá công khai và hàm băm xác minh, từ các hình ảnh đã tải. Thông tin này được dùng để xác minh các lần khởi động tiếp theo của thực thể pVM và đảm bảo rằng các thông tin bí mật của thực thể chỉ được phát hành cho các hình ảnh đã vượt qua quy trình xác minh. Quá trình này xảy ra cho mọi giai đoạn tải trong pVM: phần mềm pVM, pVM ABL, Microdroid, v.v.
DICE cung cấp cho mỗi giai đoạn tải một cặp khoá chứng thực, trong đó phần công khai được chứng nhận trong chứng chỉ DICE cho giai đoạn đó. Cặp khoá này có thể thay đổi giữa các lần khởi động, vì vậy, một khoá bí mật niêm phong cũng được lấy ra ổn định cho thực thể máy ảo trong các lần khởi động lại và do đó, phù hợp để bảo vệ trạng thái ổn định. Khoá bí mật niêm phong rất có giá trị đối với máy ảo, vì vậy, bạn không nên sử dụng khoá này trực tiếp. Thay vào đó, khoá niêm phong phải được lấy từ khoá bí mật niêm phong và khoá bí mật niêm phong phải được huỷ bỏ càng sớm càng tốt.
Mỗi giai đoạn sẽ chuyển một đối tượng CBOR được mã hoá một cách xác định đến giai đoạn tiếp theo. Đối tượng này chứa các khoá bí mật và chuỗi chứng chỉ DICE, chứa thông tin trạng thái tích luỹ, chẳng hạn như liệu giai đoạn cuối cùng có được tải một cách an toàn hay không.
Thiết bị đã mở khoá
Khi thiết bị được mở khoá bằng fastboot oem unlock
, dữ liệu người dùng sẽ bị xoá sạch.
Quá trình này bảo vệ dữ liệu người dùng khỏi bị truy cập trái phép. Dữ liệu riêng tư đối với pVM cũng sẽ mất hiệu lực khi thiết bị được mở khoá.
Sau khi mở khoá, chủ sở hữu thiết bị có thể tuỳ ý cài đặt lại các phân vùng thường được bảo vệ bằng tính năng xác minh quy trình khởi động, bao gồm cả các phân vùng chứa quá trình triển khai pKVM. Do đó, pKVM trên thiết bị đã mở khoá sẽ không được tin cậy để duy trì mô hình bảo mật.
Các bên từ xa có thể quan sát trạng thái không an toàn tiềm ẩn này bằng cách kiểm tra trạng thái khởi động đã xác minh của thiết bị trong chứng chỉ chứng thực khoá.