โครงการลายเซ็น APK v3.1

ภาพรวม

Android 13 รองรับ APK Signature Scheme v3.1 ซึ่งเป็นการปรับปรุง APK Signature Scheme v3 ที่มีอยู่ รูปแบบ v3.1 แก้ไขปัญหาที่ทราบบางประการเกี่ยวกับ APK Signature Scheme v3 เกี่ยวกับการหมุนเวียน โดยเฉพาะอย่างยิ่ง รูปแบบลายเซ็น v3.1 รองรับการกำหนดเป้าหมายเวอร์ชัน SDK ซึ่งช่วยให้สามารถหมุนเวียนเพื่อกำหนดเป้าหมายแพลตฟอร์มที่ออกในภายหลังได้

รูปแบบลายเซ็น v3.1 ใช้รหัสบล็อกที่ไม่รู้จักใน Android 12 หรือต่ำกว่า ดังนั้น แพลตฟอร์มจะใช้พฤติกรรมของผู้ลงนามดังต่อไปนี้:

  • อุปกรณ์ที่ใช้ Android 13 ขึ้นไปจะใช้ผู้ลงนามแบบหมุนเวียนในบล็อก v3.1
  • อุปกรณ์ที่ใช้ Android เวอร์ชันเก่าจะไม่สนใจผู้ลงนามที่ถูกหมุนเวียน และใช้ผู้ลงนามดั้งเดิมในบล็อก v3 แทน

แอปที่ยังไม่ได้หมุนเวียนคีย์การลงนามไม่จำเป็นต้องดำเนินการใดๆ เพิ่มเติม เมื่อใดก็ตามที่แอปเหล่านี้เลือกที่จะหมุนเวียน ระบบจะใช้รูปแบบลายเซ็นเวอร์ชัน 3.1 เป็นค่าเริ่มต้น

บล็อกการลงนาม v3.1

บล็อกการลงนาม v3.1 จะมีเนื้อหาเหมือนกับบล็อกการลงนาม v3 แต่ด้วยรหัสบล็อกใหม่ ลายเซ็นเหล่านี้จะได้รับการยอมรับในอุปกรณ์ที่ใช้ Android 13 และใหม่กว่าเท่านั้น ซึ่งช่วยให้แอปหมุนเวียนคีย์การลงนามได้อย่างปลอดภัยโดยไม่ต้องกังวลกับ APK หลายเป้าหมาย เนื่องจากผู้ลงนามดั้งเดิมสามารถใช้เพื่อลงนาม APK ในบล็อกการลงนาม v3 และผู้ลงนามที่หมุนเวียนในบล็อกการลงนาม v3.1 นอกจากนี้ยังช่วยให้แพลตฟอร์มนำรหัสยืนยันที่มีอยู่ทั้งหมดกลับมาใช้ใหม่สำหรับบล็อกการลงนาม v3 เมื่อตรวจสอบลายเซ็น v3.1

ตามค่าเริ่มต้น ไลบรารี apksig จะใช้บล็อกการเซ็นชื่อเวอร์ชัน 3.1 ทุกครั้งที่มีการระบุคีย์ที่หมุนเวียนและ Lineage ในการกำหนดค่าการเซ็นชื่อ หาก minSdkVersion ของแอปน้อยกว่า Android 13 และมีการใช้คีย์ที่หมุนเวียนอยู่ จะต้องระบุคีย์การลงนามดั้งเดิมด้วยเพื่อให้ใช้ในการลงนาม APK ในบล็อกการลงนาม v3 ซึ่งคล้ายกับพฤติกรรมปัจจุบันที่จำเป็นต้องมีผู้ลงนามดั้งเดิมหาก APK กำหนดเป้าหมายเป็นเวอร์ชันที่เก่ากว่า Android 9

