Trang này trình bày cách xác minh rằng tệp 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 người yêu cầu. Quá trình này bao gồm việc lấy tệp APK từ thiết bị của bạn và thực hiện bằng chứng đưa vào nhật ký trên cấu phần phần mềm được trích xuất.
Quy trình xác minh
Nhật ký minh bạch được triển khai bằng một 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à chuỗi băm SHA256 của tệp APK được cài đặt trên thiết bị. Bằng chứng 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ã với các phiên bản trước của cây (hoặc cây không bị giả mạo). Chúng tôi tập trung vào quy trình tính toán bằng chứng bao gồm trong hướng dẫn này, đồng thời dựa vào 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 bao gồm, hãy thực hiện bằng chứng bao gồm đố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 tiêu chuẩn. Việc tích hợp này sẽ cung cấp các điểm kiểm tra được chứng kiến, đả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 về việc đưa vào
Bạn có thể xác minh rằng một tệp APK thuộc phạm vi áp dụng trên thiết bị của bạn có trong nhật ký hay không 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 rằng ứng dụng không gặp phả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 để được chứng nhận
Trước khi tiến hành xác minh rằng cấu phần phần mềm (chương trình cơ sở hoặc APK) tuân thủ tuyên bố, hãy đảm bảo rằng các công cụ sau đây có sẵn trên một máy tính có kết nối mạng. Tuỳ thuộc vào mục tiêu xác minh, bạn có thể không cần tất cả các thông tin này.
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.24 trở lên từ trang web Go.
Cầu gỡ lỗi Android (ADB)
ADB là một công cụ giao tiếp với thiết bị Android để kiểm tra hình ảnh hoặc trích xuất APK, có trên trang web Công cụ nền tảng SDK Android.
Trình xác minh bằng chứng về việc đưa vào
Trình xác minh bằng chứng bao gồm là một mô-đun Go truy vấn nhật ký minh bạch và xuất ra thông tin cho biết liệu một cấu phần phần mềm có được đưa vào nhật ký hay không.
Công cụ này được phát hành trong kho lưu trữ GitHub android-binary-transparency tại https://github.com/android/android-binary-transparency/tree/main
Cách sao chép kho lưu trữ AOSP avb:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Cách sao chép kho lưu trữ GitHub android-binary-transparency:
computer:~$ git clone https://github.com/android/android-binary-transparency
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. Bạn có thể tìm thấy công cụ này 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.
bundletool
bundletool là một công cụ dùng để tạo Android App Bundle (AAB). Công cụ này cũng có thể được dùng để xác minh chữ ký mã APK.
Bạn có thể tải trình điều khiển này xuống từ GitHub.
wget hoặc curl
wget và curl là những công cụ có thể dùng để truy xuất hoặc tải tệp xuống từ Internet. Hãy nhớ cài đặt một trong hai công cụ này vì tập lệnh xác minh có thể dựa vào chúng.
Avbtool
avbtool được dùng để tính toán chuỗi đại diện VBMeta của hình ảnh gốc và xác minh tệp nhị phân.
Sau khi sao chép kho lưu trữ avb (như minh hoạ trong phần Trình xác minh bằng chứng bao gồm), bạn có thể tìm thấy avbtool.py trong thư mục avb đã sao chép.
Bạn nên thêm thư mục này vào biến môi trường $PATH.
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool là một tập lệnh Python dùng để giải nén từng thành phần trong bootloader.img của Pixel.
Bạn không cần quyền này nếu đang xác minh APK.
Công cụ này rất quan trọng vì cho phép avbtool.py khám phá những hình ảnh cần thiết để xác minh.
fbpacktool yêu cầu Python 3.6 trở lên và gói PyYAML (ví dụ: python3 -m pip install pyyaml).
Để sử dụng công cụ này, bạn nên tải 6 tập lệnh Python sau đây xuống thư mục chứa avbtool.py, đặt fbpacktool.py ở trạng thái có thể thực thi và tạo một liên kết tượng trưng có tên fbpacktool đến fbpacktool.py để thuận tiện.
Nếu bạn có wget:
computer:dir_to_avbtool$ wget https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py \
https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
Nếu bạn có curl:
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpacktool.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/fbpack.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/packedstruct.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlparser.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/xmlserializer.py
computer:dir_to_avbtool$ curl -LO https://developers.google.com/android/binary_transparency/tools/pixel/fbpacktool/yamlparser.py
computer:dir_to_avbtool$ chmod +x fbpacktool.py
computer:dir_to_avbtool$ ln -s fbpacktool.py fbpacktool
OpenSSL
openssl giúp thực hiện nhiều thao tác mã hoá bằng thiết bị đầu cuối trong quy trình xác minh. Đảm bảo rằng bạn đã cài đặt công cụ này trên hệ thống. Bạn có thể kiểm tra trên thiết bị đầu cuối bằng cách chạy lệnh sau và đảm bảo kết quả trả về không bị trống:
computer:~$ which openssl
/usr/bin/openssl
Tạo tải trọng để xác minh
Để xác minh tệp APK đã giải nén, bạn phải tạo một tải trọng nhật ký bằng thông tin lấy 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 tệp 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
Kết quả này cho biết một tệp APK cơ sở và một số tệp 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 chính xác của tệp APK phân tách sẽ khác nhau tuỳ thuộc vào cấu hình thiết bị của bạn.
Mỗi tệp APK phân tách đều có cùng tên gói và mã phiên bản với tệp APK cơ sở.
Tải các tệp APK trong danh sách xuống máy tính từ thiết bị Android 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 tệp APK đã tải xuống, bạn cần kiểm tra tệp kê khai (AndroidManifest.xml) của các tệp đó.
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 để lấy 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.
Kết quả 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 giá trị 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 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 kết quả làm ví dụ (bạn nên xác minh hàm băm của mọi tệp APK phân tách), tải trọng nhật ký sẽ có dạng như sau:
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
Hãy đả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 đưa vào)
Sau khi tạo tải trọng, giờ đây, bạn có thể kiểm tra xem gói có trong nhật ký minh bạch hay không. Tạo công cụ bằng chứng 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 (từ 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 đó được Google xuất bản.
Lệnh này xuất ra stderr:
OK. inclusion check success!nếu gói được đưa vào nhật ký.FAILUREnếu không.
Tự động xác minh tất cả các gói trên một thiết bị
Do số lượng ứng dụng Google có thể được cài đặt trước trên thiết bị của bạ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 tẻ nhạt.
Chúng tôi cung cấp một công cụ tự động khác có tên là Uraniborg 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 kết quả trực tiếp cho công cụ verifier, giú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ị chỉ trong một bước.
Để sử dụng quy trình làm việc 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ó trong kho lưu trữ android-binary-transparency.
Chạy tập lệnh automate_observation.py 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 mà tập lệnh chỉ định.
Bên trong, 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 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ý.