วิธีการยืนยัน

หน้านี้จะอธิบายวิธี (ที่มีความน่าเชื่อถือสูงสุด) เพื่อให้มั่นใจว่าคุณสามารถเรียกใช้รูปภาพ Pixel เวอร์ชันที่ถูกต้องตามกฎหมายในอุปกรณ์ Pixel ได้ ซึ่งต้องดาวน์โหลดอิมเมจจากโรงงานลงในคอมพิวเตอร์ และดำเนินการพิสูจน์การรวมบันทึก ในอาร์ติแฟกต์ที่ดาวน์โหลดก่อนที่จะแฟลชลงในอุปกรณ์

วิธียืนยันอิมเมจจากโรงงานของ Pixel

ข้อกำหนดเบื้องต้นในการรับการยืนยัน

ก่อนดำเนินการต่อเพื่อยืนยันว่าอาร์ติแฟกต์ (เฟิร์มแวร์หรือ APK) เป็นไปตามการกล่าวอ้าง โปรดตรวจสอบว่ามีเครื่องมือต่อไปนี้ในคอมพิวเตอร์ที่เชื่อมต่อเครือข่าย คุณอาจไม่จำเป็นต้องใช้ทั้งหมด ทั้งนี้ขึ้นอยู่กับเป้าหมายการยืนยัน

Golang

เครื่องมือยืนยัน เขียนด้วยภาษา Go หากต้องการสร้างเครื่องมือนี้ ให้ติดตั้ง Go 1.24 ขึ้นไป จากเว็บไซต์ Go

Android Debug Bridge (ADB)

ADB เป็นเครื่องมือที่สื่อสารกับอุปกรณ์ Android เพื่อตรวจสอบรูปภาพหรือ ดึง APK ซึ่งมีให้ใช้งานในเว็บไซต์เครื่องมือแพลตฟอร์ม Android SDK

เครื่องมือตรวจสอบการพิสูจน์การรวม

เครื่องมือตรวจสอบหลักฐานการรวมเป็นโมดูล Go ที่ค้นหาบันทึกความโปร่งใส และแสดงผลว่าอาร์ติแฟกต์รวมอยู่ในบันทึกหรือไม่ โดยเผยแพร่ในandroid-binary-transparencyที่เก็บ GitHub ที่ 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 เวอร์ชัน 26.0.2 ขึ้นไป

bundletool

bundletool เป็นเครื่องมือที่ใช้สร้าง Android App Bundle (AAB) นอกจากนี้ยังใช้เพื่อยืนยันลายเซ็นโค้ด APK ได้ด้วย โดยดาวน์โหลดได้จาก GitHub

wget หรือ curl

wget และ curl เป็นเครื่องมือที่ใช้ดึงหรือดาวน์โหลดไฟล์จากอินเทอร์เน็ตได้ โปรดตรวจสอบว่าได้ติดตั้งเครื่องมืออย่างใดอย่างหนึ่งต่อไปนี้ เนื่องจากสคริปต์การยืนยันอาจ ต้องใช้เครื่องมือเหล่านี้

Avbtool

avbtool ใช้เพื่อคำนวณข้อมูลสรุป VBMeta ของอิมเมจจากโรงงานและการยืนยัน ไบนารี หลังจากโคลนที่เก็บ avb (ตามที่แสดงในส่วนเครื่องมือตรวจสอบหลักฐานการรวม ) คุณจะเห็น avbtool.py ภายในไดเรกทอรี avb ที่โคลน คุณควรเพิ่มไดเรกทอรีนี้ลงในตัวแปรสภาพแวดล้อม $PATH

computer:~$ PATH=$PATH:DIRECTORY_CONTAINING_AVBTOOL

Fbpacktool

fbpacktool เป็นสคริปต์ Python ที่ใช้ในการแยกคอมโพเนนต์แต่ละรายการใน bootloader.img ของ Pixel คุณไม่จำเป็นต้องมีสิ่งนี้หากยืนยัน APK เครื่องมือนี้มีความสำคัญเนื่องจากช่วยให้ avbtool.py ค้นพบรูปภาพที่จำเป็น สำหรับการยืนยัน

หากต้องการใช้เครื่องมือนี้ คุณควรดาวน์โหลดสคริปต์ Python 3 รายการต่อไปนี้ ลงในไดเรกทอรีที่ avbtool.py อยู่ ทำให้ fbpacktool.py เรียกใช้งานได้ และสร้างลิงก์สัญลักษณ์ชื่อ fbpacktool ไปยัง fbpacktool.py เพื่อความสะดวก

หากคุณมี 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

