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 bên yêu cầu. Quá trình này bao gồm việc kéo tệp APK từ thiết bị của bạn và thực hiện bằng chứng về việc đưa nhật ký vào cấu phần phần mềm đã trích xuất.
Quy trình xác minh
Nhật ký về tính minh bạch được triển khai bằng cây Merkle bao gồm các giá trị băm. Nút lá chứa dữ liệu và nút mẹ chứa giá trị 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ý về tính minh bạch: bằng chứng về việc đưa vào và bằng chứng về tính nhất quán. Bằng chứng về việc đưa vào xác nhận rằng nhật ký có chứa một mục cho phiên bản APK cụ thể. Mục nhật ký này chứa một giá trị băm, là bản tóm tắt SHA256 của tệp APK được cài đặt trên thiết bị. Bằng chứng về 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ã 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 về việc đưa vào 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 về tính nhất quán đối với các điểm kiểm tra mới nhất.
Để xác minh một tệp APK được đề cập, hãy thực hiện bằng chứng về 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ạng nhân chứng công khai bằng giao thức nhân chứng được tiêu chuẩn hoá. 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 của Google trên thiết bị của bạn tuân thủ các tuyên bố trong mô hình bên yêu cầu, 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 được đề cập trên thiết bị của bạn nằm trong nhật ký bằng cách trích xuất tệp APK, tính toán giá trị băm của tệp đó và sử dụng bằng chứng về việc đưa vào để kiểm tra xem giá trị băm đó có tồn tại trong điểm kiểm tra đã xuất bản hay không. Bằng chứng về việc đưa vào thành công sẽ đả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 hợp pháp của Google.
Cách xác minh việc đưa tệp APK vào nhật ký
Bạn có thể xác minh mọi ứng dụng tự nhận là ứng dụng của Google bên thứ nhất 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ếp tục xác minh rằng cấu phần phần mềm (firmware hoặc tệp APK) phù hợp với tuyên bố, hãy đảm bảo rằng bạn có các công cụ sau trên máy tính được kết nối vớ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 công cụ 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 tệp 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 về việc đưa vào là một mô-đun Go truy vấn nhật ký về tính minh bạch và 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.
Mô-đun này được xuất bản trong kho lưu trữ android-binary-transparency GitHub tại
https://github.com/android/android-binary-transparency/tree/main
Cách sao chép kho lưu trữ avb AOSP:
computer:~$ git clone https://android.googlesource.com/platform/external/avb
Cách sao chép kho lưu trữ android-binary-transparency GitHub:
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 các tài nguyên của ứng dụng Android. Bạn có thể tìm thấy công cụ này dưới dạng công cụ độc lập trong Bộ công cụ bản 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). Bạn cũng có thể dùng công cụ này để xác minh chữ ký mã APK.
Bạn có thể tải công cụ này xuống từ GitHub.
wget hoặc curl
wget và curl là các 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 các công cụ này, vì tập lệnh xác minh có thể dựa vào các công cụ này.
Avbtool
avbtool
được dùng để tính toán bản tóm tắt VBMeta của hình ảnh gốc và xác minh
các tệp nhị phân.
Sau khi sao chép kho lưu trữ avb (như trong phần Trình xác minh bằng chứng về việc đưa vào
section), 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 các thành phần riêng lẻ trong Pixel's
bootloader.img.
Bạn không cần công cụ này nếu đang xác minh tệp APK.
Công cụ này rất quan trọng vì cho phép avbtool.py phát hiện các hình ảnh cần thiết để xác minh.
Để sử dụng công cụ này, bạn nên tải 3 tập lệnh Python sau đây
xuống thư mục chứa avbtool.py,
thực thi fbpacktool.py,
và tạo một liên kết tượng trưng có tên là fbpacktool đến fbpacktool.py để thuận tiện.
Nếu bạn có wget:
computer:dir_to_avbtool$ wget https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py \
https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.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 -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpacktool.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/fbpack.py
computer:dir_to_avbtool$ curl -O https://source.android.com/devices/bootloader/tools/pixel/fw_unpack/packedstruct.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ật mã bằng thiết bị đầu cuối trong quy trình xác minh. Hãy đảm bảo rằng bạn đã cài đặt công cụ này trên hệ thống của mình. 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 rằng kết quả trả về không trống:
computer:~$ which openssl
/usr/bin/openssl
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 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 adb
kết nối.
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 tệp APK của
Dịch vụ Google Play (com.google.android.gms) làm ví dụ thực tế.
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 rằng 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 của thiết bị.
Mỗi tệp APK phân tách đều có cùng tên gói và mã phiên bản như tệp APK cơ sở.
Tải các tệp APK được liệt kê xuống từ thiết bị Android xuống máy tính bằng lệnh sau (lưu ý rằng đường dẫn tệp thực tế 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 tệp APK đã tải xuống, bạn cần
kiểm tra tệp kê khai (AndroidManifest.xml).
Vì tệp kê khai bên trong tệp 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ừ tệp 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 tệp 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 tệp 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 tệp 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 giá trị băm trong kết quả làm ví dụ (bạn nên xác minh giá trị 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
Đảm bảo bạn thêm ký tự dòng mới vào 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ó được đưa vào nhật ký về tính minh bạch hay không. Tạo công cụ bằng chứng về việc đưa vào 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
Lệnh này sẽ 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 trong một thiết bị
Do số lượng ứng dụng của Google có thể đượ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 bằng chứng về việc đưa vào riêng lẻ có thể tốn nhiều thời gian.
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 sẽ đưa kết quả trực tiếp vào 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ả cá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 rằng 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 được chỉ định bởi tập lệnh.
Bên trong, hãy tìm tệp có tên là 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 rằng gói đã được xác minh bằng mật mã dựa trên nhật ký về tính minh bạch, xác nhận rằng gói tuân thủ các tuyên bố của nhật ký.