หน้านี้สรุปวิธียืนยันว่า APK หรือ APEX ที่ติดตั้งในอุปกรณ์ Android ตรงกับการอ้างสิทธิ์ที่ระบุไว้ใน โมเดลผู้เรียกร้อง กระบวนการนี้เกี่ยวข้องกับการดึง APK จากอุปกรณ์และการดำเนินการตรวจสอบการรวมบันทึกในอาร์ติแฟกต์ที่แยกออกมา
กระบวนการยืนยัน
เราได้ใช้บันทึกความโปร่งใสด้วย Merkle Tree ที่ประกอบด้วยแฮช โหนดใบมีข้อมูล และโหนดระดับบนมีแฮชของโหนดระดับล่าง
การคำนวณพื้นฐาน 2 รายการจะยืนยันคุณสมบัติที่ป้องกันการแก้ไขของบันทึกความโปร่งใส ได้แก่ การตรวจสอบการรวมและการตรวจสอบความสอดคล้อง การตรวจสอบการรวมจะยืนยันว่าบันทึกมีรายการสำหรับ APK เวอร์ชันที่เฉพาะเจาะจง รายการบันทึกนี้มีแฮชซึ่งเป็น SHA256 Digest ของไฟล์ APK ที่ติดตั้งในอุปกรณ์ การตรวจสอบความสอดคล้องจะช่วยให้มั่นใจว่าเมื่อมีการเพิ่มรายการใหม่ จุดตรวจสอบใหม่จะยังคงสอดคล้องกับเวอร์ชันก่อนหน้าของ Tree ในเชิงเข้ารหัส (หรือ Tree ไม่ได้รับการแก้ไข) คู่มือนี้จะเน้นกระบวนการคำนวณการตรวจสอบการรวม โดยอาศัยพยานในการดำเนินการตรวจสอบความสอดคล้องกับจุดตรวจสอบล่าสุดอย่างต่อเนื่อง
หากต้องการยืนยัน APK ที่ครอบคลุม ให้ดำเนินการตรวจสอบการรวมกับจุดตรวจสอบที่มีพยาน โปรดทราบว่าเราวางแผนที่จะผสานรวมบันทึกนี้กับเครือข่ายพยานสาธารณะ โดยใช้โปรโตคอลพยานที่เป็นมาตรฐาน การผสานรวมนี้จะให้จุดตรวจสอบที่มีพยาน ซึ่งรับประกันความสอดคล้องของบันทึก
หากต้องการยืนยันว่าแอป Google ในอุปกรณ์เป็นไปตามการอ้างสิทธิ์ที่ระบุไว้ในโมเดลผู้เรียกร้อง ให้ทำตามขั้นตอนด้านล่าง
การตรวจสอบการรวม
คุณสามารถยืนยันว่า APK ที่ครอบคลุมในอุปกรณ์อยู่ในบันทึกได้โดยการแยก APK คำนวณแฮช และใช้การตรวจสอบการรวมเพื่อดูว่าแฮชนั้นมีอยู่ในจุดตรวจสอบที่เผยแพร่หรือไม่ การตรวจสอบการรวมที่สำเร็จจะช่วยลดความเสี่ยงที่อธิบายไว้ในโมเดลภัยคุกคาม ซึ่งยืนยันว่าแอปเป็นแอป Google ที่ถูกต้อง
วิธียืนยันการรวม APK ในบันทึก
คุณสามารถยืนยันแอปใดก็ตามที่อ้างว่าเป็นแอป Google ของบุคคลที่หนึ่งกับบันทึกนี้ได้
ข้อกำหนดเบื้องต้นในการยืนยัน
ก่อนดำเนินการยืนยันว่าอาร์ติแฟกต์ (เฟิร์มแวร์หรือ APK) เป็นไปตามการอ้างสิทธิ์ โปรดตรวจสอบว่าคุณมีเครื่องมือต่อไปนี้ในคอมพิวเตอร์ที่เชื่อมต่อกับเครือข่าย คุณอาจไม่จำเป็นต้องใช้เครื่องมือทั้งหมดนี้ ทั้งนี้ขึ้นอยู่กับเป้าหมายการยืนยัน
Golang
เครื่องมือยืนยัน เขียนด้วยภาษา Go หากต้องการสร้างเครื่องมือนี้ ให้ติดตั้ง Go 1.24 ขึ้นไป จากเว็บไซต์ Go
Android Debug Bridge (ADB)
ADB เป็นเครื่องมือที่สื่อสารกับอุปกรณ์ Android เพื่อตรวจสอบอิมเมจหรือ
แยก APK ซึ่งมีอยู่ในเว็บไซต์ Android SDK Platform Tools website
ตัวตรวจสอบการรวม
ตัวตรวจสอบการรวมเป็นโมดูล 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 เวอร์ชัน 26.0.2 ขึ้นไป
bundletool
bundletool เป็นเครื่องมือที่ใช้สร้าง Android App Bundle (AAB) นอกจากนี้ยังใช้เพื่อยืนยันลายเซ็นโค้ด APK ได้ด้วย
โดยดาวน์โหลดได้จาก GitHub
wget หรือ curl
wget และ curl เป็นเครื่องมือที่ใช้ดึงหรือดาวน์โหลดไฟล์จากอินเทอร์เน็ตได้ โปรดตรวจสอบว่าคุณได้ติดตั้งเครื่องมือใดเครื่องมือหนึ่งไว้ เนื่องจากสคริปต์การยืนยันอาจต้องใช้เครื่องมือเหล่านี้
Avbtool
avbtool
ใช้เพื่อคำนวณ VBMeta Digest ของอิมเมจจากโรงงานและยืนยัน
ไบนารี
หลังจากโคลนที่เก็บ 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
สร้างเพย์โหลดสำหรับการยืนยัน
หากต้องการยืนยัน APK ที่แยกออกมา คุณต้องสร้างเพย์โหลดบันทึกโดยใช้ข้อมูลที่ได้จาก APK เอง
ก่อนเริ่ม ให้เปิดใช้การแก้ไขข้อบกพร่อง USB ในอุปกรณ์เพื่ออนุญาตการเชื่อมต่อadb
จากนั้นค้นหา APK ที่ติดตั้งในอุปกรณ์ คู่มือนี้ใช้
APK ของบริการ Google Play (com.google.android.gms) เป็นตัวอย่าง
adb shell pm path com.google.android.gms
คุณควรเห็นเอาต์พุตที่คล้ายกับเอาต์พุตต่อไปนี้
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
เอาต์พุตนี้ระบุว่ามีการติดตั้ง APK หลัก 1 รายการและ APK แยก หลายรายการ
สำหรับ com.google.android.gms ในอุปกรณ์
จำนวน APK แยกที่แน่นอนจะแตกต่างกันไปตามการกำหนดค่าของอุปกรณ์
APK แยกแต่ละรายการใช้ชื่อแพ็กเกจและรหัสเวอร์ชันเดียวกันกับ APK หลัก
ดาวน์โหลด APK ที่แสดงจากอุปกรณ์ Android ลงในคอมพิวเตอร์โดยใช้คำสั่งต่อไปนี้ (โปรดทราบว่าเส้นทางไฟล์จริงอาจแตกต่างกัน)
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
หากต้องการยืนยันชื่อแพ็กเกจและเวอร์ชันของ APK ที่ดาวน์โหลด คุณต้อง
ตรวจสอบ ไฟล์ Manifest (AndroidManifest.xml)
เนื่องจากไฟล์ Manifest ภายใน APK อยู่ในรูปแบบไบนารี ให้ใช้เครื่องมือ aapt2 (ติดตั้งในขั้นตอนข้อกำหนดเบื้องต้น) เพื่อแยกและอ่านข้อมูลจาก 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'
...
คุณควรทำขั้นตอนนี้ซ้ำเพื่อรับข้อมูลที่เกี่ยวข้องจนกว่าจะพิจารณา APK แยกทั้งหมดที่ติดตั้งในอุปกรณ์แล้ว
เอาต์พุตจะยืนยันว่าชื่อแพ็กเกจของ APK คือ com.google.android.gms และหมายเลขเวอร์ชัน (versionCode) คือ 260834035
จากนั้นคำนวณแฮชเข้ารหัสของ 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
ตอนนี้คุณมีข้อมูลทั้งหมดที่จำเป็นในการสร้างเพย์โหลดบันทึก ซึ่งจัดรูปแบบ ตามที่อธิบายไว้ในส่วนเนื้อหาบันทึก เพย์โหลดบันทึกจะมีลักษณะดังนี้เมื่อเลือกแฮชรายการหนึ่งจากผลลัพธ์เป็นตัวอย่าง (คุณควรยืนยันแฮชของ APK แยกทุกรายการ)
66aa2d7b9752cdd61065b55c8e16739d8367fa18a0f1c8c84122369f86958f1a
SHA256(APK)
com.google.android.gms
260834035
ตรวจสอบว่าคุณได้ใส่อักขระขึ้นบรรทัดใหม่ที่ท้ายไฟล์ บันทึกเนื้อหานี้ลงในไฟล์ เช่น payload.txt เพื่อใช้กับเครื่องมือ verifier ในภายหลัง
การยืนยันการรวมแพ็กเกจ (การตรวจสอบการรวม)
เมื่อสร้างเพย์โหลดแล้ว ตอนนี้คุณสามารถตรวจสอบว่ามีการรวมแพ็กเกจไว้ในบันทึกความโปร่งใสหรือไม่ สร้างเครื่องมือตรวจสอบการรวมจากที่เก็บ android-binary-transparency ที่คุณโคลนไว้ก่อนหน้านี้
go build cmd/verifier/verifier.go
การดำเนินการนี้ควรส่งผลให้มีไฟล์ที่ทำงานได้ชื่อ verifier ในไดเรกทอรีนั้น
เรียกใช้ตัวตรวจสอบโดยระบุเส้นทางไปยังเพย์โหลดและระบุประเภทบันทึก
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
ตัวตรวจสอบจะใช้จุดตรวจสอบและเนื้อหาบันทึก (จากไดเรกทอรี Tile) เพื่อตรวจสอบว่าเพย์โหลด APK อยู่ในบันทึกความโปร่งใสหรือไม่ ซึ่งจะยืนยันว่า Google เป็นผู้เผยแพร่
คำสั่งจะแสดงผลไปยัง stderr ดังนี้
OK. inclusion check success!หากมีการรวมแพ็กเกจไว้ในบันทึกFAILUREหากไม่มีการรวมแพ็กเกจไว้ในบันทึก
การยืนยันแพ็กเกจทั้งหมดในอุปกรณ์โดยอัตโนมัติ
เนื่องจากอุปกรณ์ของคุณอาจมีการติดตั้งแอป Google ไว้ล่วงหน้าจำนวนมาก การแจกแจงแอปแต่ละรายการและการดำเนินการตรวจสอบการรวมทีละรายการจึงอาจเป็นเรื่องน่าเบื่อ
เรามีเครื่องมืออัตโนมัติอีกเครื่องมือหนึ่งชื่อ Uraniborg ซึ่งสามารถตรวจหาและวัดแพ็กเกจทั้งหมดที่ติดตั้งอยู่ในอุปกรณ์ของคุณในปัจจุบัน
เครื่องมือนี้จะส่งเอาต์พุตไปยังเครื่องมือ verifier โดยตรง ซึ่งช่วยให้คุณค้นพบและยืนยันความโปร่งใสของแอปทั้งหมดในอุปกรณ์ได้ในขั้นตอนเดียว
หากต้องการใช้เวิร์กโฟลว์อัตโนมัตินี้ โปรดตรวจสอบว่าอุปกรณ์ Android เชื่อมต่อกับคอมพิวเตอร์ผ่าน ADB ซอร์สโค้ด Uraniborg ยังรวมอยู่ในที่เก็บ android-binary-transparency ด้วย
เรียกใช้สคริปต์ automate_observation.py ที่อยู่ในไดเรกทอรี scripts/python
python3 automate_observation.py --pull-all-apks --perform_inclusion_proof_check --verifier_path <path_to_verifier_executable>
เมื่อสคริปต์ทำงานเสร็จ คุณควรเห็นเอาต์พุตที่คล้ายกับเอาต์พุตต่อไปนี้
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
ไปที่ไดเรกทอรีเอาต์พุตที่สคริปต์ระบุ
ค้นหาไฟล์ชื่อ packages_with_inclusion_proof_signal.txt ภายในไดเรกทอรี
ไฟล์นี้จะแสดงแพ็กเกจที่ติดตั้งแต่ละรายการพร้อมกับช่อง inclusion_proof_verified ที่ตั้งค่าเป็น true หรือ false
ค่า true บ่งชี้ว่าแพ็กเกจได้รับการยืนยันทางเข้ารหัสกับบันทึกความโปร่งใสแล้ว ซึ่งยืนยันว่าแพ็กเกจเป็นไปตามการอ้างสิทธิ์ของบันทึก