Sơ đồ chữ ký APK v3.1

Tổng quan

Android 13 hỗ trợ Lược đồ chữ ký APK v3.1, một cải tiến trên Lược đồ chữ ký APK v3 hiện có. Lược đồ v3.1 giải quyết một số vấn đề đã biết với Lược đồ chữ ký APK v3 liên quan đến xoay vòng. Đặc biệt, sơ đồ chữ ký v3.1 hỗ trợ nhắm mục tiêu theo phiên bản SDK, cho phép xoay vòng để nhắm mục tiêu bản phát hành nền tảng sau này.

Lược đồ chữ ký v3.1 sử dụng ID khối không được nhận dạng trên Android 12 trở xuống. Do đó, nền tảng áp dụng hành vi của người ký sau:

  • Các thiết bị chạy Android 13 trở lên sử dụng ký hiệu xoay trong khối v3.1.
  • Các thiết bị chạy phiên bản Android cũ hơn sẽ bỏ qua ký hiệu xoay vòng và thay vào đó sử dụng ký hiệu gốc trong khối v3.

Các ứng dụng chưa xoay khóa ký không yêu cầu bất kỳ hành động bổ sung nào. Bất cứ khi nào các ứng dụng này chọn xoay, hệ thống sẽ áp dụng lược đồ chữ ký v3.1 theo mặc định.

khối ký v3.1

Khối ký v3.1 sẽ có cùng nội dung với khối ký v3, nhưng với ID khối mới, các chữ ký này sẽ chỉ được nhận dạng trên các thiết bị chạy Android 13 trở lên. Điều này cho phép các ứng dụng xoay vòng khóa ký một cách an toàn mà không cần phải lo lắng về APK đa mục tiêu vì người ký ban đầu có thể được sử dụng để ký APK trong khối ký v3 và người ký xoay vòng trong khối ký v3.1. Điều này cũng cho phép nền tảng sử dụng lại tất cả các mã xác minh hiện có cho khối ký v3 khi xác minh chữ ký v3.1.

Theo mặc định, thư viện apksig sẽ sử dụng khối ký v3.1 bất cứ khi nào khóa xoay và dòng dõi được cung cấp trong cấu hình ký. Nếu minSdkVersion của ứng dụng nhỏ hơn Android 13 và đang sử dụng khóa xoay, thì khóa ký ban đầu cũng phải được chỉ định để có thể dùng khóa đó để ký APK trong khối ký v3. Điều này tương tự như hành vi hiện tại trong đó cần có người ký ban đầu nếu APK nhắm mục tiêu phiên bản cũ hơn Android 9.

Để hỗ trợ xoay vòng khóa nhắm mục tiêu bắt đầu từ một phiên bản SDK cụ thể, thư viện apksig sẽ hiển thị các API mới cho phép đặt phiên bản SDK tối thiểu để xoay vòng. Nếu phiên bản SDK nhỏ hơn Android 13 được chỉ định làm phiên bản tối thiểu để hỗ trợ xoay vòng thì phiên bản v3 gốc khối sẽ được sử dụng. Khối ký v3.1 chỉ được sử dụng khi có tính năng xoay vòng trong đó phiên bản SDK tối thiểu để xoay vòng được đặt thành Android 13 trở lên. Khối ký v3 sẽ có thuộc tính mới để bảo vệ việc loại bỏ phiên bản SDK tối thiểu xoay vòng.

APK bao gồm dòng dõi Giá trị của phiên bản xoay-min-sdk khối ký v3 khối ký v3.1
KHÔNG Mặc định hoặc bất kỳ giá trị nào (được biểu thị bằng x bên dưới) Đã ký với người ký ban đầu, nhắm mục tiêu Android 9 trở lên Không có mặt
Đúng Mặc định Đã ký với người ký ban đầu, nhắm mục tiêu Android 9 đến 12L Đã ký với người ký luân phiên, nhắm mục tiêu Android 13 trở lên
Đúng x < 33 (Android 13) Đã ký với người ký luân phiên, nhắm mục tiêu Android 9 trở lên Không có mặt
Đúng x >= 33 (Android 13) Đã ký với người ký ban đầu, nhắm mục tiêu Android 9 - ( x -1) Đã ký với người ký luân phiên, nhắm mục tiêu x+

