หน้านี้สรุปวิธีการ (ที่มีความน่าเชื่อถือสูงสุด) เพื่อให้แน่ใจว่าคุณสามารถเรียกใช้รูปภาพ Pixel เวอร์ชันที่ถูกต้องตามกฎหมายในอุปกรณ์ Pixel ได้ ซึ่ง เกี่ยวข้องกับการดาวน์โหลด Factory Image ลงในคอมพิวเตอร์ และ ทำการตรวจสอบการรวมบันทึก ในอาร์ติแฟกต์ที่ดาวน์โหลดก่อนที่จะแฟลชลงในอุปกรณ์
วิธียืนยัน Factory Image ของ Pixel
ข้อกำหนดเบื้องต้นในการยืนยัน
ก่อนดำเนินการยืนยันว่าอาร์ติแฟกต์ (เฟิร์มแวร์หรือ APK) เป็นไปตามที่กล่าวอ้าง ให้ตรวจสอบว่าคุณมีเครื่องมือต่อไปนี้ในคอมพิวเตอร์ที่เชื่อมต่อกับเครือข่าย คุณอาจไม่จำเป็นต้องใช้เครื่องมือทั้งหมดนี้ ทั้งนี้ขึ้นอยู่กับเป้าหมายการยืนยัน
Golang
เครื่องมือยืนยัน เขียนด้วยภาษา Go หากต้องการสร้างเครื่องมือนี้ ให้ติดตั้ง Go 1.24 ขึ้นไป จากเว็บไซต์ Go
Android Debug Bridge (ADB)
ADB เป็นเครื่องมือที่สื่อสารกับอุปกรณ์ Android เพื่อตรวจสอบรูปภาพหรือ
แยก APK ซึ่งมีอยู่ใน Android SDK Platform Tools เว็บไซต์
ตัวตรวจสอบการรวมบันทึก
ตัวตรวจสอบการรวมบันทึกเป็นโมดูล Go ที่ค้นหาบันทึกความโปร่งใสและแสดงผลว่ามีการรวมอาร์ติแฟกต์ไว้ในบันทึกหรือไม่
โดยเผยแพร่ในที่เก็บ GitHub android-binary-transparency ที่
https://github.com/android/android-binary-transparency/tree/main
วิธีโคลนที่เก็บ avb ของ AOSP
computer:~$ git clone https://android.googlesource.com/platform/external/avb
วิธีโคลนที่เก็บ android-binary-transparency ของ GitHub
computer:~$ git clone https://github.com/android/android-binary-transparency
AAPT2
AAPT2 (Android Asset Packaging Tool) เป็นเครื่องมือบิลด์ที่ใช้คอมไพล์และแพ็กเกจทรัพยากรของแอป Android โดยสามารถพบได้เป็นเครื่องมือแบบสแตนด์อโลนใน Android SDK Build Tools เวอร์ชัน 26.0.2 ขึ้นไป
bundletool
bundletool เป็นเครื่องมือที่ใช้สร้าง Android App Bundle (AAB) นอกจากนี้ยังใช้เพื่อยืนยันลายเซ็นโค้ด APK ได้ด้วย
โดยสามารถดาวน์โหลดได้จาก GitHub
wget หรือ curl
wget และ curl เป็นเครื่องมือที่ใช้ดึงหรือดาวน์โหลดไฟล์จากอินเทอร์เน็ตได้ โปรดตรวจสอบว่าคุณได้ติดตั้งเครื่องมืออย่างใดอย่างหนึ่งไว้ เนื่องจากสคริปต์การยืนยันอาจต้องใช้เครื่องมือเหล่านี้
Avbtool
avbtool
ใช้เพื่อคำนวณ VBMeta Digest ของ Factory Image และการยืนยัน
ไบนารี
หลังจากโคลนที่เก็บ avb (ตามที่แสดงในส่วนตัวตรวจสอบการรวมบันทึก
) คุณจะพบ avbtool.py ภายในไดเรกทอรี avb ที่โคลน
คุณควรเพิ่มไดเรกทอรีนี้ลงในตัวแปรสภาพแวดล้อม $PATH
computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL
Fbpacktool
fbpacktool
เป็นสคริปต์ Python ที่ใช้แยกคอมโพเนนต์แต่ละรายการใน
bootloader.img ของ Pixel
คุณไม่จำเป็นต้องใช้เครื่องมือนี้หากกำลังยืนยัน APK
เครื่องมือนี้มีความสำคัญเนื่องจากช่วยให้ avbtool.py ค้นพบรูปภาพที่จำเป็นสำหรับการยืนยัน
fbpacktool ต้องใช้ Python 3.6 ขึ้นไปและแพ็กเกจ
PyYAML
(เช่น python3 -m pip install pyyaml)
หากต้องการใช้เครื่องมือนี้ คุณควรดาวน์โหลดสคริปต์ Python 6 รายการต่อไปนี้
ลงในไดเรกทอรีที่ avbtool.py อยู่
ทำให้ fbpacktool.py ทำงานได้
และสร้างลิงก์สัญลักษณ์ชื่อ fbpacktool ไปยัง fbpacktool.py เพื่อความสะดวก
หากคุณมี 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
หากคุณมี 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 ช่วยดำเนินการเข้ารหัสลับต่างๆ โดยใช้เทอร์มินัลในเวิร์กโฟลว์การยืนยัน ตรวจสอบว่าได้ติดตั้ง openssl ในระบบแล้ว คุณสามารถตรวจสอบในเทอร์มินัลได้โดยเรียกใช้คำสั่งต่อไปนี้และตรวจสอบว่าผลลัพธ์ที่แสดงไม่ว่างเปล่า
computer:~$ which openssl
/usr/bin/openssl
สร้างเพย์โหลดสำหรับการยืนยัน
หากต้องการยืนยันรูปภาพในอุปกรณ์หรือรูปภาพที่ดาวน์โหลดจากเว็บไซต์ Pixel Factory Image คุณต้องสร้างเพย์โหลดที่สอดคล้องกับรูปภาพนั้นจากรหัสเฉพาะของบิลด์และ VBMeta Digest ก่อน โดยมี 2 ตัวเลือก ได้แก่ แบบกำหนดเองหรือแบบอัตโนมัติ ดังที่อธิบายไว้ด้านล่าง
- Build Fingerprint: ตัวระบุสตริงของ Factory Image
- ตัวอย่าง:
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
- ตัวอย่าง:
- VBMeta Digest: ไดเจสต์การเข้ารหัสลับ SHA-256 ที่เชื่อมโยงส่วนต่างๆ ของค่าเริ่มต้นเข้าด้วยกัน
- ตัวอย่าง:
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
- ตัวอย่าง:
การสร้างเพย์โหลดแบบกำหนดเอง
หากต้องการสร้างเพย์โหลดสำหรับการยืนยันแบบกำหนดเอง คุณต้องสร้างไฟล์ข้อความ payload.txt ที่มีรหัสเฉพาะของบิลด์ในบรรทัดหนึ่งและ VBMeta ไดเจสต์ในบรรทัดถัดไป โดยมีบรรทัดใหม่ที่ว่างเปล่า (โปรดดูรูปแบบที่แน่นอนในส่วนเนื้อหาบันทึกสำหรับรูปแบบที่แน่นอน)
หลังจากทำตามขั้นตอนจาก
เว็บไซต์ค่าเริ่มต้นแล้ว
เนื้อหาของไฟล์ payload.txt ควรมีลักษณะดังนี้
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
การแยก VBMeta Digest และ Build Fingerprint จากเว็บไซต์ Pixel Factory Image
เมื่อดาวน์โหลด Factory Image จาก
เว็บไซต์ Pixel Factory Image คุณ
จะต้องแตกไฟล์ที่ดาวน์โหลด ซึ่งจะสร้างโฟลเดอร์อื่นขึ้นมา
ไปที่โฟลเดอร์ที่สร้างขึ้นใหม่ แล้วแตกไฟล์ image-*.zip ที่เชื่อมโยงเพื่อรับไฟล์ *.img แต่ละไฟล์ ไบนารีเหล่านี้คือรูปภาพพาร์ติชัน ตรวจสอบว่ามีไฟล์ vbmeta.img อยู่ในไฟล์ img
คุณควรเห็นไฟล์ที่มีลักษณะดังนี้
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
คุณสามารถแยก รหัสเฉพาะของบิลด์ และคำนวณ VBMeta ไดเจสต์ จากไฟล์ที่ดาวน์โหลดทั้งหมดได้
หลังจากที่ avbtool.py พร้อมใช้งานใน $PATH แล้ว คุณสามารถเรียกใช้คำสั่งต่อไปนี้จากเทอร์มินัลเพื่อแยก Build Fingerprint เฉพาะอุปกรณ์และคำนวณ VBMeta Digest ของ Factory Image ที่คุณเพิ่งดาวน์โหลด
computer:dir_containing_unzipped_factory_image~$ grep -a 'ro\.product\.build\.fingerprint=google/.*/release-keys' product.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
การยืนยันค่าเริ่มต้นที่ดาวน์โหลดแบบกำหนดเอง
หากต้องการยืนยันค่าเริ่มต้นที่ดาวน์โหลดอย่างถูกต้อง คุณจะต้อง
ดาวน์โหลด
fbpacktool.py
และไฟล์ Python อื่นๆ ที่ fbpacktool.py ต้องใช้ (ดู
Fbpacktool ในข้อกำหนดเบื้องต้นสำหรับรายการทั้งหมดและคำสั่งดาวน์โหลด
) เพื่อแตกคอมโพเนนต์ใน bootloader.img ตามที่อธิบายไว้
ใน VBMeta Struct เมื่อมีตัวแตกไฟล์แล้ว คุณจะใช้ fbpacktool.py เพื่อแตก Bootloader Image ได้ เช่น
computer:dir_containing_unzipped_images$ python3 fbpacktool.py unpack bootloader-oriole-slider-1.0-7683913.img
คุณควรเห็นไฟล์ .img เพิ่มเติมปรากฏในไดเรกทอรีนั้น
ตอนนี้คุณสามารถใช้ avbtool.py เพื่อยืนยันด้วยตนเองว่าลายเซ็นของพาร์ติชันต่างๆ ตรงกัน
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
หากไม่เห็นข้อความแสดงข้อผิดพลาดหรือข้อความแสดงความล้มเหลว แสดงว่า VBMeta ของรูปภาพที่ดาวน์โหลดได้รับการยืนยันเรียบร้อยแล้ว
การสร้างเพย์โหลดอัตโนมัติ
เรายังมีสคริปต์ Python ที่คุณใช้ได้เพื่อความสะดวก เมื่อใช้เครื่องมือนี้ คุณเพียงแค่ระบุ URL ของ Factory Image แทนที่จะต้องดึงและแตกไฟล์ด้วยตนเอง
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.
การเรียกใช้คำสั่งด้านบนจะดาวน์โหลด Factory Image Bundle แตกไฟล์ Bundle และยืนยันลายเซ็นของพาร์ติชันที่ลงชื่อ เมื่อยืนยันสำเร็จแล้ว ระบบจะสร้างไฟล์ใหม่ชื่อ payload.txt และเนื้อหาของไฟล์ควรมีลักษณะคล้ายกับด้านล่าง
google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
หลังจากสร้าง payload.txt สำเร็จแล้ว คุณจะเริ่มขั้นตอนการยืนยัน การรวมรูปภาพได้
การยืนยันการรวมรูปภาพ (การรวมบันทึก)
เมื่อสร้างเพย์โหลดแล้ว ให้ตั้งค่าตัวแปรเชลล์ (เช่น $PAYLOAD_PATH) ให้ชี้ไปยังเส้นทางของเพย์โหลด
เราได้เผยแพร่เครื่องมือการพิสูจน์การรวมในที่เก็บ
avbภายในโครงการโอเพนซอร์ส Android วิธีเรียกใช้
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
ตัวตรวจสอบใช้จุดตรวจสอบและเนื้อหาบันทึก (พบได้ใน ไดเรกทอรีไทล์) เพื่อตรวจสอบว่าเพย์โหลดรูปภาพของคุณอยู่ใน บันทึกความโปร่งใส ซึ่งหมายความว่า Google เป็นผู้เผยแพร่
ระบบจะเขียนเอาต์พุตของคำสั่งลงใน stdout ดังนี้
OK. inclusion check success!หากมีการรวมรูปภาพไว้ในบันทึกFAILUREหากไม่มี