Bảo mật

Để 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 cung cấp (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 sử dụng là sự đảm bảo về khả năng truy cập đáng tin cậy vào thông tin của các thực thể được uỷ quyền.

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 cô lập 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 DMAcác dịch vụ chạy trong các lớp đặc quyền hơn. Các 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, bạn không thể cung cấp thông tin mật.

Tính toàn vẹn áp dụng cho dữ liệu trong bộ nhớ tính toán. pVM không được:

  • Sửa đổi bộ nhớ của nhau khi chưa có sự đồng ý.
  • Tác độ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ó bề mặt tấn công thấp hơn 3 thứ tự so với toàn bộ nhân hệ điều hành Linux (khoảng 10 nghìn so với 20 triệu dòng mã) và do đó đảm bảo hơn nữa đối với những trường hợp sử dụng quá nhạy cảm nên không thể dựa vào cách ly 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ẻ 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à chương trình cơ sở pVM trong 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 khởi động U, GKI, một tập hợp con không gian người dùng Android và một trình chạy tải trọng. Các thuộc tính này giữ lại trong trường hợp bị xâm phạm trong mọi pVM, bao gồm cả máy chủ. Các hệ điều hành thay thế chạy trong pVM sẽ 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ặc vbmeta\_system.img.

  • Microdroid sẽ không khởi động nếu không xác minh được APK.

  • 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 bối cảnh pVM, availability (tình trạng hoạt động) đề cập đến việc máy chủ phân bổ đủ tài nguyên cho khách để khách có thể thực hiện các thao tác mà họ đượ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à tính 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ể quy mô của cơ sở điện toán đáng tin cậy (TCB) và cho phép máy chủ lưu trữ đưa ra quyết định lên lịch sáng suốt hơn để tối ưu hoá hiệu suất. Tuy nhiên, một máy chủ lưu trữ độc hại có thể chọn không bao giờ lên lịch cho máy khách.

Tương tự, pKVM cũng uỷ quyền xử lý ngắt vật lý cho hạt 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 cố gắng đảm bảo rằng việc chuyển tiếp các gián đoạn của khách chỉ dẫn đến tình trạng từ chối dịch vụ (quá ít, quá nhiều hoặc gián đoạn 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 khách.

Mặc dù pKVM không cung cấp khả năng hoạt động cho khách, nhưng thiết kế này giúp bảo vệ khả năng hoạt động của máy chủ khỏi các máy khách độc hại vì máy chủ luôn có thể giành quyền hoặc chấm dứt một máy khách và xác nhận lại tài nguyên của máy 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 những 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 có giá trị rất cao đố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 đó, bạn nên lấy khoá niêm phong từ khoá bí mật niêm phong và huỷ bỏ bí mật niêm phong 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 bạn mở khoá thiết bị bằng fastboot oem unlock, dữ liệu người dùng sẽ bị xoá. 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á.