Các vấn đề liên quan đến luân chuyển

Các vấn đề liên quan đến xoay vòng sau đây đã được giải quyết trong nền tảng:

Bản sửa lỗi Android 12

  • Nền tảng sẽ chỉ cấp quyền chữ ký cho ứng dụng yêu cầu nếu người ký hiện tại của một trong hai ứng dụng thuộc dòng ký hoặc là người ký hiện tại của ứng dụng kia; điều này ngăn cản việc cấp quyền chữ ký cho ứng dụng yêu cầu nếu hai ứng dụng tuân theo các phương pháp hay nhất về khóa ký và xoay sang các khóa ký khác nhau.
  • Tính năng khôi phục APK của nền tảng không thể khôi phục APK vừa xoay khóa ký trừ khi khóa trước đó trong dòng ký có khả năng khôi phục, nhưng khả năng này làm mất đi mục đích xoay vòng vì nó cho phép bản cập nhật gói mới được ký bởi người ký. khóa ký trước đó và khôi phục khóa đã xoay.
  • APK được ký chỉ bằng khóa xoay và sau đó được cập nhật bằng APK được ký bằng khóa gốc và khóa xoay trong dòng sẽ chỉ hiển thị khóa đã xoay trong dòng trên các thiết bị chạy Android 11 trở về trước.

Bản sửa lỗi Android 11

  • PackageManager#checkSignatures chưa được cập nhật đúng cách để kiểm tra khóa ký ban đầu của hai gói. Điều này đã làm hỏng công cụ đo lường dành cho các ứng dụng sử dụng khóa ký xoay vòng với APK công cụ sử dụng khóa ký ban đầu.
  • Các gói trong sharedUserId chia sẻ dòng chữ ký của chúng. Bất cứ khi nào một ứng dụng có dòng ký được cập nhật được cài đặt hoặc cập nhật trong sharedUiserId thì dòng của ứng dụng đó sẽ thay thế dòng được chia sẻ cho sharedUserId (nghĩa là nếu dòng ký của ứng dụng là A -> B và một ứng dụng được cập nhật trong sharedUserId với dòng B -> C thì dòng sharedUserId sẽ được thay thế bằng B -> C). Các khả năng tương tự của người ký trước đó trong dòng không thể được cập nhật trừ khi dòng ký được thay đổi.

tích hợp v4

Lược đồ chữ ký v4 sử dụng cấu hình ký được cung cấp cho apksigner; trong trường hợp có nhiều cấu hình ký được cung cấp để xoay vòng, cấu hình ký xoay vòng mới nhất sẽ được sử dụng. Trước khi giới thiệu v3.1, v3 chỉ bao gồm cấu hình ký xoay vòng mới nhất này, vì vậy v4 có thể sử dụng cấu hình này; với điều này, lược đồ chữ ký v4 có thể hỗ trợ xoay vòng vì nó sử dụng khóa ký được xoay trong SigningInfo của nó. Mặc dù SigningInfo v4 không bao gồm dòng ký đầy đủ nhưng nó có thể lấy thông tin này từ khối ký v3 để cho phép nền tảng truy cập vào dòng chữ ký cho bất kỳ truy vấn chữ ký nào. Khi phiên bản v3.1 được sử dụng để nhắm mục tiêu xoay vòng cho phiên bản spinning-min-sdk được cung cấp, cấu hình v3 chung sẽ bao gồm cả cấu hình ký ban đầu cũng như cấu hình ký xoay vòng mới nhất. Một phần mở rộng của sơ đồ chữ ký v4 đã được tạo bao gồm các khối thông tin ký bổ sung cho từng cấu hình ký từ khối v3.1.

Thẩm định

Để kiểm tra việc triển khai v3.1 của bạn, hãy chạy kiểm tra PkgInstallSignatureVerificationTest.java CTS trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .

Để biết thêm thông tin về thử nghiệm, hãy xem phần xác minh trong v3.