Trong Android 11, các bản cập nhật OTA có thể được áp dụng bằng cách sử dụng cơ chế cập nhật A/B hoặc cập nhật A/B ảo , kết hợp với các phương thức của lớp RecoverySystem . Sau khi thiết bị khởi động lại để áp dụng bản cập nhật OTA, Resume-on-Reboot (RoR) sẽ mở khóa bộ lưu trữ Mã hóa thông tin xác thực (CE) của thiết bị .
Mặc dù các đối tác có thể ghép nối quy trình này với một tính năng hệ thống OTA áp dụng các bản cập nhật khi thiết bị được cho là không hoạt động trong Android 11, nhưng trong Android 12, các đối tác không cần một tính năng hệ thống OTA bổ sung. Quy trình RoR cung cấp thêm tính bảo mật và tiện lợi cho người dùng vì các bản cập nhật có thể được thực hiện trong thời gian thiết bị không sử dụng, trong khi các chức năng cập nhật dựa trên máy chủ và đa máy khách của Android 12 cùng nhau cung cấp khả năng bảo mật ở cấp độ phần cứng của thiết bị.
Mặc dù bạn phải cấp quyền cho thiết bị để tính năng android.hardware.reboot_escrow
hỗ trợ RoR trong Android 11, nhưng bạn không cần phải làm điều này để bật RoR dựa trên máy chủ trong Android 12 trở lên vì chúng không sử dụng HAL.
Lý lịch
Bắt đầu với Android 7, Android hỗ trợ Khởi động trực tiếp , cho phép các ứng dụng trên thiết bị khởi động trước khi người dùng mở khóa bộ nhớ CE. Việc triển khai hỗ trợ Khởi động trực tiếp đã mang đến cho Người dùng trải nghiệm tốt hơn trước khi cần nhập Hệ số kiến thức màn hình khóa (LSKF) sau khi khởi động.
RoR cho phép mở khóa bộ lưu trữ CE của tất cả các ứng dụng trên thiết bị, kể cả những ứng dụng không hỗ trợ Khởi động trực tiếp, khi quá trình khởi động lại được bắt đầu sau khi cập nhật OTA. Tính năng này cho phép người dùng nhận thông báo từ tất cả các ứng dụng đã cài đặt của họ, sau khi khởi động lại.
mô hình mối đe dọa
Việc triển khai RoR phải đảm bảo rằng khi thiết bị rơi vào tay kẻ tấn công, kẻ tấn công sẽ rất khó khôi phục dữ liệu được mã hóa CE của người dùng, ngay cả khi thiết bị được bật nguồn, bộ lưu trữ CE được mở khóa và thiết bị được mở khóa bởi người dùng sau khi nhận được bản cập nhật OTA. Khả năng chống tấn công nội bộ phải có hiệu quả ngay cả khi kẻ tấn công giành được quyền truy cập vào các khóa ký mã hóa phát sóng.
Cụ thể, kẻ tấn công có thiết bị thực tế không được đọc bộ lưu trữ CE và có các khả năng cũng như giới hạn sau:
khả năng
- Có thể sử dụng khóa ký của bất kỳ nhà cung cấp hoặc công ty nào để ký các tin nhắn tùy ý.
- Có thể khiến thiết bị nhận được bản cập nhật OTA.
- Có thể sửa đổi hoạt động của bất kỳ phần cứng nào (chẳng hạn như bộ xử lý ứng dụng hoặc bộ nhớ flash) - ngoại trừ được nêu chi tiết trong phần Giới hạn bên dưới. (Tuy nhiên, sửa đổi như vậy liên quan đến cả độ trễ ít nhất một giờ và chu kỳ nguồn phá hủy nội dung RAM.)
Hạn chế
- Không thể sửa đổi hoạt động của phần cứng chống giả mạo (ví dụ: Titan M).
- Không thể đọc RAM của thiết bị trực tiếp.
- Không thể đoán thông tin đăng nhập của người dùng (PIN, hình mở khóa, mật khẩu) hoặc khiến chúng được nhập vào.
Giải pháp
Hệ thống cập nhật RoR của Android 12 cung cấp khả năng bảo mật chống lại những kẻ tấn công rất tinh vi và làm như vậy trong khi mật khẩu và mã PIN trên thiết bị vẫn nằm trên thiết bị—chúng không bao giờ được gửi đến hoặc lưu trữ trên máy chủ của Google. Đây là tổng quan về quy trình đảm bảo các mức bảo mật được cung cấp tương tự như hệ thống RoR cấp thiết bị, dựa trên phần cứng:
- Android áp dụng các biện pháp bảo vệ bằng mật mã cho dữ liệu được lưu trữ trên thiết bị.
- Tất cả dữ liệu được bảo vệ bởi các khóa được lưu trữ trong môi trường thực thi đáng tin cậy (TEE).
- TEE chỉ giải phóng các khóa nếu hệ điều hành đang chạy vượt qua xác thực bằng mật mã ( khởi động đã xác minh ).
- Dịch vụ RoR chạy trên các máy chủ của Google bảo mật dữ liệu CE bằng cách lưu trữ một bí mật chỉ có thể được truy xuất trong một khoảng thời gian giới hạn . Điều này hoạt động trên toàn hệ sinh thái Android.
- Khóa mật mã, được bảo vệ bằng mã PIN của người dùng, được sử dụng để mở khóa thiết bị và giải mã bộ lưu trữ CE.
- Khi lên lịch khởi động lại qua đêm, Android sẽ nhắc người dùng nhập mã PIN của họ, sau đó tính toán mật khẩu tổng hợp (SP).
- Sau đó, nó mã hóa SP hai lần: một lần với khóa
K_s
được lưu trữ trong RAM và một lần nữa với khóaK_k
được lưu trữ trong TEE. - SP được mã hóa kép được lưu trữ trên đĩa và SP bị xóa khỏi RAM. Cả hai khóa đều được tạo mới và chỉ được sử dụng cho một lần khởi động lại .
- Khi đến lúc khởi động lại, Android sẽ giao
K_s
cho máy chủ. Biên nhận cóK_k
được mã hóa trước khi được lưu trữ trên đĩa. - Sau khi khởi động lại, Android sử dụng
K_k
để giải mã biên nhận, sau đó gửi nó đến máy chủ để lấyK_s
.-
K_k
vàK_s
được sử dụng để giải mã SP được lưu trữ trên đĩa. - Android sử dụng SP để mở khóa bộ lưu trữ CE và cho phép khởi động ứng dụng bình thường.
-
K_k
vàK_s
bị loại bỏ.
-
Các bản cập nhật giúp bảo mật điện thoại của bạn có thể diễn ra vào thời điểm thuận tiện cho bạn: trong khi bạn ngủ.
phát lại SIM-PIN
Trong một số điều kiện nhất định, mã PIN của thẻ SIM được xác minh từ bộ đệm, một quá trình được gọi là phát lại SIM-PIN.
Thẻ SIM có mã PIN được bật cũng phải trải qua quá trình xác minh mã PIN liền mạch (phát lại SIM-PIN) sau khi khởi động lại không giám sát để khôi phục kết nối di động (bắt buộc đối với các cuộc gọi điện thoại, tin nhắn SMS và dịch vụ dữ liệu). Mã PIN của SIM và thông tin thẻ SIM phù hợp của nó (số ICCID và số khe cắm SIM) được lưu trữ an toàn cùng với nhau. Chỉ có thể truy xuất và sử dụng mã PIN được lưu trữ để xác minh sau khi khởi động lại thành công mà không cần giám sát. Nếu thiết bị được bảo mật, mã PIN của SIM được lưu trữ bằng các khóa được bảo vệ bởi LSKF. Nếu SIM đã bật mã PIN, thì việc tương tác với máy chủ RoR yêu cầu kết nối WiFi để cập nhật OTA và RoR dựa trên máy chủ, đảm bảo chức năng cơ bản (với kết nối di động) sau khi khởi động lại.
Mã PIN của SIM được mã hóa lại và lưu trữ mỗi khi người dùng bật, xác minh hoặc sửa đổi thành công. Mã PIN của SIM sẽ bị hủy nếu xảy ra bất kỳ trường hợp nào sau đây:
- Đã tháo hoặc đặt lại SIM.
- Người dùng vô hiệu hóa mã PIN.
- Đã xảy ra quá trình khởi động lại không phải do RoR khởi tạo.
Chỉ có thể sử dụng mã PIN của SIM được lưu trữ một lần sau khi khởi động lại do RoR bắt đầu và chỉ trong một khoảng thời gian rất ngắn (20 giây)– nếu các chi tiết của thẻ SIM khớp với nhau. Mã PIN SIM được lưu trữ không bao giờ rời khỏi ứng dụng Trình quản lý điện thoại và không thể truy xuất mã này bằng các mô-đun bên ngoài.
Hướng dẫn thực hiện
Trong Android 12, các chức năng RoR dựa trên máy chủ và nhiều máy khách giúp các đối tác tải nhẹ hơn khi họ đẩy các bản cập nhật OTA. Cập nhật cần thiết có thể xảy ra trong thời gian ngừng hoạt động của thiết bị thuận tiện, chẳng hạn như trong giờ ngủ được chỉ định.
Để đảm bảo rằng các bản cập nhật OTA trong những khoảng thời gian như vậy không làm gián đoạn người dùng, hãy sử dụng chế độ tối để giảm thiểu phát xạ ánh sáng. Để làm như vậy, hãy để bộ tải khởi động của thiết bị tìm kiếm chuỗi lý do unattended
. Nếu unattended
là true
, hãy đặt thiết bị ở chế độ tối. Lưu ý rằng mỗi OEM có trách nhiệm giảm thiểu phát thải âm thanh và ánh sáng.
Nếu đang nâng cấp lên Android 12 hoặc khởi chạy thiết bị Android 12, thì bạn không cần phải làm gì để triển khai chức năng RoR mới.
Có một lệnh gọi mới trong luồng nhiều khách hàng, isPreparedForUnattendedUpdate
, được hiển thị bên dưới:
@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)
Bạn không cần triển khai điều này vì HAL không còn được dùng kể từ Android 12.
Trình quản lý điện thoại
Ứng dụng khách OTA gọi API hệ thống TelephonyManager
khi sắp khởi động lại trong Android 12. API này di chuyển tất cả các mã PIN được lưu trong bộ nhớ cache từ trạng thái AVAILABLE
sang trạng thái REBOOT_READY
. API hệ thống TelephonyManager
được bảo vệ bởi quyền REBOOT
Manifest hiện có.
/**
* The unattended reboot was prepared successfully.
* @hide
*/
@SystemApi
public static final int PREPARE_UNATTENDED_REBOOT_SUCCESS = 0;
/**
* The unattended reboot was prepared, but the user will need to manually
* enter the PIN code of at least one SIM card present in the device.
* @hide
*/
@SystemApi
public static final int PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED = 1;
/**
* The unattended reboot was not prepared due to generic error.
* @hide
*/
@SystemApi
public static final int PREPARE_UNATTENDED_REBOOT_ERROR = 2;
/** @hide */
@Retention(RetentionPolicy.SOURCE)
@IntDef(prefix = {"PREPARE_UNATTENDED_REBOOT_"},
value = {
PREPARE_UNATTENDED_REBOOT_SUCCESS,
PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED,
PREPARE_UNATTENDED_REBOOT_ERROR
})
public @interface PrepareUnattendedRebootResult {}
/**
* Prepare TelephonyManager for an unattended reboot. The reboot is
* required to be done shortly after the API is invoked.
*
* Requires system privileges.
*
* <p>Requires Permission:
* {@link android.Manifest.permission#REBOOT}
*
* @return {@link #PREPARE_UNATTENDED_REBOOT_SUCCESS} in case of success.
* {@link #PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED} if the device contains
* at least one SIM card for which the user needs to manually enter the PIN
* code after the reboot. {@link #PREPARE_UNATTENDED_REBOOT_ERROR} in case
* of error.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.REBOOT)
@PrepareUnattendedRebootResult
public int prepareForUnattendedReboot()
API hệ thống TelephonyManager được các APK đặc quyền sử dụng.
thử nghiệm
Để kiểm tra API mới, hãy thực hiện lệnh này:
adb shell cmd phone unattended-reboot
Lệnh này chỉ hoạt động khi shell đang chạy với quyền root ( adb root
).
Chỉ dành cho Android 11
Phần còn lại của trang này áp dụng cho Android 11.
Kể từ tháng 7 năm 2020, việc triển khai RoR HAL được chia thành hai loại:
- Nếu phần cứng SoC hỗ trợ tính bền bỉ của RAM trong các lần khởi động lại, các OEM có thể sử dụng triển khai mặc định trong AOSP ( Ký quỹ RAM mặc định ).
- Nếu phần cứng của thiết bị hoặc SoC hỗ trợ vùng chứa phần cứng an toàn (bộ đồng xử lý bảo mật riêng biệt có RAM và ROM riêng), thì ngoài ra, thiết bị đó phải thực hiện những việc sau:
- Có thể phát hiện khởi động lại CPU chính.
- Có một nguồn hẹn giờ phần cứng vẫn tồn tại trong các lần khởi động lại. Nghĩa là, vùng kín phải có khả năng phát hiện khởi động lại và hết hạn bộ hẹn giờ đã đặt trước khi khởi động lại.
- Hỗ trợ lưu trữ khóa ký quỹ trong RAM/ROM kèm theo để không thể khôi phục khóa đó bằng các cuộc tấn công ngoại tuyến. Nó phải lưu trữ khóa RoR theo cách khiến người trong cuộc hoặc kẻ tấn công không thể khôi phục được.
Ký quỹ RAM mặc định
AOSP triển khai RoR HAL bằng cách sử dụng tính bền vững của RAM. Để điều này hoạt động, các OEM phải đảm bảo rằng SoC của họ hỗ trợ tính bền bỉ của RAM trong các lần khởi động lại. Một số SoC không thể duy trì nội dung RAM trong quá trình khởi động lại, vì vậy các OEM nên tham khảo ý kiến đối tác SoC của họ trước khi bật HAL mặc định này. Tài liệu tham khảo kinh điển cho điều này trong phần sau.
Quy trình cập nhật OTA bằng RoR
Ứng dụng khách OTA trên điện thoại phải có quyền Manifest.permission.REBOOT và Manifest.permission.RECOVERY
để gọi các phương thức cần thiết để triển khai RoR. Với điều kiện tiên quyết đó, quy trình cập nhật sẽ tuân theo các bước sau:
- Ứng dụng khách OTA tải xuống bản cập nhật.
- Ứng dụng khách OTA gọi đến
RecoverySystem#prepareForUnattendedUpdate
để kích hoạt người dùng được nhắc nhập mã PIN, hình mở khóa hoặc mật khẩu của họ trên màn hình khóa trong lần mở khóa tiếp theo. - Người dùng mở khóa thiết bị ở màn hình khóa và thiết bị đã sẵn sàng để áp dụng bản cập nhật.
- Ứng dụng khách OTA gọi đến
RecoverySystem#rebootAndApply
, ứng dụng này ngay lập tức kích hoạt khởi động lại.
Khi kết thúc quy trình này, thiết bị sẽ khởi động lại và cơ chế RoR sẽ mở khóa bộ nhớ mã hóa thông tin xác thực (CE). Đối với các ứng dụng, điều này xuất hiện dưới dạng mở khóa của người dùng bình thường, vì vậy, chúng nhận được tất cả các tín hiệu, chẳng hạn như ACTION_LOCKED_BOOT_COMPLETED và ACTION_BOOT_COMPLETED mà chúng thường làm.
Sửa đổi cấu hình sản phẩm
Một sản phẩm được đánh dấu là hỗ trợ tính năng RoR trong Android 11 phải bao gồm việc triển khai RebootEscrow HAL và bao gồm tệp XML đánh dấu tính năng. Việc triển khai mặc định hoạt động tốt trên các thiết bị sử dụng khởi động lại ấm (khi nguồn DRAM vẫn bật trong khi khởi động lại).
Khởi động lại điểm đánh dấu tính năng ký quỹ
Điểm đánh dấu tính năng cũng phải có mặt:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml
Thực hiện HAL ký quỹ khởi động lại mặc định
Để sử dụng triển khai mặc định, bạn phải dự trữ 65536 (0x10000) byte. Không bao giờ ghi các byte này vào bộ lưu trữ cố định để đảm bảo rằng các thuộc tính bảo mật vẫn tồn tại.
Thay đổi cây thiết bị nhân Linux
Trong cây thiết bị của nhân Linux, bạn phải dự trữ bộ nhớ cho vùng pmem
. Ví dụ sau đây cho thấy 0x50000000
được đặt trước:
reserved-memory {
my_reservation@0x50000000 {
no-map;
reg = <0x50000000 0x10000>;
}
}
reboot_escrow@0 {
compatible = "pmem-region";
reg = <0x50000000 0x10000>;
};
Xác minh rằng bạn có một thiết bị mới trong thư mục khối có tên như /dev/block/pmem0
(chẳng hạn như pmem1
hoặc pmem2
).
Device.mk thay đổi
Giả sử rằng thiết bị mới của bạn từ bước trước đó được đặt tên là pmem0
, bạn phải đảm bảo các mục nhập mới sau được thêm vào vendor/<oem>/<product>/device.mk
:
# Resume on Reboot support
PRODUCT_PROPERTY_OVERRIDES += \
ro.rebootescrow.device=/dev/block/pmem0
PRODUCT_PACKAGES += \
android.hardware.rebootescrow-service.default
Quy tắc SELinux
Thêm các mục mới này vào file_contexts
của thiết bị:
/dev/block/pmem0 u:object_r:rebootescrow_device:s0
/vendor/bin/hw/android\.hardware\.rebootescrow-service\.default u:object_r:hal_rebootescrow_default_exec:s0