การยืนยันแบบเต็มเพื่อความโปร่งใสในการสมัครใช้ผลิตภัณฑ์ของ Google

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

กระบวนการยืนยันตัวตน

ระบบจะใช้บันทึกความโปร่งใสกับต้นไม้ Merkle ที่ประกอบด้วยแฮช โหนดใบมีข้อมูล และโหนดหลักมีแฮชของโหนดลูก

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

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

หากต้องการยืนยันว่าแอป Google ในอุปกรณ์เป็นไปตามการกล่าวอ้างใน รูปแบบผู้กล่าวอ้าง ให้ทำตามขั้นตอนด้านล่าง

หลักฐานการรวม

คุณสามารถยืนยันว่า APK ที่ครอบคลุมในอุปกรณ์อยู่ในบันทึกได้โดยการแยก APK คำนวณแฮช และใช้หลักฐานการรวมเพื่อตรวจสอบว่าแฮชนั้น มีอยู่ในจุดตรวจสอบที่เผยแพร่หรือไม่ หลักฐานการรวมที่สำเร็จจะช่วย รับประกันความเสี่ยงที่อธิบายไว้ในโมเดลภัยคุกคาม ซึ่งยืนยันว่าแอป เป็นแอป Google ที่ถูกต้อง

วิธียืนยันการรวม APK ในบันทึก

แอปใดก็ตามที่อ้างว่าเป็นแอป Google ที่เป็นบุคคลที่หนึ่งจะได้รับการยืนยันจากบันทึกนี้

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

ก่อนยืนยัน APK ที่แยกออกมา คุณควรติดตั้งเครื่องมือต่อไปนี้ในคอมพิวเตอร์

Android Debug Bridge (ADB)

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

AAPT2

AAPT2 (Android Asset Packaging Tool) เป็นเครื่องมือบิลด์ที่ใช้ในการคอมไพล์และ แพ็กเกจทรัพยากรของแอป Android โดยมีให้ใช้งานเป็นเครื่องมือแบบสแตนด์อโลนในเครื่องมือสร้าง Android SDK 26.0.2 ขึ้นไป

Golang

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

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

เราเผยแพร่โมดูล Go ที่ชื่อ verifier ในที่เก็บ GitHub ของ android-binary-transparency เครื่องมือนี้จะค้นหาบันทึกความโปร่งใสของ APK ของบุคคลที่หนึ่งของ Google เพื่อตรวจสอบว่ามีแพ็กเกจรวมอยู่หรือไม่

หากต้องการใช้เครื่องมือนี้ ให้โคลนที่เก็บไปยังคอมพิวเตอร์ของคุณก่อน

git clone https://github.com/android/android-binary-transparency

ซอร์สโค้ดของเครื่องมือตรวจสอบจะอยู่ในที่เก็บ android-binary-transparency

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

หากต้องการยืนยัน 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

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

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