เพื่อรองรับการหมุนเวียนคีย์การกำหนดเป้าหมายโดยเริ่มจากเวอร์ชัน SDK เฉพาะ ไลบรารี apksig จะแสดง API ใหม่ที่จะอนุญาตให้ตั้งค่าเวอร์ชัน SDK ขั้นต่ำสำหรับการหมุนเวียน หากระบุเวอร์ชัน SDK ที่น้อยกว่า Android 13 เป็นเวอร์ชันขั้นต่ำสำหรับการรองรับการหมุนเวียน ดังนั้น v3 ดั้งเดิม จะใช้บล็อค บล็อกการลงนามเวอร์ชัน 3.1 จะใช้เมื่อมีการหมุนเวียนเท่านั้น โดยที่เวอร์ชัน SDK ขั้นต่ำสำหรับการหมุนเวียนตั้งค่าเป็น Android 13 ขึ้นไป บล็อกการลงนาม v3 จะมีแอตทริบิวต์ใหม่สำหรับการป้องกันการแยกเวอร์ชัน SDK ขั้นต่ำของการหมุนเวียน

APK รวมถึงเชื้อสาย ค่าของการหมุน-นาที-sdk-เวอร์ชัน บล็อกการลงนาม v3 บล็อกการลงนาม v3.1
เลขที่ ค่าเริ่มต้นหรือค่าใดๆ (แสดงด้วย x ด้านล่าง) ลงนามกับผู้ลงนามดั้งเดิม โดยกำหนดเป้าหมายเป็น Android 9 ขึ้นไป ไม่อยู่
ใช่ ค่าเริ่มต้น ลงนามกับผู้ลงนามดั้งเดิม โดยกำหนดเป้าหมายเป็น Android 9 ถึง 12L ลงนามกับผู้ลงนามแบบหมุนเวียน โดยกำหนดเป้าหมายเป็น Android 13 ขึ้นไป
ใช่ x < 33 (แอนดรอยด์ 13) ลงนามกับผู้ลงนามแบบหมุนเวียน โดยกำหนดเป้าหมายเป็น Android 9 ขึ้นไป ไม่อยู่
ใช่ x >= 33 (แอนดรอยด์ 13) ลงนามกับผู้ลงนามดั้งเดิมโดยกำหนดเป้าหมายเป็น Android 9 - ( x -1) ลงนามโดยผู้ลงนามแบบหมุนเวียน โดยกำหนดเป้าหมาย x+

ปัญหาเกี่ยวกับการหมุนเวียน

ปัญหาเกี่ยวกับการหมุนเวียนต่อไปนี้ได้รับการแก้ไขแล้วในแพลตฟอร์ม:

การแก้ไข Android 12

  • แพลตฟอร์มจะให้สิทธิ์ในการลงนามแก่แอปที่ร้องขอก็ต่อเมื่อผู้ลงนามปัจจุบันของแอปใดแอปหนึ่งอยู่ในสายเลือดการลงนามหรือเป็นผู้ลงนามปัจจุบันของแอปอื่นเท่านั้น สิ่งนี้จะป้องกันการให้สิทธิ์ลายเซ็นแก่แอปที่ร้องขอ หากทั้งสองแอปปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดในการลงนามและหมุนเวียนไปยังคีย์การเซ็นชื่อที่แตกต่างกัน
  • คุณลักษณะการย้อนกลับ APK ของแพลตฟอร์มไม่สามารถย้อนกลับ APK ที่เพิ่งมีการหมุนเวียนคีย์การลงนาม เว้นแต่คีย์ก่อนหน้าในสายเลือดการลงนามมีความสามารถในการย้อนกลับ แต่ความสามารถนี้เอาชนะวัตถุประสงค์ของการหมุนเวียน เนื่องจากช่วยให้การอัปเดตแพ็กเกจใหม่ลงนามโดย คีย์การลงนามก่อนหน้าและการย้อนกลับคีย์ที่หมุน
  • APK ที่ลงนามด้วยคีย์ที่หมุนเท่านั้นและอัปเดตในภายหลังด้วย APK ที่ลงนามด้วยคีย์ดั้งเดิมและคีย์ที่หมุนใน Lineage จะแสดงเฉพาะคีย์ที่หมุนใน Lineage บนอุปกรณ์ที่ใช้ Android 11 และรุ่นก่อนหน้า

