Trang này trình bày cách xác minh rằng APK hoặc APEX được cài đặt trên thiết bị Android của bạn tương ứng với các tuyên bố trong Mô hình bên yêu cầu xác nhận. Quy trình này bao gồm việc kéo APK từ thiết bị của bạn và thực hiện bằng chứng bao gồm nhật ký trên cấu phần phần mềm đã trích xuất.
Quy trình xác minh
Nhật ký minh bạch được triển khai bằng cây Merkle bao gồm các hàm băm. Nút lá chứa dữ liệu và nút mẹ chứa hàm băm của các nút con.
Hai phép tính cơ bản xác minh thuộc tính chống giả mạo của nhật ký minh bạch: bằng chứng bao gồm và bằng chứng nhất quán. Bằng chứng về việc đưa vào xác nhận rằng nhật ký có một mục cho một phiên bản APK cụ thể. Mục nhập nhật ký này chứa một hàm băm, là thuật toán SHA256 của tệp APK được cài đặt trên thiết bị. Bằng chứng tính nhất quán đảm bảo rằng khi các mục mới được thêm vào, điểm kiểm tra mới vẫn nhất quán về mặt mật mã học với các phiên bản trước của cây (hoặc cây không bị giả mạo). Trong hướng dẫn này, chúng tôi tập trung vào quy trình tính toán bằng chứng bao gồm, đồng thời dựa vào các nhân chứng để liên tục thực hiện bằng chứng nhất quán đối với các điểm kiểm tra mới nhất.
Để xác minh một APK được đề cập, hãy thực hiện quy trình chứng minh việc đưa vào đối với một điểm kiểm tra được chứng kiến. Xin lưu ý rằng chúng tôi dự định tích hợp nhật ký này với một mạng lưới chứng thực công khai bằng cách sử dụng một giao thức chứng thực được tiêu chuẩn hoá. Quy trình tích hợp này sẽ cung cấp các điểm kiểm tra được chứng thực, đảm bảo tính nhất quán của nhật ký.
Để xác minh rằng các ứng dụng Google trên thiết bị của bạn tuân thủ các tuyên bố trong mô hình bên khiếu kiện, hãy làm theo các bước bên dưới.
Bằng chứng bao gồm
Bạn có thể xác minh rằng một tệp APK được đề cập trên thiết bị của bạn có trong nhật ký bằng cách trích xuất tệp APK, tính toán hàm băm của tệp đó và sử dụng bằng chứng bao gồm để kiểm tra xem hàm băm đó có tồn tại trong điểm kiểm tra đã xuất bản hay không. Bằng chứng bao gồm thành công đảm bảo chống lại các rủi ro được mô tả trong Mô hình mối đe doạ, xác nhận rằng ứng dụng là một ứng dụng Google hợp pháp.
Cách xác minh việc đưa APK vào nhật ký
Mọi ứng dụng tự nhận là ứng dụng Google bên thứ nhất đều có thể được xác minh dựa trên nhật ký này.
Điều kiện tiên quyết để xác minh
Trước khi xác minh một tệp APK đã trích xuất, bạn nên cài đặt các công cụ sau trên máy tính:
Cầu gỡ lỗi Android (ADB)
ADB là một công cụ giao tiếp với thiết bị Android, có trên trang web Công cụ nền tảng SDK Android.
AAPT2
AAPT2 (Công cụ đóng gói tài nguyên Android) là một công cụ bản dựng dùng để biên dịch và đóng gói tài nguyên của một ứng dụng Android.
Công cụ này có sẵn dưới dạng một công cụ độc lập trong Bộ công cụ xây dựng SDK Android phiên bản 26.0.2 trở lên.
Golang
Công cụ xác minh được viết bằng Go. Để tạo công cụ này, hãy cài đặt Go 1.17 trở lên từ trang web Go.
Trình xác minh bằng chứng bao gồm
Chúng tôi xuất bản một mô-đun Go có tên là verifier trong kho lưu trữ GitHub về tính minh bạch của tệp nhị phân Android.
Công cụ này truy vấn nhật ký minh bạch về APK của bên thứ nhất của Google để kiểm tra xem một gói có được đưa vào hay không.
Để sử dụng công cụ này, trước tiên hãy sao chép kho lưu trữ vào máy tính của bạn:
git clone https://github.com/android/android-binary-transparency
Bạn có thể tìm thấy mã nguồn cho trình xác minh trong kho lưu trữ android-binary-transparency.
Tạo tải trọng để xác minh
Để xác minh tệp APK đã trích xuất, bạn phải tạo một tải trọng nhật ký bằng thông tin bắt nguồn từ chính tệp APK.
Trước khi bắt đầu, hãy bật tính năng gỡ lỗi qua USB trên thiết bị để cho phép các kết nối adb.
Tiếp theo, hãy tìm APK đã cài đặt trên thiết bị của bạn. Hướng dẫn này sử dụng APK dịch vụ Google Play (com.google.android.gms) làm ví dụ minh hoạ.
adb shell pm path com.google.android.gms
Bạn sẽ thấy kết quả tương tự như dưới đây:
computer:~$ adb shell pm path com.google.android.gms
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/base.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_CronetDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteLoader_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesA_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_DynamiteModulesC_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_GoogleCertificates_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MapsDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_MeasurementDynamite_installtime.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.en.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_config.xxhdpi.apk
package:/data/app/~~oI3N-m7I3VNMk5eKUCscQg==/com.google.android.gms-O79jYXgqkqKaQ9IzJ5zqfA==/split_maps_core_dynamite_ondemand.apk
Đầu ra này cho biết một APK cơ sở và một số APK phân tách được cài đặt cho com.google.android.gms trên thiết bị của bạn.
Số lượng APK phân tách chính xác sẽ khác nhau tuỳ thuộc vào cấu hình của thiết bị.
Mỗi APK phân tách đều có cùng tên gói và mã phiên bản với APK cơ sở.
Tải các tệp APK trong danh sách từ thiết bị Android xuống máy tính bằng lệnh sau (lưu ý rằng đường dẫn thực tế đến tệp có thể khác):
mkdir -p /tmp/testdir/gms && cd /tmp/testdir/gms && \
adb shell pm path com.google.android.gms | cut -d':' -f2 | tr -d '\r' | xargs -n1 adb pull
Để xác minh tên gói và phiên bản của các APK đã tải xuống, bạn cần kiểm tra tệp kê khai (AndroidManifest.xml) của các APK đó.
Vì tệp kê khai bên trong APK ở định dạng nhị phân, hãy sử dụng công cụ aapt2 (được cài đặt trong bước điều kiện tiên quyết) để trích xuất và đọc thông tin trực tiếp từ APK:
computer:/tmp/testdir/gms$ aapt2 dump badging ./base.apk
package: name='com.google.android.gms' versionCode='260834035' versionName='26.08.34 (260400-876566425)' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'
minSdkVersion:'35'
targetSdkVersion:'36'
...
Bạn nên lặp lại bước này để nhận thông tin liên quan cho đến khi bạn đã tính đến tất cả các APK phân tách được cài đặt trên thiết bị của mình.
Đầu ra xác nhận tên gói của APK là com.google.android.gms và số phiên bản (versionCode) là 260834035.
Tiếp theo, hãy tính toán hàm băm mật mã của từng APK:
computer:/tmp/testdir/gms$ sha256sum *.apk
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a base.apk
c20754aee886cc55a9de91ee15c623c59d94ad22b7e435a1a48afc43cf1a106c split_config.en.apk
68c09b63a1262e0d34020c139bc77deff3c32bd2b01177abac64790a62fb3be6 split_config.xxhdpi.apk
cd746820c27babd855fa5daea6fabcdf7b44abf3060bc547adc4219212410af0 split_CronetDynamite_installtime.apk
512ee48b60fdb0787a17f84a7dc448fdbf885b2b86a9cb50525d4c22d561b0f1 split_DynamiteLoader_installtime.apk
9e0c74bdc75c50c80d4e2e580a7eda6b8391423ab1161645f41ec6cadc07d678 split_DynamiteModulesA_installtime.apk
955780ac01f59b98bd9be12968f3824ad71b762620f7bf223c569c1a6ab7056c split_DynamiteModulesC_installtime.apk
34c4a2e32d31554d55fc1519e2cfc3ed5027a090fb29b54cfc99f42d1da43bc5 split_GoogleCertificates_installtime.apk
475e18dde92472cde9d8300c082b6dc269613db03398bcd9d1987dff3e68f7b5 split_maps_core_dynamite_ondemand.apk
f83faf40f08bc13f4879302e01c08c863ca2304b4b4e7c9eaf8cd1e869bb6573 split_MapsDynamite_installtime.apk
ec6d854ddda6cd1ba2ba7af2d9fdf4f28c5c78be8713c64521c785429296738c split_MeasurementDynamite_installtime.apk
Giờ đây, bạn đã có tất cả thông tin cần thiết để tạo một tải trọng nhật ký, được định dạng như mô tả trong phần Nội dung nhật ký. Chọn một hàm băm trong số các kết quả làm ví dụ (bạn nên xác minh hàm băm của mọi APK phân chia), tải trọng nhật ký sẽ có dạng như sau:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Đảm bảo bạn thêm ký tự dòng mới ở cuối tệp. Lưu nội dung này vào một tệp, chẳng hạn như payload.txt, để sử dụng với công cụ verifier sau này.
Xác minh việc đưa gói vào (Bằng chứng về việc đưa vào)
Sau khi tạo tải trọng, giờ đây, bạn có thể kiểm tra xem gói có nằm trong nhật ký minh bạch hay không. Tạo công cụ chứng minh việc bao gồm từ kho lưu trữ android-binary-transparency mà bạn đã sao chép trước đó:
go build cmd/verifier/verifier.go
Thao tác này sẽ tạo ra một tệp thực thi có tên là verifier trong thư mục đó.
Chạy trình xác minh, cung cấp đường dẫn đến tải trọng và chỉ định loại nhật ký:
computer:android-binary-transparency$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/payload.txt
computer:android-binary-transparency$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=google_1p_apk
Trình xác minh sử dụng nội dung của nhật ký và điểm kiểm tra (trong thư mục ô) để kiểm tra xem tải trọng APK của bạn có nằm trong nhật ký minh bạch hay không, xác nhận rằng tải trọng đó do Google phát hành.
Lệnh này xuất ra stderr:
OK. inclusion check success!nếu gói có trong nhật ký.FAILUREnếu không.
Tự động xác minh tất cả các gói trong một thiết bị
Vì có thể có nhiều ứng dụng Google được cài đặt sẵn trên thiết bị của bạn, nên việc liệt kê từng ứng dụng và thực hiện riêng lẻ các bằng chứng về việc đưa vào có thể gây phiền toái.
Chúng tôi cung cấp một công cụ tự động khác có tên là Uraniborg. Công cụ này có thể phát hiện và đo lường tất cả các gói hiện được cài đặt trên thiết bị của bạn.
Công cụ này cung cấp đầu ra trực tiếp cho công cụ verifier, cho phép bạn khám phá và xác minh tính minh bạch của tất cả ứng dụng trên thiết bị của mình chỉ trong một bước.
Để sử dụng quy trình tự động này, hãy đảm bảo thiết bị Android của bạn được kết nối với máy tính qua ADB. Mã nguồn Uraniborg cũng được đưa vào kho lưu trữ android-binary-transparency.
Chạy tập lệnh automate_observation.py nằm trong thư mục scripts/python:
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
Khi tập lệnh hoàn tất, bạn sẽ thấy kết quả tương tự như sau:
INFO:automate_observation.py:main(858): SUCCESS! Hubble was successfully deployed and executed on connected device ABCDEFGHN01234.
INFO:automate_observation.py:main(860): Hubble output files can be found at: /Users/user/home/src/android-binary-transparency/uraniborg/scripts/python/results/google/lynx/lynx:16/BP4A.260105.004.E1/14587043:user/release-keys/001
Chuyển đến thư mục đầu ra do tập lệnh chỉ định.
Bên trong thư mục này, hãy tìm tệp có tên packages_with_inclusion_proof_signal.txt.
Tệp này liệt kê từng gói đã cài đặt cùng với một trường inclusion_proof_verified được đặt thành true hoặc false.
Giá trị true cho biết gói đã được xác minh bằng mật mã dựa trên nhật ký minh bạch, xác nhận rằng gói tuân thủ các tuyên bố của nhật ký.