Lược đồ chữ ký APK v3

Android 9 hỗ trợ xoay phím APK , giúp ứng dụng có thể thay đổi khóa ký của chúng như một phần của bản cập nhật APK. Để thực hiện xoay vòng, APK phải chỉ ra mức độ tin cậy giữa khóa ký mới và khóa cũ. Để hỗ trợ xoay khóa, chúng tôi đã cập nhật lược đồ chữ ký APK từ v2 lên v3 để cho phép sử dụng các khóa mới và cũ. V3 thêm thông tin về các phiên bản SDK được hỗ trợ và cấu trúc bằng chứng luân phiên vào khối ký APK.

Khối ký APK

Để duy trì khả năng tương thích ngược với định dạng APK v1, chữ ký APK v2 và v3 được lưu trữ bên trong Khối ký APK, nằm ngay trước Thư mục trung tâm ZIP.

Định dạng Khối ký APK v3 giống như v2 . Chữ ký v3 của APK được lưu trữ dưới dạng cặp giá trị ID với ID 0xf05368c0.

Lược đồ chữ ký APK v3 Block

Sơ đồ v3 được thiết kế rất giống với sơ đồ v2 . Nó có cùng một định dạng chung và hỗ trợ cùng một ID thuật toán chữ ký , kích thước khóa và đường cong EC.

Tuy nhiên, lược đồ v3 bổ sung thông tin về các phiên bản SDK được hỗ trợ và cấu trúc bằng chứng xoay vòng.

Định dạng

Lược đồ chữ ký APK v3 Khối được lưu trữ bên trong Khối ký APK dưới ID 0xf05368c0 .

Định dạng của APK Signature Scheme v3 Block tuân theo định dạng của v2:

  • trình tự có tiền tố độ dài của signer có tiền tố độ dài:
    • signed data có tiền tố độ dài:
      • trình tự có tiền tố độ dài của các thông báo có tiền tố độ digests :
        • signature algorithm ID (4 byte)
        • digest (có tiền tố độ dài)
      • trình tự có tiền tố độ dài của chứng chỉ certificates :
        • chứng chỉ certificate có tiền tố độ dài (mẫu ASN.1 DER)
      • minSDK (uint32) - nên bỏ qua trình ký này nếu phiên bản nền tảng thấp hơn số này.
      • maxSDK (uint32) - nên bỏ qua trình ký này nếu phiên bản nền tảng cao hơn số này.
      • chuỗi các additional attributes có tiền tố chiều dài:
        • ID (uint32)
        • value (biến-độ dài: độ dài của thuộc tính bổ sung - 4 byte)
        • ID - 0x3ba06f8c
        • value - Cấu trúc bằng chứng xoay vòng
    • minSDK (uint32) - bản sao của giá trị minSDK trong phần dữ liệu đã ký - được sử dụng để bỏ qua xác minh chữ ký này nếu nền tảng hiện tại không nằm trong phạm vi. Phải khớp với giá trị dữ liệu đã ký.
    • maxSDK (uint32) - bản sao của giá trị maxSDK trong phần dữ liệu đã ký - được sử dụng để bỏ qua xác minh chữ ký này nếu nền tảng hiện tại không nằm trong phạm vi. Phải khớp với giá trị dữ liệu đã ký.
    • trình tự có tiền tố độ dài của signatures tiền tố độ dài:
      • signature algorithm ID (uint32)
      • signature tiền tố độ dài trên signed data
    • public key có tiền tố độ dài (SubjectPublicKeyInfo, biểu mẫu ASN.1 DER)

Cấu trúc Proof-of-luân phiên và tự tin cậy-old-certs

Cấu trúc bằng chứng xoay vòng cho phép ứng dụng xoay chứng chỉ ký của chúng mà không bị chặn trên các ứng dụng khác mà chúng giao tiếp. Để thực hiện điều này, chữ ký ứng dụng chứa hai phần dữ liệu mới:

  • khẳng định đối với các bên thứ ba rằng chứng chỉ ký của ứng dụng có thể được tin cậy ở bất cứ nơi nào mà người tiền nhiệm của nó đáng tin cậy
  • chứng chỉ ký cũ hơn của ứng dụng mà bản thân ứng dụng vẫn tin tưởng