การแก้ไข Android 11

  • PackageManager#checkSignatures ไม่ได้รับการอัพเดตอย่างถูกต้องเพื่อตรวจสอบคีย์การลงนามดั้งเดิมของสองแพ็คเกจ การดำเนินการนี้ทำให้เครื่องมือสำหรับแอปที่ใช้คีย์การลงนามแบบหมุนเวียนกับ APK ของเครื่องมือที่ใช้คีย์การเซ็นชื่อดั้งเดิมเสียหาย
  • แพ็คเกจภายใต้ sharedUserId แบ่งปันเชื้อสายการลงนามของพวกเขา เมื่อใดก็ตามที่มีการติดตั้งหรืออัปเดตแอปที่มีสายการลงนามที่อัปเดตใน sharedUiserId สายเลือดของแอปนั้นจะแทนที่สายเลือดที่แชร์สำหรับ sharedUserId (นั่นคือ หากสายเลือดการลงนามของแอปเป็น A -> B และแอปได้รับการอัปเดตใน sharedUserId ด้วยเชื้อสาย B -> C จากนั้นเชื้อสาย sharedUserId จะถูกแทนที่ด้วย B -> C) ในทำนองเดียวกันความสามารถของผู้ลงนามคนก่อนในเชื้อสายไม่สามารถอัปเดตได้เว้นแต่ว่าเชื้อสายการลงนามจะมีการเปลี่ยนแปลง

บูรณาการ v4

รูปแบบลายเซ็น v4 ใช้การกำหนดค่าการลงนามที่มอบให้กับ apksigner ในกรณีที่มีการกำหนดค่าการลงนามหลายรายการสำหรับการหมุนเวียน ระบบจะใช้การกำหนดค่าการลงนามแบบหมุนเวียนล่าสุด ก่อนที่จะมีการเปิดตัวเวอร์ชัน 3.1 นั้น v3 จะรวมเฉพาะการกำหนดค่าการลงนามแบบหมุนเวียนล่าสุดเท่านั้น ดังนั้น v4 จึงสามารถใช้การกำหนดค่านี้ได้ตามที่เป็นอยู่ ด้วยเหตุนี้ รูปแบบลายเซ็น v4 จึงสามารถรองรับการหมุนเวียนได้เนื่องจากใช้คีย์การลงนามแบบหมุนใน SigningInfo แม้ว่า v4 SigningInfo จะไม่รวม Lineage การลงนามแบบเต็ม แต่ก็สามารถดึงสิ่งนี้จากบล็อกการลงนาม v3 เพื่อให้แพลตฟอร์มสามารถเข้าถึง Lineage สำหรับการสืบค้นลายเซ็นใดๆ เมื่อมีการใช้เวอร์ชัน 3.1 เพื่อกำหนดเป้าหมายการหมุนเวียนสำหรับ Rotation-min-sdk-version ที่ให้มา การกำหนดค่า v3 ทั่วไปจะรวมทั้งการกำหนดค่าการลงนามดั้งเดิมและการกำหนดค่าการลงนามแบบหมุนเวียนล่าสุด ส่วนขยายของรูปแบบลายเซ็น v4 ได้ถูกสร้างขึ้นซึ่งรวมถึงบล็อกข้อมูลการลงนามเพิ่มเติมสำหรับการกำหนดค่าการลงนามแต่ละรายการจากบล็อก v3.1

การตรวจสอบ

หากต้องการทดสอบการใช้งานเวอร์ชัน 3.1 ให้รันการทดสอบ PkgInstallSignatureVerificationTest.java CTS ใน cts/hostsidetests/appsecurity/src/android/appsecurity/cts/

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบ โปรดดูส่วน การตรวจสอบ ในเวอร์ชัน 3