Phương pháp xác minh

Trang này trình bày một phương thức (với độ tin cậy cao nhất) để đảm bảo rằng bạn có thể chạy phiên bản hợp lệ của hình ảnh Pixel trên thiết bị Pixel. Phương thức này bao gồm việc tải hình ảnh gốc xuống máy tính và thực hiện quy trình chứng minh việc đưa nhật ký vào tạo tác đã tải xuống trước khi ghi hình ảnh đó vào thiết bị.

Cách xác minh hình ảnh gốc của Pixel

Đ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 tạo tác (firmware hoặc APK) phù hợp với nội dung xác nhận, hãy đảm bảo rằng bạn có các công cụ sau trên một 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 APK, có trên trang web Công cụ nền tảng SDK Android website.

Trình xác minh bằng chứng đưa vào

Trình xác minh bằng chứng đưa vào là một mô-đun Go truy vấn nhật ký minh bạch và cho biết liệu một tạo tác 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 một 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

wgetcurl 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ì các tập lệnh xác minh có thể dựa vào các công cụ đó.

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 đư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 tập lệnh 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 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 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 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ã hoá bằng cách sử dụ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 hình ảnh bạn có trên thiết bị hoặc một tệp tải xuống từ trang web Hình ảnh gốc của Pixel, trước tiên, bạn phải tạo tải trọng tương ứng với hình ảnh đó từ Vân tay bản dựng và Bản tóm tắt VBMeta. Có 2 lựa chọn: thủ công hoặc tự động, như mô tả bên dưới.

  • Vân tay bản dựng: Mã nhận dạng chuỗi của hình ảnh gốc
    • Ví dụ: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • Bản tóm tắt VBMeta: Bản tóm tắt mã hoá SHA-256 liên kết các phần khác nhau của hình ảnh gốc với nhau
    • Ví dụ: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Tạo tải trọng theo cách thủ công

Để tạo tải trọng theo cách thủ công cho quy trình xác minh, bạn cần tạo một tệp văn bản, payload.txt chứa vân tay bản dựng trên một dòng, sau đó là bản tóm tắt VBMeta trên dòng tiếp theo, với một dòng mới trống (vui lòng tham khảo phần Nội dung nhật ký để biết định dạng chính xác).

Sau khi làm theo các bước trên trang web Hình ảnh gốc, nội dung của tệp payload.txt sẽ có dạng như sau:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Trích xuất Bản tóm tắt VBMeta và Vân tay bản dựng từ trang web Hình ảnh gốc của Pixel

Khi tải hình ảnh gốc xuống từ trang web Hình ảnh gốc của Pixel, bạn sẽ cần giải nén tệp đã tải xuống. Thao tác này sẽ tạo một thư mục khác tại chỗ. Chuyển đến thư mục mới tạo và giải nén tệp image-*.zip được liên kết để lấy các tệp *.img riêng lẻ. Các tệp nhị phân này là hình ảnh phân vùng. Đảm bảo rằng tệp vbmeta.img tồn tại trong số các tệp img. Bạn sẽ thấy như sau:

computer:oriole-sd1a.210817.015.a4$ unzip image-oriole-sd1a.210817.015.a4.zip
Archive:  image-oriole-sd1a.210817.015.a4.zip
  inflating: android-info.txt
  inflating: boot.img
  inflating: vendor_boot.img
  inflating: system.img
  inflating: vendor.img
  inflating: product.img
  inflating: system_ext.img
  inflating: system_other.img
  inflating: dtbo.img
  inflating: vbmeta_system.img
  inflating: vbmeta.img
  inflating: super_empty.img

Bạn có thể trích xuất vân tay bản dựng và tính toán bản tóm tắt VBMeta từ tất cả các tệp đã tải xuống.

Sau khi avbtool.py được cung cấp cho $PATH, bạn có thể đưa ra các lệnh sau từ thiết bị đầu cuối để trích xuất vân tay bản dựng và tính toán bản tóm tắt VBMeta của hình ảnh gốc mà bạn vừa tải xuống:

computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\..*build\.fingerprint=google/.*/release-keys' system.img | cut -f2 -d'='
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
computer:dir_containing_unzipped_factory_image$ avbtool.py calculate_vbmeta_digest --image vbmeta.img
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
Xác minh hình ảnh gốc đã tải xuống theo cách thủ công

Để xác minh chính xác hình ảnh gốc đã tải xuống, bạn sẽ cần tải xuống fbpacktool.py và 2 tệp Python khác mà tệp này phụ thuộc vào (fbpack.pypackedstruct.py) để giải nén các thành phần trong bootloader.img, vì các thành phần này được mô tả riêng lẻ trong cấu trúc VBMeta. Sau khi có trình giải nén, bạn có thể sử dụng fbpacktool.py để giải nén hình ảnh trình tải khởi động. Ví dụ:

computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img

Bạn sẽ thấy các tệp .img bổ sung xuất hiện trong thư mục đó. Bây giờ, bạn có thể tiếp tục sử dụng avbtool.py để xác minh theo cách thủ công rằng chữ ký của các phân vùng khác nhau khớp với nhau.