หากคุณมี 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 ช่วยดำเนินการเข้ารหัสต่างๆ โดยใช้เทอร์มินัลในเวิร์กโฟลว์การยืนยัน ตรวจสอบว่าได้ติดตั้งไว้ในระบบแล้ว คุณตรวจสอบได้ในเทอร์มินัลโดยเรียกใช้คำสั่งต่อไปนี้และตรวจสอบว่าผลลัพธ์ที่แสดงไม่ว่างเปล่า

computer:~$ which openssl
/usr/bin/openssl

สร้างเพย์โหลดสำหรับการยืนยัน

หากต้องการยืนยันรูปภาพที่มีในอุปกรณ์หรือที่ดาวน์โหลดจากเว็บไซต์รูปภาพจากโรงงาน Pixel คุณต้องสร้างเพย์โหลดที่สอดคล้องกับรูปภาพนั้นก่อน จากลายนิ้วมือของบิลด์และข้อมูลสรุป VBMeta โดยมี 2 ตัวเลือก ได้แก่ แบบกำหนดเองหรือ แบบอัตโนมัติ ดังที่อธิบายไว้ด้านล่าง

  • รหัสเฉพาะของบิลด์: สตริงตัวระบุของอิมเมจจากโรงงาน
    • ตัวอย่าง google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
  • ไดเจสต์ VBMeta: ไดเจสต์การเข้ารหัส SHA-256 ที่เชื่อมโยงชิ้นส่วนต่างๆ ของอิมเมจจากโรงงานเข้าด้วยกัน
    • ตัวอย่าง 4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe

การสร้างเพย์โหลดด้วยตนเอง

หากต้องการสร้างเพย์โหลดสำหรับการยืนยันด้วยตนเอง คุณต้องสร้างไฟล์ข้อความ payload.txt ที่มีลายนิ้วมือของบิลด์ในบรรทัดเดียว แล้วตามด้วย สรุป VBMeta ในบรรทัดถัดไป โดยมีบรรทัดใหม่ว่างเปล่า (โปรดดูรูปแบบที่แน่นอนในส่วนเนื้อหาของบันทึก)

หลังจากทำตามขั้นตอนจากเว็บไซต์อิมเมจจากโรงงาน เนื้อหาของไฟล์ payload.txt ควรมีลักษณะดังนี้

google/oriole/oriole:12/SD1A.210817.015.A4/7697517:user/release-keys
4d5e41b7c675a821de81f7d2c744623fe808c8c2d3e19a83e894dab5d0829dbe
การแยกข้อมูลสรุป VBMeta และลายนิ้วมือของบิลด์จากเว็บไซต์ Pixel Factory Image

เมื่อดาวน์โหลดอิมเมจจากโรงงานจากเว็บไซต์อิมเมจจากโรงงานของ Pixel คุณจะต้อง คลายซิปไฟล์ที่ดาวน์โหลด ซึ่งจะสร้างโฟลเดอร์อีกโฟลเดอร์หนึ่งใน ตำแหน่งเดิม ไปที่โฟลเดอร์ที่สร้างขึ้นใหม่ แล้วคลายซิปไฟล์ image-*.zip ที่เกี่ยวข้องเพื่อรับไฟล์ *.img แต่ละไฟล์ ไบนารีเหล่านี้คือ อิมเมจพาร์ติชัน ตรวจสอบว่ามีไฟล์ vbmeta.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 แล้ว คุณจะออกคำสั่งต่อไปนี้จากเทอร์มินัลเพื่อแยกข้อมูลลายนิ้วมือของบิลด์และคำนวณค่าแฮช VBMeta ของอิมเมจจากโรงงานที่คุณเพิ่งดาวน์โหลดได้

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
การยืนยันอิมเมจจากโรงงานที่ดาวน์โหลดด้วยตนเอง

คุณจะต้อง ดาวน์โหลด fbpacktool.py และไฟล์ Python อื่นๆ อีก 2 ไฟล์ที่ขึ้นอยู่กับไฟล์นี้ (fbpack.py และ packedstruct.py) เพื่อแตกไฟล์คอมโพเนนต์ใน bootloader.img ตามที่อธิบายไว้ทีละรายการ ในโครงสร้าง VBMeta เพื่อยืนยันอิมเมจจากโรงงานที่ดาวน์โหลดมาอย่างถูกต้อง เมื่อมีโปรแกรมแยกแล้ว คุณจะใช้ fbpacktool.pyเพื่อแยกอิมเมจ Bootloader ได้ เช่น

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 ไปยังอิมเมจจากโรงงาน

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.

การเรียกใช้คำสั่งด้านบนจะดาวน์โหลดชุดรูปภาพจากโรงงาน แตกไฟล์ ชุด และยืนยันลายเซ็นของพาร์ติชันที่ลงชื่อแล้ว เมื่อการยืนยันเสร็จสมบูรณ์ ระบบจะสร้างไฟล์ใหม่ชื่อ 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 หากไม่เป็นเช่นนั้น