Android 13 รองรับ APK Signature Scheme v3.1 ซึ่งเป็นการปรับปรุง APK Signature Scheme v3 ที่มีอยู่ Scheme v3.1 แก้ไขปัญหาที่ทราบบางอย่างเกี่ยวกับ APK Signature Scheme v3 ที่เกี่ยวข้องกับการหมุนเวียน โดยเฉพาะอย่างยิ่ง รูปแบบลายเซ็น v3.1 รองรับการกำหนดเป้าหมาย SDK เวอร์ชัน ซึ่งช่วยให้หมุนเวียนเพื่อ กำหนดเป้าหมายแพลตฟอร์มเวอร์ชันที่เผยแพร่ในภายหลังได้
รูปแบบลายเซ็น v3.1 ใช้รหัสบล็อกที่ Android 12 หรือต่ำกว่าไม่รู้จัก ดังนั้น แพลตฟอร์มจึงใช้ลักษณะการทำงานของโปรแกรมลงนามต่อไปนี้
- อุปกรณ์ที่ใช้ Android 13 ขึ้นไปจะใช้โปรแกรมลงนามที่หมุนเวียนในบล็อก v3.1
- อุปกรณ์ที่ใช้ Android เวอร์ชันเก่าจะเพิกเฉยต่อผู้ลงนามที่หมุนเวียนและ ใช้ผู้ลงนามเดิมในบล็อก v3 แทน
แอปที่ยังไม่ได้หมุนเวียนคีย์ Signing ไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม เมื่อใดก็ตามที่แอปเหล่านี้เลือกที่จะหมุนเวียน ระบบจะใช้รูปแบบลายเซ็น v3.1 โดยค่าเริ่มต้น
บล็อกการลงนาม v3.1
บล็อกการลงนาม v3.1 มีเนื้อหาเหมือนกับบล็อกการลงนาม v3 แต่ด้วยรหัสบล็อกใหม่ ระบบจะจดจำลายเซ็นเหล่านี้ได้เฉพาะในอุปกรณ์ที่ใช้ Android 13 ขึ้นไป ซึ่งจะช่วยให้แอปหมุนเวียนคีย์การลงชื่อได้อย่างปลอดภัยโดยไม่ต้องกังวลเกี่ยวกับ APK แบบหลายเป้าหมาย เนื่องจากสามารถใช้ผู้ลงนามเดิมเพื่อลงนาม APK ในบล็อกการลงนาม v3 และผู้ลงนามที่หมุนเวียนในบล็อกการลงนาม v3.1 ได้ นอกจากนี้ยังช่วยให้ แพลตฟอร์มสามารถนำรหัสยืนยันที่มีอยู่ทั้งหมดมาใช้ซ้ำสำหรับบล็อกการลงนาม v3 เมื่อยืนยันลายเซ็น v3.1
โดยค่าเริ่มต้น apksig จะใช้บล็อกการลงนาม v3.1 ทุกครั้งที่มีการระบุคีย์ที่หมุนเวียนและลำดับการสืบทอดในการกำหนดค่าการลงนาม หาก minSdkVersion ของแอปต่ำกว่า
Android 12 และมีการใช้คีย์ที่หมุนเวียน คุณต้อง
ระบุคีย์การลงนามเดิมด้วยเพื่อให้ใช้ลงนาม APK ในบล็อกการลงนาม v3 ได้ ซึ่งคล้ายกับการทำงานในปัจจุบันที่ต้องใช้ผู้ลงนามเดิมหาก APK กำหนดเป้าหมายเป็นเวอร์ชันที่เก่ากว่า Android 9
เพื่อรองรับการหมุนเวียนคีย์ที่กำหนดเป้าหมายโดยเริ่มจาก SDK เวอร์ชันหนึ่งๆ
ไลบรารี apksig จะแสดง API ใหม่ที่อนุญาต
ให้ตั้งค่า SDK เวอร์ชันขั้นต่ำสำหรับการหมุนเวียน หากมีการระบุ SDK เวอร์ชันที่ต่ำกว่า
Android 12 เป็นเวอร์ชันขั้นต่ำสำหรับการรองรับการหมุนเวียน ระบบจะใช้
บล็อก v3 เดิม บล็อกการลงนาม v3.1 จะใช้เฉพาะในกรณีที่มีการหมุน โดยตั้งค่า SDK เวอร์ชันขั้นต่ำสำหรับการหมุนเป็น Android 12 ขึ้นไป บล็อกการลงนาม v3 มีแอตทริบิวต์สำหรับการหมุนเวียน
การป้องกันการลบ SDK เวอร์ชันขั้นต่ำ
| APK มีแหล่งที่มา | ค่าของ rotation-min-sdk-version | บล็อกการลงนาม v3 | บล็อกการลงนาม v3.1 |
|---|---|---|---|
| ไม่ | ค่าเริ่มต้นหรือค่าใดก็ได้ (แสดงด้วย x ด้านล่าง) | ลงนามโดยผู้ลงนามเดิม โดยกำหนดเป้าหมายเป็น Android 9 ขึ้นไป | ไม่มี |
| ใช่ | ค่าเริ่มต้น | ลงนามด้วยผู้ลงนามเดิม โดยกำหนดเป้าหมายเป็น Android 9 ถึง 12L | ลงนามด้วยโปรแกรมลงนามที่หมุนเวียน โดยกำหนดเป้าหมายเป็น Android 12 ขึ้นไป |
| ใช่ | x < 33 (Android 13) | ลงนามด้วยโปรแกรมลงนามที่หมุนเวียน โดยกำหนดเป้าหมายเป็น Android 9 ขึ้นไป | ไม่มี |
| ใช่ | x >= 33 (Android 13) | ลงนามด้วยผู้ลงนามเดิม โดยกำหนดเป้าหมายเป็น Android 9 - (x-1) | ลงนามด้วยผู้ลงนามที่หมุนแล้ว โดยกำหนดเป้าหมายเป็น x+ |
ปัญหาเกี่ยวกับการหมุน
ปัญหาเกี่ยวกับการหมุนต่อไปนี้ได้รับการแก้ไขแล้วใน แพลตฟอร์ม
การแก้ไขใน Android 12
- แพลตฟอร์มจะให้สิทธิ์ลายเซ็นแก่แอปที่ขอเฉพาะในกรณีที่ ผู้ลงนามปัจจุบันของแอปใดแอปหนึ่งอยู่ในลำดับการลงนาม หรือเป็นผู้ลงนามปัจจุบัน ของอีกแอปหนึ่ง ซึ่งจะป้องกันไม่ให้สิทธิ์ลายเซ็นแก่แอปที่ขอ หากทั้ง 2 แอปปฏิบัติตามแนวทางปฏิบัติแนะนำเกี่ยวกับคีย์การลงนามและหมุนเวียนไปใช้คีย์การลงนามอื่น
- ฟีเจอร์การย้อนกลับ APK ของแพลตฟอร์มไม่สามารถย้อนกลับ APK ที่เพิ่งหมุนเวียนคีย์ Signing ได้ เว้นแต่คีย์ก่อนหน้าในลำดับการ Signing จะมีความสามารถในการย้อนกลับ แต่ความสามารถนี้จะขัดต่อวัตถุประสงค์ของการหมุนเวียนเนื่องจากอนุญาตให้อัปเดตแพ็กเกจใหม่โดยใช้คีย์ Signing ก่อนหน้าและย้อนกลับคีย์ที่หมุนเวียน
- APK ที่รับรองด้วยคีย์ที่หมุนเวียนแล้วเท่านั้นและอัปเดตในภายหลังด้วย APK ที่รับรอง ด้วยคีย์เดิมและคีย์ที่หมุนเวียนแล้วในลำดับการเปลี่ยนแปลงจะแสดงเฉพาะ คีย์ที่หมุนเวียนแล้วในลำดับการเปลี่ยนแปลงในอุปกรณ์ที่ใช้ Android 11 และเวอร์ชันก่อนหน้า
การแก้ไขใน Android 11
PackageManager#checkSignaturesไม่ได้รับการอัปเดตอย่างถูกต้องเพื่อตรวจสอบ คีย์การลงนามเดิมของ 2 แพ็กเกจ ซึ่งทำให้การตรวจสอบแอปที่ใช้คีย์การลงนามที่หมุนเวียนไม่ทำงาน โดย APK การตรวจสอบใช้คีย์การลงนามเดิม- แพ็กเกจใน
sharedUserIdจะแชร์ลำดับการลงนาม เมื่อใดก็ตามที่มีการติดตั้งหรืออัปเดตแอปที่มีลำดับการลงนามที่อัปเดตแล้วในsharedUiserIdลำดับของแอปนั้นจะแทนที่ลำดับที่แชร์ สำหรับsharedUserId(กล่าวคือ หากลำดับการลงนามของแอปคือ A -> B และมีการอัปเดตแอปในsharedUserIdที่มีลำดับ B -> C ลำดับของsharedUserIdจะถูกแทนที่ด้วย B -> C) ในทำนองเดียวกัน ความสามารถของผู้ลงนามก่อนหน้าใน ลำดับชั้นก็อัปเดตไม่ได้ เว้นแต่จะมีการเปลี่ยนแปลงลำดับชั้นการลงนาม
การผสานรวม v4
รูปแบบการรับรอง v4 ใช้การกำหนดค่าการรับรองที่ระบุไว้ใน apksigner ในกรณีที่มีการกำหนดค่าการรับรองหลายรายการสำหรับการหมุนเวียน ระบบจะใช้การกำหนดค่าการรับรองที่หมุนเวียนล่าสุด ก่อนที่จะเปิดตัว v3.1 นั้น v3 มีเพียงการกำหนดค่าการลงนามที่หมุนเวียนล่าสุดนี้ ดังนั้น v4 จึงใช้การกำหนดค่านี้ได้ตามเดิม ด้วยเหตุนี้ Signature Scheme v4 จึงรองรับการหมุนเวียนได้เนื่องจากใช้คีย์การลงนามที่หมุนเวียนใน SigningInfo แม้ว่า SigningInfo v4 จะไม่ มีลำดับการลงนามทั้งหมด แต่ก็สามารถดึงข้อมูลนี้จากบล็อกการลงนาม v3 เพื่อให้แพลตฟอร์มเข้าถึงลำดับการลงนามสำหรับการค้นหาลายเซ็นได้ เมื่อใช้ v3.1 เพื่อกำหนดเป้าหมายการหมุนสำหรับ rotation-min-sdk-version ที่ระบุ การกำหนดค่า v3 ทั่วไปจะรวมทั้งการกำหนดค่าการลงนามเดิม และการกำหนดค่าการลงนามที่หมุนล่าสุด เราได้สร้างส่วนขยายของรูปแบบลายเซ็น v4 ซึ่งมีบล็อกข้อมูลการลงนามเพิ่มเติมสำหรับแต่ละการกำหนดค่าการลงนามจากบล็อก v3.1
การตรวจสอบ
หากต้องการทดสอบการใช้งาน v3.1 ให้เรียกใช้
PkgInstallSignatureVerificationTest.javaการทดสอบ CTS ใน
cts/hostsidetests/appsecurity/src/android/appsecurity/cts/
ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบได้ที่ส่วนการยืนยันใน v3