computer:dir_containing_unzipped_images$ avbtool.py verify_image --image vbmeta.img --follow_chain_partitions
Verifying image vbmeta.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta.img
vbmeta_system: Chained but ROLLBACK_SLOT (which is 1) and KEY (which has sha1 df529646b7225015196a714006346f0768b87fcf) not specified
--
Verifying image vbmeta_system.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_system.img
product: Successfully verified sha256 hashtree of product.img for image of 2700468224 bytes
system: Successfully verified sha256 hashtree of system.img for image of 878493696 bytes
system_ext: Successfully verified sha256 hashtree of system_ext.img for image of 251334656 bytes
vbmeta_vendor: Chained but ROLLBACK_SLOT (which is 3) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image vbmeta_vendor.img using embedded public key
vbmeta: Successfully verified SHA256_RSA4096 vbmeta struct in vbmeta_vendor.img
vendor: Successfully verified sha256 hashtree of vendor.img for image of 472940544 bytes
boot: Chained but ROLLBACK_SLOT (which is 2) and KEY (which has sha1 85322346680a860c091fa14a64cef1fe4a3ffe31) not specified
--
Verifying image boot.img using embedded public key
vbmeta: Successfully verified footer and SHA256_RSA4096 vbmeta struct in boot.img
boot: Successfully verified sha256 hash of boot.img for image of 24481792 bytes
abl: Successfully verified sha256 hash of abl.img for image of 1744896 bytes
bl1: Successfully verified sha256 hash of bl1.img for image of 12288 bytes
bl2: Successfully verified sha256 hash of bl2.img for image of 544768 bytes
bl31: Successfully verified sha256 hash of bl31.img for image of 86016 bytes
dtbo: Successfully verified sha256 hash of dtbo.img for image of 2152234 bytes
gsa: Successfully verified sha256 hash of gsa.img for image of 262144 bytes
ldfw: Successfully verified sha256 hash of ldfw.img for image of 4096000 bytes
pbl: Successfully verified sha256 hash of pbl.img for image of 49152 bytes
tzsw: Successfully verified sha256 hash of tzsw.img for image of 4304896 bytes
vendor_boot: Successfully verified sha256 hash of vendor_boot.img for image of 25718784 bytes
vendor_dlkm: Successfully verified sha256 hashtree of vendor_dlkm.img for image of 54505472 bytes

Nếu bạn không thấy bất kỳ thông báo lỗi hoặc thông báo không thành công nào, điều này có nghĩa là VBMeta của hình ảnh đã tải xuống hiện đã được xác minh thành công.

Tạo tải trọng tự động

Để thuận tiện cho bạn, chúng tôi cũng cung cấp một tập lệnh Python mà bạn có thể sử dụng. Với công cụ này, thay vì tìm nạp và giải nén tệp theo cách thủ công, bạn chỉ cần chỉ định URL đến hình ảnh gốc.

computer:dir_to_avb_repo/tools/transparency$ python3 ./pixel_factory_image_verify.py https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Fetching file from: https://dl.google.com/dl/android/aosp/oriole-sd1a.210817.015.a4-factory-074b7f51.zip
Successfully downloaded file.
Successfully unpacked factory image.
Successfully unpacked factory image partitions.
Successfully unpacked bootloader image.
Successfully verified VBmeta.
Successfully extracted build fingerprint.
Successfully calculated VBMeta Digest.
The build fingerprint for factory image is: google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
The VBMeta Digest for factory image is: 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

A corresponding "payload.txt" file has been created.

Việc thực thi lệnh ở trên sẽ tải gói hình ảnh gốc xuống, giải nén gói và xác minh chữ ký của các phân vùng đã ký. Sau khi xác minh thành công, lệnh này sẽ tạo một tệp mới có tên payload.txt và nội dung của tệp này sẽ có dạng tương tự như bên dưới:

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

Sau khi tạo thành công payload.txt, bạn có thể bắt đầu các bước xác minh việc đưa hình ảnh vào.

Xác minh việc đưa hình ảnh vào (Bằng chứng đưa vào)

Sau khi tạo tải trọng, hãy đặt một biến shell (ví dụ: $PAYLOAD_PATH) để trỏ đến đường dẫn đến tải trọng.

Một công cụ bằng chứng đưa vào đã được xuất bản trong kho lưu trữ avb trong Dự án nguồn mở Android. Cách chạy công cụ này:

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=../payload.txt
computer:external/avb/tools/transparency/verify$ go build cmd/verifier/verifier.go
computer:external/avb/tools/transparency/verify$ ./verifier --payload_path=${PAYLOAD_PATH} --log_type=pixel

Trình xác minh sử dụng điểm kiểm tra và nội dung nhật ký (có trong thư mục ô) để kiểm tra xem tải trọng hình ảnh của bạn có trong nhật ký minh bạch hay không, tức là liệu tải trọng đó có được Google xuất bản hay không.

Kết quả của lệnh được ghi vào stdout:

  • OK. inclusion check success! nếu hình ảnh được đưa vào nhật ký,
  • FAILURE nếu không.