Thuộc tính bằng chứng xoay vòng trong phần dữ liệu đã ký bao gồm một danh sách được liên kết riêng, với mỗi nút chứa một chứng chỉ ký được sử dụng để ký các phiên bản trước của ứng dụng. Thuộc tính này có nghĩa là chứa cấu trúc dữ liệu bằng chứng xoay vòng khái niệm và chứng chỉ cũ tự tin cậy. Danh sách được sắp xếp theo phiên bản với chứng chỉ ký cũ nhất tương ứng với nút gốc. Cấu trúc dữ liệu bằng chứng xoay vòng được xây dựng bằng cách để chứng chỉ trong mỗi nút ký vào nút tiếp theo trong danh sách và do đó đưa vào mỗi khóa mới bằng chứng rằng nó phải đáng tin cậy như (các) khóa cũ hơn.

Cấu trúc dữ liệu old-certs tự tin cậy được xây dựng bằng cách thêm các cờ vào mỗi nút chỉ ra thành viên và thuộc tính của nó trong tập hợp. Ví dụ: một cờ có thể xuất hiện cho biết rằng chứng chỉ ký tại một nút nhất định là đáng tin cậy để có được quyền đối với chữ ký của Android. Cờ này cho phép các ứng dụng khác được chứng chỉ cũ ký vẫn được cấp quyền chữ ký được xác định bởi ứng dụng được ký bằng chứng chỉ ký mới. Vì toàn bộ thuộc tính bằng chứng xoay vòng nằm trong phần dữ liệu đã ký của trường signer v3, nên nó được bảo vệ bằng khóa được sử dụng để ký gói ứng dụng có chứa.

Định dạng này loại trừ nhiều khóa ký và sự hội tụ của các chứng chỉ ký tổ tiên khác nhau thành một (nhiều nút bắt đầu vào một bồn rửa chung).

Định dạng

Bằng chứng xoay vòng được lưu trữ bên trong Khối chữ ký APK v3 dưới ID 0x3ba06f8c . Định dạng của nó là:

  • trình tự có tiền tố độ dài của các cấp độ có tiền tố levels dài:
    • signed data có tiền tố độ dài (theo cert trước - nếu tồn tại)
      • chứng chỉ certificate có tiền tố độ dài (mẫu ASN.1 DER)
      • signature algorithm ID (uint32) - thuật toán được sử dụng bởi cert ở cấp độ trước
    • flags (uint32) - cờ cho biết chứng chỉ này có nên nằm trong cấu trúc old-certs tự tin cậy hay không và cho các hoạt động nào.
    • signature algorithm ID (uint32) - phải khớp với ID từ phần dữ liệu đã ký ở cấp độ tiếp theo.
    • signature tiền tố độ dài trên signed data ở trên

Nhiều chứng chỉ

Android hiện coi một APK được ký bằng nhiều chứng chỉ là có danh tính ký duy nhất tách biệt với các chứng chỉ bao gồm. Do đó, thuộc tính bằng chứng xoay vòng trong phần dữ liệu có dấu tạo thành một biểu đồ xoay vòng có hướng, tốt hơn có thể được xem như một danh sách được liên kết riêng, với mỗi tập hợp các ký hiệu cho một phiên bản nhất định đại diện cho một nút. Điều này làm tăng thêm độ phức tạp cho cấu trúc bằng chứng xoay vòng (phiên bản nhiều người ký tên bên dưới). Đặc biệt, việc đặt hàng trở thành mối quan tâm. Hơn nữa, không còn có thể ký các APK một cách độc lập, vì cấu trúc bằng chứng xoay vòng phải có các chứng chỉ ký cũ ký vào bộ chứng chỉ mới, thay vì ký từng cái một. Ví dụ: một APK được ký bởi khóa A muốn được ký bởi hai khóa mới B và C không thể để người ký B chỉ bao gồm chữ ký của A hoặc B, vì đó là danh tính ký khác với B và C. Điều này sẽ có nghĩa là những người ký kết phải phối hợp trước khi xây dựng một cấu trúc như vậy.

