Android 13 hỗ trợ lược đồ chữ ký APK phiên bản 3.1, một bản cải tiến so với 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ới Lược đồ chữ ký APK phiên bản 3 liên quan đến việc xoay vòng. Cụ thể, lược đồ chữ ký v3.1 hỗ trợ nhắm đến phiên bản SDK, cho phép xoay vòng để nhắm đến một bản phát hành sau này của nền tảng.
Sơ đồ chữ ký phiên bản 3.1 sử dụng một 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 của trình ký sau đây:
- Các thiết bị chạy Android 13 trở lên sẽ sử dụng trình ký xoay vòng trong khối v3.1.
- Các thiết bị chạy các phiên bản Android cũ sẽ bỏ qua trình ký xoay vòng và thay vào đó 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ý phiên bản 3.1 theo mặc định.
khối ký phiên bản 3.1
Khối ký v3.1 có nội dung giống như khối ký v3, nhưng với mã nhận dạng khối mới, các chữ ký này 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ề APK đa mục tiêu vì người ký ban đầu có thể được dùng để ký APK trong khối ký v3 và người 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ý phiên bản 3.1 bất cứ khi nào khoá và dòng dõi xoay vòng được cung cấp trong cấu hình ký. Nếu minSdkVersion của một ứng dụng nhỏ hơn Android 12 và đang dùng khoá xoay vòng, thì bạn cũng phải chỉ định khoá ký ban đầu để có thể dùng khoá này ký APK trong khối ký v3. Điều này tương tự như hành vi hiện tại, trong đó người ký ban đầu là bắt buộc nếu APK nhắm đến phiên bản cũ hơn Android 9.
Để hỗ trợ nhắm đến tính năng xoay khoá bắt đầu từ một phiên bản SDK cụ thể, thư viện apksig sẽ cung cấp các API mới cho phép thiết lập phiên bản SDK tối thiểu cho hoạt động xoay. Nếu một phiên bản SDK nhỏ hơn Android 12 được chỉ định làm phiên bản tối thiểu để hỗ trợ hoạt động xoay, thì khối v3 ban đầu sẽ được dùng. Khối ký v3.1 chỉ được dùng khi có hoạt động xoay vòng, trong đó phiên bản SDK tối thiểu cho hoạt động xoay vòng được đặt thành Android 12 trở lên. Khối ký v3 có một thuộc tính để bảo vệ việc xoá phiên bản SDK tối thiểu khi xoay vòng.
| APK có dòng dõi | Giá trị của rotation-min-sdk-version | Khối chữ ký phiên bản 3 | Khối ký v3.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) | Được ký bằng trình ký ban đầu, nhắm đến Android 9 trở lên | Không có |
| Có | Mặc định | Được ký bằng trình ký ban đầu, nhắm đến Android 9 đến 12L | Được ký bằng trình ký xoay vòng, nhắm đến Android 12 trở lên |
| Có | x < 33 (Android 13) | Được ký bằng trình ký xoay vòng, nhắm đến Android 9 trở lên | Không có |
| Có | x >= 33 (Android 13) | Đã ký bằng trình ký ban đầu, nhắm đến Android 9 – (x-1) | Được ký bằng trình ký xoay vòng, nhắm đến x+ |
Vấn đề liên quan đến hướng xoay
Các vấn đề sau đây liên quan đến việc xoay đã được giải quyết trong nền tảng:
Các bản sửa lỗi của Android 12
- Nền tảng sẽ chỉ cấp quyền chữ ký cho một ứng dụng yêu cầu nếu người ký hiện tại của ứng dụng đó nằm trong loạt ký hoặc là người ký hiện tại của ứng dụng kia; điều này ngăn việc cấp quyền chữ ký cho một ứ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.
- 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 làm mất mục đích của việc xoay vòng vì cho phép khoá ký trước ký một bản cập nhật gói mới và khôi phục khoá đã xoay vòng.
- Một APK chỉ được ký bằng khoá xoay vòng và sau đó được cập nhật bằng một APK được ký bằng khoá gốc và khoá xoay vòng trong dòng dõi chỉ cho thấy khoá xoay vòng trong dòng dõi trên các thiết bị chạy Android 11 trở xuống.
Các bản sửa lỗi của Android 11
PackageManager#checkSignatureschư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 gián đoạn hoạt động đo lường cho các ứng dụng sử dụng khoá ký đã xoay vòng với APK đo lường bằng khoá ký ban đầu.- Các gói trong một
sharedUserIddùng chung dòng ký. Bất cứ khi nào một ứng dụng có dòng ký hiệu đã cập nhật được cài đặt hoặc cập nhật trongsharedUiserId, dòng ký hiệu của ứng dụng đó sẽ thay thế dòng ký hiệu dùng chung chosharedUserId(tức là nếu dòng ký hiệu của một ứng dụng là A -> B và ứng dụng đó được cập nhật trongsharedUserIdcó dòng ký hiệu B -> C, thì dòng ký hiệusharedUserIdsẽ đượ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 người ký trước trong dòng dõi trừ phi dòng dõi ký được thay đổi.
Tích hợp phiên bản 4
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 v3.1 ra mắt, v3 chỉ bao gồm cấu hình ký xoay mới nhất này, vì vậy v4 có thể sử dụng cấu hình này nguyên trạng; nhờ đó, lược đồ chữ ký v4 có thể hỗ trợ xoay vì đã sử dụng khoá ký xoay trong SigningInfo. Mặc dù SigningInfo v4 không bao gồm toàn bộ dòng ký, nhưng có thể kéo dòng này từ khối ký v3 để cho phép nền tảng truy cập vào dòng cho mọi truy vấn chữ ký. Khi v3.1 được dùng để nhắm đến hoạt động xoay cho rotation-min-sdk-version đã 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. Một tiện ích của lược đồ 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.
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.