Lược đồ chữ ký APK phiên bản 3.1

Tổng quan

Android 13 hỗ trợ lược đồ chữ ký APK phiên bản 3.1, một điểm cải tiến trên lược đồ chữ ký APK phiên bản 3 hiện có. Lược đồ v3.1 giải quyết một số vấn đề đã biết về Lược đồ chữ ký APK v3 liên quan đến việc xoay. Cụ thể, giao thức chữ ký v3.1 hỗ trợ tính năng nhắm mục tiêu theo phiên bản SDK, cho phép xoay vòng để nhắm đến bản phát hành sau của nền tảng.

Lược đồ chữ ký phiên bản 3.1 sử dụng mã nhận dạng khối không được nhận dạng trên Android 12 trở xuống. Do đó, nền tảng sẽ áp dụng hành vi ký sau:

  • Các thiết bị chạy Android 13 trở lên sử dụng trình ký xoay vòng trong khối v3.1.
  • Các thiết bị chạy phiên bản Android cũ sẽ bỏ qua trình ký xoay vòng và sử dụng trình ký ban đầu trong khối v3.

Những ứng dụng chưa xoay vòng khoá ký không cần làm gì thêm. Bất cứ khi nào các ứng dụng này chọn xoay, hệ thống sẽ áp dụng giao thức chữ ký v3.1 theo mặc định.

Khối ký phiên bản 3.1

Khối ký v3.1 sẽ có nội dung giống với khối ký v3, nhưng với mã 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 khoá ký một cách an toàn mà không cần lo lắng về các tệp APK nhiều mục tiêu vì trình ký ban đầu có thể được dùng để ký tệp APK trong khối ký v3 và trình ký được 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ả 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 khoá xoay vòng và dòng dõi được cung cấp trong cấu hình ký. Nếu minSdkVersion của ứng dụng thấp hơn Android 13 và khoá xoay vòng đang được sử dụng, thì bạn cũng phải chỉ định khoá ký ban đầu để có thể dùng khoá đó ký APK trong khối ký v3. Điều này tương tự như hành vi hiện tại, trong đó yêu cầu chữ ký ban đầu nếu APK nhắm đến phiên bản cũ hơn Android 9.

Để hỗ trợ tính năng xoay khoá 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. Nếu phiên bản SDK thấp hơn Android 13 được chỉ định là phiên bản tối thiểu để hỗ trợ xoay, thì khối v3 ban đầu sẽ được sử dụng. Khối ký v3.1 chỉ được dùng khi có chế độ xoay, trong đó phiên bản SDK tối thiểu cho chế độ xoay được đặt thành Android 13 trở lên. Khối ký v3 sẽ có một thuộc tính mới để bảo vệ việc xoá phiên bản SDK tối thiểu theo vòng quay.

APK bao gồm Lineage Giá trị của rotation-min-sdk-version Khối ký v3 Khối ký phiên bản 3.1
Không Giá trị mặc định hoặc bất kỳ giá trị nào (được biểu thị bằng x bên dưới) Đã ký bằng trình ký gốc, nhắm đến Android 9 trở lên Không có
Mặc định Được ký bằng trình ký gốc, nhắm đến Android 9 đến 12L Đã ký bằng trình ký xoay vòng, nhắm đến Android 13 trở lên
x < 33 (Android 13) Đã ký bằng trình ký xoay vòng, nhắm đến Android 9 trở lên Không có
x >= 33 (Android 13) Đã ký bằng chữ ký gốc, nhắm đến Android 9 – (x-1) Đã ký bằng trình ký xoay vòng, nhắm đến x+

Vấn đề liên quan đến việc xoay

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

  • 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 nằm trong 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 chặ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ề khoá ký và xoay vòng sang các khoá 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 một APK vừa xoay vòng khoá ký, trừ phi khoá trước đó trong dòng ký có khả năng khôi phục. Tuy nhiên, khả năng này sẽ làm mất mục đích của việc xoay vòng vì cho phép cập nhật gói mới được ký bằng khoá ký trước đó và khôi phục khoá đã xoay vòng.
  • Một tệp APK chỉ được ký bằng khoá đã xoay và sau đó được cập nhật bằng một tệp APK được ký bằng khoá gốc và khoá đã xoay trong dòng sản phẩm sẽ chỉ hiển thị khoá đã xoay trong dòng sản phẩm trên các thiết bị chạy Android 11 trở xuống.
  • PackageManager#checkSignatures chưa được cập nhật đúng cách để kiểm tra khoá ký ban đầu của hai gói. Điều này đã làm hỏng tính năng đo lường cho các ứng dụng sử dụng khoá ký đã xoay vòng với tệp APK đo lường sử dụng khoá ký ban đầu.
  • Các gói trong sharedUserId chia sẻ dòng chữ ký. Bất cứ khi nào một ứng dụng có dòng chữ ký đã cập nhật được cài đặt hoặc cập nhật trong sharedUiserId, dòng chữ ký của ứng dụng đó sẽ thay thế dòng chữ ký dùng chung cho sharedUserId (tức là nếu dòng chữ ký của một ứng dụng là A -> B và một ứng dụng được cập nhật trong sharedUserId có dòng chữ ký B -> C, thì dòng chữ ký sharedUserId sẽ được thay thế bằng B -> C). Tương tự, bạn không thể cập nhật các chức năng của chữ ký trước đó trong dòng chữ ký trừ phi dòng chữ ký đó đã 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 cho việc xoay, cấu hình ký xoay mới nhất sẽ được sử dụng. Trước khi ra mắt phiên bản 3.1, phiên bản 3 chỉ bao gồm cấu hình ký xoay mới nhất này, vì vậy, phiên bản 4 có thể sử dụng cấu hình này như hiện có; với điều này, lược đồ chữ ký v4 có thể hỗ trợ xoay vì sử dụng khoá ký xoay trong SigningInfo. Mặc dù SigningInfo phiên bản 4 không bao gồm toàn bộ dòng ký, nhưng nó có thể lấy dòng ký này từ khối ký phiên bản 3 để cho phép nền tảng truy cập vào dòng ký cho mọi truy vấn chữ ký. Khi v3.1 đang được sử dụng để nhắm mục tiêu xoay cho phiên bản rotation-min-sdk-version đượ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 mới nhất. Chúng tôi đã tạo một phần mở rộng của lược đồ chữ ký phiên bản 4, bao gồm các khối thông tin ký bổ sung cho từng cấu hình ký từ khối phiên bản 3.1.

Xác nhận kết quả

Để kiểm thử việc triển khai phiên bản 3.1, hãy chạy các bài kiểm thử CTS PkgInstallSignatureVerificationTest.java trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/.

Để biết thêm thông tin về quy trình kiểm thử, hãy xem phần xác minh trong phiên bản 3.