การยืนยันความโปร่งใสของ APK บริการระบบของ Google อย่างเต็มรูปแบบ

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

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

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

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

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

หากต้องการตรวจสอบว่า APK ที่คุณมีในอุปกรณ์เป็นไปตามการกล่าวอ้างที่ระบุไว้ในโมเดลผู้กล่าวอ้างหรือไม่ โปรดดูรายละเอียดด้านล่าง

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

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

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

ดังที่อธิบายไว้ก่อนหน้านี้ คุณสามารถดูรายการ APK ที่ครอบคลุมในปัจจุบันได้ในหน้าภาพรวม

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

ก่อนดำเนินการต่อเพื่อยืนยันว่าอาร์ติแฟกต์ (เฟิร์มแวร์หรือ 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

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

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

ก่อนเริ่มต้นใช้งาน โปรดตรวจสอบว่าadbใช้ในอุปกรณ์ได้โดยเปิดใช้การแก้ไขข้อบกพร่องของ adb ในอุปกรณ์

จากนั้นค้นหาตำแหน่งที่ติดตั้ง APK ในอุปกรณ์ สำหรับวัตถุประสงค์ของคำแนะนำนี้ เราจะใช้ APK ของโปรแกรมตรวจสอบคีย์ของระบบ Android (com.google.android.contactkeys) เป็นตัวอย่างการทำงาน

computer:~$ adb shell pm list packages -f | grep contactkeys
package:/data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk=com.google.android.contactkeys

หากติดตั้ง APK ของโปรแกรมตรวจสอบคีย์ของระบบ Android ในอุปกรณ์ คำสั่งด้านบนจะแสดง เส้นทางที่ระบุตำแหน่งที่ติดตั้งในอุปกรณ์ ไม่เช่นนั้น คุณจะไม่เห็นเอาต์พุตใดๆ

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

computer:~$ mkdir -p /tmp/testdir && cd /tmp/testdir
computer:/tmp/testdir$ adb pull /data/app/~~i5WYSO4PuAAv798-eHdM7A==/com.google.android.contactkeys-PQCKjnn7xDqjeVhcUDibBA==/base.apk ./contactkeys_candidate.apk

หากต้องการรับและยืนยันชื่อแพ็กเกจของ APK ที่คุณเพิ่งดาวน์โหลด คุณจะต้องคลายซิป APK ก่อน เนื่องจาก APK เป็นไฟล์ ZIP ชนิดพิเศษ

computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/

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

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

computer:/tmp/testdir$ aapt2 dump badging ./contactkeys_candidate.apk
package: name='com.google.android.contactkeys' versionCode='7805' versionName='1.219.791156583' platformBuildVersionName='Baklava' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='Baklava'

จากเอาต์พุตด้านบน เรามั่นใจได้ว่าชื่อแพ็กเกจของ APK นี้คือ com.google.android.contactkeys และหมายเลขเวอร์ชัน (versionCode) คือ 1413

ตอนนี้เราจะค้นหาลายเซ็นความโปร่งใสของโค้ดภายใน APK โดยควรเป็นไฟล์ชื่อ code_transparency_signed.jwt ที่อยู่ในโฟลเดอร์ META-INF ท่ามกลางไฟล์อื่นๆ ที่แยกออกมาจาก APK

computer:/tmp/testdir$ sha256sum extracted/META-INF/code_transparency_signed.jwt
1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11  code_transparency_signed.jwt

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

1779a2aee029112c2c9bfc9390b9678f3e5f4595b39705e8528dd522e8042f11
SHA256(Signed Code Transparency JWT)
com.google.android.contactkeys
1143

นอกจากนี้ โปรดสังเกตอักขระขึ้นบรรทัดใหม่หลังเวอร์ชันของแพ็กเกจ

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

ยืนยันความถูกต้องของลายเซ็นโค้ด APK

ตอนนี้เราควรยืนยันความถูกต้องของโทเค็นลายเซ็นโค้ด ที่ฝังอยู่ใน APK โดยเราใช้ bundletool และคีย์สาธารณะของคู่คีย์ที่ใช้ลงนามในตอนแรก โดยจะเผยแพร่ภายในแต่ละส่วนของ APK ที่เกี่ยวข้อง สมมติว่าคุณได้บันทึกใบรับรองคีย์สาธารณะ (เช่น สำหรับโปรแกรมตรวจสอบคีย์ของระบบ Android) ลงในไฟล์ชื่อ signing_cert_pubkey.pem แล้ว ให้ทำตามคำแนะนำด้านล่างเพื่อยืนยันลายเซ็นของโค้ด

ก่อนอื่น คุณควรสร้างไฟล์เก็บถาวร ZIP แล้วเพิ่ม APK ที่ต้องการลงในไฟล์เก็บถาวร ZIP

computer:/tmp/testdir$ zip -u test.zip contactkeys_candidate.apk
        zip warning: test.zip not found or empty
  adding: contactkeys_candidate.apk (deflated 58%)

computer:/tmp/testdir$ file test.zip
test.zip: Zip archive data, at least v2.0 to extract, compression method=deflate

ตอนนี้เราพร้อมที่จะใช้คำสั่ง check-transparency ของ bundletool เพื่อ ยืนยันว่าลายเซ็นโค้ดที่ฝังอยู่ใน APK ที่เป็นตัวเลือกตรงกับลายเซ็นโค้ดที่ เผยแพร่หรือไม่

computer:/tmp/testdir$ java -jar BUNDLETOOL_INSTALL_PATH/bundletool-all-version.jar check-transparency \
  --mode=apk \
  --apk-zip=test.zip \
  --transparency-key-certificate=signing_cert_pubkey.pem

APK signature is valid. SHA-256 fingerprint of the apk signing key certificate (must be compared with the developer's public key manually): D9 E1 73 5B 2A 39 51 27 3A 87 35 B7 66 9E F1 9E F5 3A F1 C1 27 5C BA 31 39 3C 18 40 8B 03 79 D0
Code transparency signature verified for the provided code transparency key certificate.
Code transparency verified: code related file contents match the code transparency file.

คุณควรตรวจสอบว่าเอาต์พุตของคำสั่งข้างต้นระบุว่าทั้งลายเซ็นความโปร่งใสของโค้ดและความโปร่งใสของโค้ดได้รับการ ยืนยันแล้ว หากไม่ตรงกัน เช่น หากคุณเห็นเอาต์พุตอย่าง Code transparency verification failed because the provided public key certificate does not match the transparency file แสดงว่าความสมบูรณ์ของโค้ดของ APK ที่เป็นปัญหาอาจถูก บุกรุก และคุณไม่ควรเชื่อถือ APK อย่าลืมตรวจสอบอีกครั้งว่าคุณกำลังยืนยันกับใบรับรองคีย์สาธารณะที่ถูกต้อง หากทุกอย่างเป็นไปตามที่คาดไว้ แสดงว่าระบบได้ยืนยันความถูกต้อง ของลายเซ็นโค้ดสำหรับ APK ที่คุณกำลังตรวจสอบแล้ว

การยืนยันการรวมแพ็กเกจ (หลักฐานการรวม)

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

เราได้เผยแพร่เครื่องมือพิสูจน์การรวมไว้ในavb ที่เก็บภายใน โครงการโอเพนซอร์ส Android วิธีเรียกใช้

computer:external/avb/tools/transparency/verify$ PAYLOAD_PATH=PATH_TO_PAYLOAD_DIR/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=google_1p_code

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

ระบบจะเขียนเอาต์พุตของคำสั่งไปยัง stdout

  • OK. inclusion check success! หากโค้ดของแพ็กเกจรวมอยู่ในบันทึก
  • FAILURE หากไม่เป็นเช่นนั้น