Thuộc tính bằng chứng xoay vòng nhiều người ký

  • chuỗi tiền tố độ dài của các sets tiền tố độ dài:
    • signed data (theo bộ trước - nếu tồn tại)
      • chuỗi certificates có tiền tố độ dài
        • chứng chỉ certificate có tiền tố độ dài (mẫu ASN.1 DER)
      • Chuỗi các signature algorithm IDs (uint32) - một cho mỗi chứng chỉ từ tập trước, theo cùng một thứ tự.
    • flags (uint32) - cờ cho biết liệu tập hợp các chứng chỉ này có nên nằm trong cấu trúc chứng chỉ cũ-tự tin cậy hay không và cho các hoạt động nào.
    • trình tự có tiền tố độ dài của signatures tiền tố độ dài:
      • signature algorithm ID (uint32) - phải khớp với ID từ phần dữ liệu đã ký
      • signature tiền tố độ dài trên signed data ở trên

Nhiều tổ tiên trong cấu trúc bằng chứng xoay vòng

lược đồ v3 cũng không xử lý hai phím khác nhau xoay đến cùng một phím ký cho cùng một ứng dụng. Điều này khác với trường hợp mua lại, trong đó công ty mua lại muốn chuyển ứng dụng được mua sang sử dụng khóa ký của nó để chia sẻ quyền. Việc chuyển đổi được xem như một trường hợp sử dụng được hỗ trợ vì ứng dụng mới sẽ được phân biệt bằng tên gói và có thể chứa cấu trúc bằng chứng xoay vòng của riêng nó. Trường hợp không được hỗ trợ, cùng một ứng dụng có hai đường dẫn khác nhau để đến cùng một chứng chỉ, phá vỡ nhiều giả định được đưa ra trong thiết kế xoay khóa.

xác minh

Trong Android 9 trở lên, APK có thể được xác minh theo sơ đồ chữ ký APK v3, v2 hoặc sơ đồ v1. Các nền tảng cũ hơn bỏ qua chữ ký v3 và cố gắng xác minh chữ ký v2, sau đó là v1.

Quy trình xác minh chữ ký APK

Hình 1. Quy trình xác minh chữ ký APK

Xác minh sơ đồ chữ ký APK v3

  1. Tìm Khối ký APK và xác minh rằng:
    1. Hai trường kích thước của Khối ký APK chứa cùng một giá trị.
    2. ZIP Central Directory ngay sau ZIP Bản ghi cuối Central Directory.
    3. ZIP End of Central Directory không có thêm dữ liệu theo sau.
  2. Xác định vị trí Khối chữ ký APK v3 đầu tiên bên trong Khối chữ ký APK. Nếu có Khối v3, hãy chuyển sang bước 3. Nếu không, hãy quay lại xác minh APK bằng lược đồ v2 .
  3. Đối với mỗi signer trong Khối v3 Sơ đồ chữ ký APK có phiên bản SDK tối thiểu và tối đa nằm trong phạm vi của nền tảng hiện tại:
    1. Chọn signature algorithm ID được hỗ trợ mạnh nhất từ ​​các signatures . Thứ tự sức mạnh tùy thuộc vào từng phiên bản triển khai / nền tảng.
    2. Xác minh signature tương ứng từ các signatures so với signed data bằng public key . (Bây giờ có thể an toàn để phân tích cú pháp signed data .)
    3. Xác minh các phiên bản SDK tối thiểu và tối đa trong dữ liệu đã ký khớp với các phiên bản được chỉ định cho signer .
    4. Xác minh rằng danh sách các ID thuật toán chữ ký đã được sắp xếp trong các thông digestssignatures là giống hệt nhau. (Điều này là để ngăn chặn việc xóa / thêm chữ ký.)
    5. Tính toán thông báo về nội dung APK bằng cách sử dụng thuật toán thông báo giống như thuật toán thông báo được sử dụng bởi thuật toán chữ ký.
    6. Xác minh rằng thông báo được tính toán giống với digest tương ứng từ các thông digests .
    7. Xác minh rằng SubjectPublicKeyInfo của chứng chỉ đầu tiên của certificate certificates giống với public key .
    8. Nếu thuộc tính bằng chứng xoay vòng tồn tại cho signer xác minh rằng cấu trúc hợp lệ và signer này là chứng chỉ cuối cùng trong danh sách.
  4. Việc xác minh thành công nếu tìm thấy chính xác một signer trong phạm vi của nền tảng hiện tại và bước 3 đã thành công cho signer đó.

Thẩm định

Để kiểm tra xem thiết bị của bạn có hỗ trợ v3 đúng cách hay không, hãy chạy các bài kiểm tra PkgInstallSignatureVerificationTest.java CTS trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .