ใน Android 11 คุณสามารถใช้การอัปเดต OTA โดยใช้กลไกการอัปเดต A/B หรือการอัปเดต A/B เสมือนจริงร่วมกับเมธอดของคลาส RecoverySystem หลังจากอุปกรณ์รีบูตเพื่อใช้การอัปเดต OTA แล้ว ฟีเจอร์กลับมาทำงานต่อเมื่อรีบูต (RoR) จะปลดล็อกพื้นที่เก็บข้อมูลที่มีการเข้ารหัสข้อมูลเข้าสู่ระบบ (CE) ของอุปกรณ์
แม้ว่าพาร์ทเนอร์จะจับคู่กระบวนการนี้กับฟีเจอร์ระบบ OTA ที่ใช้การอัปเดตเมื่อคาดว่าอุปกรณ์จะไม่ได้ใช้งานใน Android 11 ได้ แต่พาร์ทเนอร์ไม่จำเป็นต้องใช้ฟีเจอร์ระบบ OTA เพิ่มเติมใน Android 12 กระบวนการ RoR ช่วยเพิ่มความปลอดภัยและความสะดวกสบายให้แก่ผู้ใช้ เนื่องจากสามารถอัปเดตได้ในช่วงที่อุปกรณ์ไม่มีการใช้งาน ในขณะที่ฟังก์ชันการอัปเดตผ่านหลายไคลเอ็นต์และเซิร์ฟเวอร์ของ Android 12 ร่วมกันจะช่วยรักษาความปลอดภัยในระดับฮาร์ดแวร์อุปกรณ์
แม้ว่าจะต้องให้สิทธิ์อุปกรณ์สำหรับandroid.hardware.reboot_escrow
ฟีเจอร์เพื่อรองรับ RoR ใน Android 11 แต่คุณไม่จำเป็นต้องดำเนินการนี้เพื่อเปิดใช้ RoR ที่อิงตามเซิร์ฟเวอร์ใน Android 12 ขึ้นไป เนื่องจากไม่ใช้ HAL
ฉากหลัง
เริ่มตั้งแต่ Android 7 เป็นต้นไป ระบบการเปิดเครื่องโดยตรงจะรองรับ Android ซึ่งทำให้แอปในอุปกรณ์เริ่มทำงานได้ก่อนที่ผู้ใช้จะปลดล็อกพื้นที่เก็บข้อมูล CE การใช้การรองรับ Direct Boot ช่วยให้ผู้ใช้ได้รับประสบการณ์ที่ดียิ่งขึ้นก่อนจะต้องป้อนปัจจัยที่เกี่ยวข้องกับหน้าจอล็อก (LSKF) หลังจากการเปิดเครื่อง
RoR ช่วยให้สามารถปลดล็อกพื้นที่เก็บข้อมูล CE ของแอปทั้งหมดในอุปกรณ์ได้ ซึ่งรวมถึงแอปที่ไม่รองรับการบูตโดยตรง เมื่อเริ่มการรีบูตหลังจากการอัปเดต OTA ฟีเจอร์นี้ช่วยให้ผู้ใช้ได้รับการแจ้งเตือนจากแอปที่ติดตั้งไว้ทั้งหมดหลังจากรีบูต
รูปแบบภัยคุกคาม
การนำ RoR มาใช้ต้องตรวจสอบให้แน่ใจว่าเมื่ออุปกรณ์ตกอยู่ในมือของผู้โจมตี ผู้โจมตีจะกู้คืนข้อมูลที่เข้ารหัส CE ของผู้ใช้ได้ยากมาก แม้ว่าอุปกรณ์จะเปิดอยู่ มีการปลดล็อกพื้นที่เก็บข้อมูล CE และผู้ใช้ปลดล็อกอุปกรณ์หลังจากได้รับการอัปเดต OTA ก็ตาม การต่อต้านการโจมตีจากบุคคลภายในต้องมีประสิทธิภาพแม้ว่าผู้โจมตีจะได้รับสิทธิ์เข้าถึงคีย์การรับรองการเข้ารหัสแบบออกอากาศก็ตาม
กล่าวโดยละเอียดคือ ผู้โจมตีที่มีอุปกรณ์อยู่จริงต้องไม่อ่านพื้นที่เก็บข้อมูล CE และสามารถดำเนินการต่อไปนี้ได้
ความสามารถ
- ใช้คีย์การรับรองของผู้ให้บริการหรือบริษัทใดก็ได้เพื่อลงนามในข้อความที่กำหนดเอง
- ทำให้อุปกรณ์ได้รับการอัปเดต OTA ได้
- แก้ไขการทํางานของฮาร์ดแวร์ได้ (เช่น โปรเซสเซอร์แอปพลิเคชัน หรือหน่วยความจําแฟลช) ยกเว้นตามที่ระบุไว้ในข้อจํากัดด้านล่าง (อย่างไรก็ตาม การแก้ไขดังกล่าวจะมีความล่าช้าอย่างน้อย 1 ชั่วโมงและต้องมีการเปิด/ปิดเครื่องซึ่งจะทำลายเนื้อหาใน RAM)
ข้อจำกัด
- แก้ไขการทำงานของฮาร์ดแวร์ป้องกันการงัดแงะไม่ได้ (เช่น Titan M)
- อ่าน RAM ของอุปกรณ์ที่กำลังดำเนินอยู่ไม่ได้
- ไม่สามารถคาดเดาข้อมูลเข้าสู่ระบบของผู้ใช้ (PIN, รูปแบบ, รหัสผ่าน) หรือทำให้ผู้ใช้ต้องป้อนข้อมูลเหล่านั้น
โซลูชัน
ระบบอัปเดต RoR ของ Android 12 จะช่วยรักษาความปลอดภัยจากผู้โจมตีที่มีความซับซ้อนสูง และในขณะเดียวกันก็ไม่มีการส่งหรือจัดเก็บรหัสผ่านในอุปกรณ์และ PIN ไว้ในอุปกรณ์ด้วย นี่คือภาพรวมของกระบวนการเพื่อตรวจสอบว่าระดับความปลอดภัยที่ระบุคล้ายกับระบบ RoR ระดับอุปกรณ์ที่อิงตามฮาร์ดแวร์
- Android จะใช้การป้องกันด้วยการเข้ารหัสกับข้อมูลที่จัดเก็บไว้ในอุปกรณ์
- ข้อมูลทั้งหมดจะได้รับการปกป้องโดยคีย์ที่จัดเก็บไว้ในสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE)
- TEE จะปล่อยคีย์ก็ต่อเมื่อระบบปฏิบัติการที่ทำงานอยู่ผ่านการตรวจสอบสิทธิ์การเข้ารหัส (การเปิดเครื่องที่ได้รับการยืนยัน)
- บริการ RoR ที่ทำงานบนเซิร์ฟเวอร์ของ Google จะรักษาความปลอดภัยให้กับข้อมูล CE ด้วยการจัดเก็บข้อมูลลับที่สามารถเรียกดูได้เป็นระยะเวลาที่จำกัดเท่านั้น ซึ่งใช้ได้กับระบบนิเวศของ Android
- ระบบจะใช้คีย์การเข้ารหัสที่ป้องกันด้วย PIN ของผู้ใช้เพื่อปลดล็อกอุปกรณ์และถอดรหัสพื้นที่เก็บข้อมูล CE
- เมื่อกำหนดเวลารีบูตแบบข้ามคืน Android จะแจ้งให้ผู้ใช้ป้อน PIN จากนั้นคำนวณรหัสผ่านสังเคราะห์ (SP)
- จากนั้นจะเข้ารหัส SP 2 ครั้ง โดยการเข้ารหัสครั้งแรกจะใช้คีย์
K_s
ที่เก็บไว้ใน RAM และการเข้ารหัสครั้งที่ 2 จะใช้คีย์K_k
ที่เก็บไว้ใน TEE - ระบบจะจัดเก็บ SP ที่เข้ารหัส 2 ชั้นไว้ในดิสก์ และลบ SP ออกจาก RAM ทั้ง 2 คีย์เป็นคีย์ที่สร้างขึ้นใหม่และใช้สำหรับรีบูตเพียงครั้งเดียวเท่านั้น
- เมื่อถึงเวลารีบูต Android จะไว้วางใจ
K_s
ในเซิร์ฟเวอร์ ระบบจะเข้ารหัสใบเสร็จที่มีK_k
ก่อนที่จะจัดเก็บไว้ในดิสก์ - หลังจากรีบูต Android จะใช้
K_k
ในการถอดรหัสใบเสร็จ แล้วส่งไปยังเซิร์ฟเวอร์เพื่อเรียกข้อมูลK_s
K_k
และK_s
ใช้ในการถอดรหัส SP ที่จัดเก็บในดิสก์- Android ใช้ SP เพื่อปลดล็อกพื้นที่เก็บข้อมูล CE และอนุญาตให้เริ่มต้นแอปตามปกติ
- ทิ้ง
K_k
และK_s
แล้ว
การอัปเดตที่ทำให้โทรศัพท์ปลอดภัยสามารถเกิดขึ้นในช่วงเวลาที่สะดวกสำหรับคุณ นั่นก็คือในขณะที่คุณนอนหลับ
การเล่น PIN ของซิมซ้ำ
ภายใต้เงื่อนไขบางประการ รหัส PIN ของซิมการ์ดจะได้รับการยืนยันจากแคช ซึ่งเป็นกระบวนการที่เรียกว่าการเล่นซ้ำของซิม PIN
ซิมการ์ดที่มี PIN เปิดใช้อยู่จะต้องผ่านการตรวจสอบรหัส PIN อย่างราบรื่น (การเล่นซ้ำ PIN ของซิม) หลังจากการรีบูตแบบไม่มีผู้ดูแลเพื่อกู้คืนการเชื่อมต่อมือถือ (จำเป็นสำหรับการโทร ข้อความ SMS และบริการข้อมูล) ระบบจะจัดเก็บ PIN ของซิมการ์ดและข้อมูลซิมการ์ดที่ตรงกัน (ICCID และหมายเลขช่อง SIM) ไว้ด้วยกันอย่างปลอดภัย จะเรียกคืนและใช้ PIN ที่จัดเก็บไว้ได้ ต่อเมื่อการรีบูตโดยไม่ต้องมีการดูแลสำเร็จเท่านั้น หากอุปกรณ์มีการรักษาความปลอดภัย PIN ของซิมจะจัดเก็บไว้พร้อมกับคีย์ที่ได้รับการปกป้องโดย LSKF หากซิมเปิดใช้ PIN อยู่ การโต้ตอบกับเซิร์ฟเวอร์ RoR ต้องมีการเชื่อมต่อ Wi-Fi สำหรับการอัปเดต OTA และ RoR ของเซิร์ฟเวอร์ ซึ่งจะช่วยให้มั่นใจได้ถึงฟังก์ชันการทำงานพื้นฐาน (ด้วยการเชื่อมต่อเครือข่ายมือถือ) หลังจากรีบูต
ระบบจะเข้ารหัส PIN ของซิมอีกครั้งและจัดเก็บทุกครั้งที่ผู้ใช้เปิดใช้ ยืนยัน หรือแก้ไข PIN สำเร็จ ระบบจะทิ้ง PIN ของซิมหากเกิดเหตุการณ์อย่างใดอย่างหนึ่งต่อไปนี้
- มีการนำซิมออกหรือรีเซ็ต
- ผู้ใช้ปิดใช้ PIN
- มีการรีบูตที่ไม่ได้เริ่มต้น RoR
PIN ของซิมที่จัดเก็บไว้จะใช้ได้ครั้งเดียวหลังจากการรีบูตโดยเริ่มต้นจาก RoR เท่านั้น และจะใช้ได้เป็นระยะเวลาสั้นมาก (20 วินาที) เท่านั้น หากรายละเอียดการจับคู่ซิมการ์ด PIN ของซิมที่จัดเก็บไว้จะไม่ออกจากแอป TelephonyManager และโมดูลภายนอกจะเรียกดูไม่ได้
หลักเกณฑ์การใช้งาน
ใน Android 12 ฟังก์ชัน RoR แบบหลายไคลเอ็นต์และแบบเซิร์ฟเวอร์จะช่วยลดภาระให้กับพาร์ทเนอร์เมื่อมีการพุชการอัปเดต OTA การอัปเดตที่จำเป็นอาจเกิดขึ้นในช่วงที่อุปกรณ์หยุดทำงานชั่วคราวในช่วงเวลาที่สะดวก เช่น ในช่วงที่กําหนดไว้สำหรับการนอนหลับ
เพื่อให้มั่นใจว่าการอัปเดต OTA ในช่วงเวลาดังกล่าวจะไม่รบกวนผู้ใช้ ให้ใช้โหมดมืดเพื่อลดการปล่อยก๊าซของแสง โดยให้ Bootloader ของอุปกรณ์ค้นหาสตริงเหตุผล unattended
หาก unattended
เป็น true
ให้ตั้งค่าอุปกรณ์เป็นโหมดมืด โปรดทราบว่า OEM แต่ละรายมีหน้าที่รับผิดชอบในการลดการปล่อยก๊าซเสียงและแสง
หากอัปเกรดเป็น Android 12 หรือเปิดใช้อุปกรณ์ Android 12 คุณไม่จำเป็นต้องดำเนินการใดๆ เพื่อใช้ฟังก์ชัน RoR ใหม่
มีการเรียกใช้ใหม่ 1 รายการในขั้นตอนสำหรับลูกค้าหลายราย isPreparedForUnattendedUpdate
ดังที่แสดงด้านล่าง
@RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
android.Manifest.permission.REBOOT})
public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)
คุณไม่จำเป็นต้องติดตั้งใช้งาน เนื่องจาก HAL เลิกใช้งานไปแล้วตั้งแต่ Android 12
TelephonyManager
ไคลเอ็นต์ OTA จะเรียกใช้ API ระบบ TelephonyManager
เมื่อ Android 12 กำลังจะรีบูต API นี้จะย้ายรหัส PIN ที่แคชไว้ทั้งหมดจากสถานะ AVAILABLE
ไปยังสถานะ REBOOT_READY
API ของระบบ TelephonyManager
ได้รับการปกป้องโดยสิทธิ์ Manifest ของ REBOOT
ที่มีอยู่
/**
* 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()
APK ที่ได้รับสิทธิ์จะใช้ TelephonyManager System API
การทดสอบ
หากต้องการทดสอบ API ใหม่ ให้ใช้คําสั่งนี้
adb shell cmd phone unattended-reboot
คำสั่งนี้จะใช้งานได้เมื่อเชลล์ทำงานเป็นรูท (adb root
) เท่านั้น
Android 11 เท่านั้น
ส่วนที่เหลือของหน้านี้ใช้กับ Android 11
การใช้งาน RoR HAL ในเดือนกรกฎาคม 2020 แบ่งออกเป็น 2 หมวดหมู่ดังนี้
- หากฮาร์ดแวร์ SoC รองรับการคงข้อมูล RAM ไว้ระหว่างการรีบูต OEM จะใช้การใช้งานเริ่มต้นใน AOSP (Default RAM Escrow) ได้
- หากฮาร์ดแวร์หรือ SoC ของอุปกรณ์รองรับ Enclave ฮาร์ดแวร์ที่ปลอดภัย (ตัวประมวลผลร่วมด้านความปลอดภัยแบบแยกต่างหากที่มี RAM และ ROM ของตัวเอง) อุปกรณ์จะต้องดำเนินการต่อไปนี้ด้วย
- ตรวจหาการรีบูต CPU หลักได้
- มีแหล่งที่มาของตัวจับเวลาฮาร์ดแวร์ที่ยังคงอยู่หลังจากการรีบูต กล่าวคือ Enclave ต้องตรวจพบการรีบูตและทำให้ตัวจับเวลาที่ตั้งไว้ก่อนการรีบูตหมดอายุ
- รองรับการจัดเก็บคีย์ที่ฝากไว้ใน Enclave RAM/ROM เพื่อไม่ให้กู้คืนได้จากการโจมตีแบบออฟไลน์ โดยต้องจัดเก็บคีย์ RoR ในลักษณะที่ทําให้ผู้ที่อยู่ภายในหรือผู้โจมตีไม่สามารถกู้คืนได้
วงเงินประกัน RAM เริ่มต้น
AOSP มีการใช้งาน RoR HAL โดยใช้การคงข้อมูลใน RAM เพื่อให้ใช้งานได้ OEM ต้องตรวจสอบว่า SoC ของตนรองรับความต่อเนื่องของ RAM ในระหว่างการรีบูต SoC บางรุ่นไม่สามารถเก็บเนื้อหา RAM ไว้ได้เมื่อรีบูต ดังนั้น OEM จึงควรปรึกษาพาร์ทเนอร์ SoC ก่อนเปิดใช้ HAL เริ่มต้นนี้ ข้อมูลอ้างอิงตามหลักเกณฑ์สําหรับเรื่องนี้อยู่ในส่วนต่อไปนี้
ขั้นตอนการอัปเดต OTA โดยใช้ RoR
แอปไคลเอ็นต์ OTA ในโทรศัพท์ต้องมีสิทธิ์ Manifest.permission.REBOOT และ Manifest.permission.RECOVERY
เพื่อเรียกวิธีการที่จําเป็นในการใช้งาน RoR เมื่อมีคุณสมบัติตามข้อกําหนดเบื้องต้นแล้ว ขั้นตอนอัปเดตจะเป็นไปตามขั้นตอนต่อไปนี้
- แอปไคลเอ็นต์ OTA จะดาวน์โหลดอัปเดต
- แอปไคลเอ็นต์ OTA จะโทรหา
RecoverySystem#prepareForUnattendedUpdate
ซึ่งจะทริกเกอร์ให้ผู้ใช้ได้รับ PIN, รูปแบบ หรือรหัสผ่านบนหน้าจอล็อกระหว่างการปลดล็อกครั้งถัดไป - ผู้ใช้ปลดล็อกอุปกรณ์ที่หน้าจอล็อก และอุปกรณ์ก็พร้อมที่จะใช้การอัปเดต
- แอปไคลเอ็นต์ OTA โทรหา
RecoverySystem#rebootAndApply
ซึ่งจะทริกเกอร์การรีบูตทันที
เมื่อสิ้นสุดขั้นตอนนี้ อุปกรณ์จะรีบูตและกลไก RoR จะปลดล็อกที่เก็บข้อมูลที่เข้ารหัสข้อมูลเข้าสู่ระบบ (CE) สำหรับแอป ส่วนนี้จะปรากฏเหมือนกับการปลดล็อกของผู้ใช้ตามปกติ แอปจึงได้รับสัญญาณทั้งหมด เช่น ACTION_LOCKED_BOOT_COMPLETED และ ACTION_BOOT_COMPLETED ตามปกติ
แก้ไขการกำหนดค่าผลิตภัณฑ์
ผลิตภัณฑ์ที่ทําเครื่องหมายว่ารองรับฟีเจอร์ RoR ใน Android 11 ต้องติดตั้งใช้งาน ทั้งหมดที่มี การสร้างแคมเปญ ทั้งหมดที่มีการเปิด Chromebook ใหม่ และมีไฟล์ XML ของตัวทำเครื่องหมายฟีเจอร์รวมอยู่ด้วย การใช้งานเริ่มต้นจะทำงานได้ดีในอุปกรณ์ที่ใช้การรีบูตแบบ Warm (เมื่อการเปิด/ปิดแหล่งจ่ายไฟไปยัง DRAM ยังคงเปิดอยู่ในระหว่างการรีบูต)
รีบูตเครื่องหมายฟีเจอร์การระงับ
นอกจากนี้จะต้องมีเครื่องหมายแสดงองค์ประกอบด้วย:
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.reboot_escrow.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.reboot_escrow.xml
การใช้งาน HAL การรีบูตเริ่มต้น
หากต้องการใช้การใช้งานเริ่มต้น คุณต้องจอง 65536 (0x10000) ไบต์ อย่าเขียนไบต์เหล่านี้ลงในพื้นที่เก็บข้อมูลที่ไม่ผันผวนเพื่อให้มั่นใจว่าคุณสมบัติการรักษาความปลอดภัยจะยังคงอยู่
การเปลี่ยนแปลงแผนผังอุปกรณ์เคอร์เนล Linux
ใน Device Tree ของเคอร์เนล Linux คุณต้องจองหน่วยความจำสำหรับภูมิภาค pmem
ตัวอย่างต่อไปนี้แสดงการจอง 0x50000000
reserved-memory {
my_reservation@0x50000000 {
no-map;
reg = <0x50000000 0x10000>;
}
}
reboot_escrow@0 {
compatible = "pmem-region";
reg = <0x50000000 0x10000>;
};
ยืนยันว่าคุณมีอุปกรณ์ใหม่ในไดเรกทอรีบล็อกที่มีชื่อเหมือน /dev/block/pmem0
(เช่น pmem1
หรือ pmem2
)
การเปลี่ยนแปลง Device.mk
สมมติว่าอุปกรณ์ใหม่จากขั้นตอนก่อนหน้ามีชื่อว่า pmem0
คุณต้องตรวจสอบว่าได้เพิ่มรายการใหม่ต่อไปนี้ไปยัง 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
กฎ SELinux
เพิ่มรายการใหม่เหล่านี้ใน file_contexts
ของอุปกรณ์:
/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