Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

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

Android 9 hỗ trợ APK xoay chìa khóa , mang đến cho các ứng dụng khả năng thay đổi quan trọng ký của họ như một phần của một 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 chìa khóa, chúng tôi cập nhật các chương trình chữ ký APK từ v2 để v3 để cho phép các phím mới và cũ được sử dụng. 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.

APK v3 Ký dạng khối là 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

Đề án v3 được thiết kế để thể rất giống với sơ đồ v2 . Nó có dạng chung giống nhau và hỗ trợ cùng chữ ký ID thuật toán , kích thước quan trọng, và các đườ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 luân phiên.

Sự sắp xếp

APK Chữ ký Đề án v3 Khối được lưu trữ bên trong APK Ký Khối dưới ID 0xf05368c0 .

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

  • chuỗi dài-tiền tố có độ dài tiền tố signer :
    • chiều dài-tiền tố signed data :
      • chuỗi dài-tiền tố có độ dài tiền tố digests :
        • signature algorithm ID (4 byte)
        • digest (chiều dài-tiền tố)
      • chuỗi dài-tiền tố của X.509 certificates :
        • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • minSDK (uint32) - người ký này nên được bỏ qua nếu nền tảng phiên bản nằm dưới con số này.
      • maxSDK (uint32) - người ký này nên được bỏ qua nếu nền tảng phiên bản là ở trên con số này.
      • chuỗi dài-tiền tố có độ dài tiền tố additional attributes :
        • ID (uint32)
        • value (độ dài thay đổi: chiều dài của thuộc tính bổ sung - 4 byte)
        • ID - 0x3ba06f8c
        • value - Proof-of-xoay struct
    • minSDK (uint32) - bản sao của giá trị minSDK trong phần dữ liệu được ký - sử dụng để bỏ qua xác minh của chữ ký này nếu các 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 được ký - sử dụng để bỏ qua xác minh của chữ ký này nếu các 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ý.
    • chuỗi dài-tiền tố có độ dài tiền tố signatures :
      • signature algorithm ID (uint32)
      • chiều dài-tiền tố signature trên signed data
    • chiều dài-tiền tố public key (SubjectPublicKeyInfo, ASN.1 dạng 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 các ứ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 với các bên thứ ba rằng chứng chỉ ký kết của ứng dụng có thể được tin cậy ở bất kỳ 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 đơn lẻ, 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 và tự tin cậy-cũ-xác nhận khái niệm. 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 đối với chữ ký được xác định bởi ứng dụng được ký bằng chứng chỉ ký mới. Bởi vì proof-of-xoay cư trú toàn bộ thuộc tính trong phần dữ liệu có chữ ký của v3 signer lĩnh vực, nó được bảo vệ bởi chính được sử dụng để ký gói ứng dụng có chứa.

Định dạng này ngăn cản nhiều phím ký và hội tụ của các chứng chỉ ký tổ tiên khác nhau để một (nhiều nút khởi đầu cho một bồn rửa chén thông thường).

Sự sắp xếp

Việc luân chuyển chứng-of-được lưu trữ bên trong Chữ ký APK Scheme v3 Khối dưới ID 0x3ba06f8c . Định dạng của nó là:

  • chuỗi dài-tiền tố có độ dài tiền tố levels :
    • chiều dài-tiền tố signed data (bằng cert trước - nếu có)
      • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • signature algorithm ID (uint32) - thuật toán được sử dụng bởi cert ở mức trước đây
    • flags (uint32) - cờ chỉ ra hay không cert này phải ở trong tự đáng tin cậy tuổi-Certs struct, cũng cho đó hoạt động.
    • signature algorithm ID (uint32) - phải phù hợp với một từ phần dữ liệu đăng nhập cấp độ tiếp theo.
    • chiều dài-tiền tố signature qua trên signed data

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 đơn lẻ, 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à nhận dạng 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 dài-tiền tố có độ dài tiền tố sets :
    • signed data (bằng cách thiết lập trước đó - nếu tồn tại)
      • chuỗi dài-tiền tố của certificates
        • chiều dài-tiền tố X.509 certificate (theo mẫu DER ASN.1)
      • Chuỗi các signature algorithm IDs (uint32) - một cho mỗi giấy chứng nhận từ tập trước, theo thứ tự.
    • flags (uint32) - cờ chỉ có hay không này tập hợp các Certs phải ở trong tự đáng tin cậy tuổi-Certs struct, cũng cho đó hoạt động.
    • chuỗi dài-tiền tố có độ dài tiền tố signatures :
      • signature algorithm ID (uint32) - phải phù hợp với một từ phần dữ liệu ký
      • chiều dài-tiền tố signature qua trên signed data

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 lược đồ chữ ký APK v3, v2 hoặc 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. APK quá trình xác minh chữ ký

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 của Central Directory.
    3. ZIP End of Central Directory không được theo sau bởi nhiều dữ liệu hơn.
  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 v3 Khối có mặt, tiến hành bước 3. Nếu không, rơi trở lại để xác minh APK sử dụng chương trình v2 .
  3. Đối với mỗi signer trong Chữ ký APK Scheme v3 Khối với một phút và phiên bản SDK max đó là trong phạm vi của nền tảng hiện tại:
    1. Chọn được hỗ trợ mạnh nhất signature algorithm ID từ 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 tương ứng với signature từ signatures chống lại signed data sử dụng public key . (Nó bây giờ đã an toàn để phân tích signed data .)
    3. Kiểm tra phiên bản min và max SDK trong các dữ liệu có chữ ký phù hợp với những quy định đối với signer .
    4. Xác minh rằng các danh sách đặt hàng của các ID thuật toán chữ ký trong 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 tiêu hóa nội dung APK sử dụng cùng một thuật toán tiêu hóa như tiêu hóa thuật toán được sử dụng bởi các thuật toán chữ ký.
    6. Xác minh rằng tiêu hóa tính là giống hệt nhau để tương ứng digest từ digests .
    7. Xác minh rằng SubjectPublicKeyInfo những người đầu tiên certificate của certificates là giống với public key .
    8. Nếu thuộc tính proof-of-luân tồn tại cho signer xác minh rằng các cấu trúc có giá trị và điều này signer là Giấy chứng nhận cuối cùng trong danh sách.
  4. Xác minh thành công nếu chính xác một signer được tìm thấy trong hàng loạt các nền tảng hiện tại và bước 3 thành công cho rằng signer .

Thẩm định

Để thử nghiệm hỗ trợ thiết bị của bạn v3 đúng cách, chạy PkgInstallSignatureVerificationTest.java kiểm tra CTS trong cts/hostsidetests/appsecurity/src/android/appsecurity/cts/ .