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

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

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

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

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

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

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

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

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

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

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

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

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

Android Debug Bridge (ADB)

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

AAPT2

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

bundletool

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

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

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

หากต้องการดาวน์โหลดเครื่องมือนี้ คุณต้องโคลนที่เก็บ avb ก่อน

computer:~$ git clone https://android.googlesource.com/platform/external/avb

ซอร์สโค้ดของเครื่องมือตรวจสอบอยู่ใน tools/transparency/verify ภายในที่เก็บ avb

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

หากต้องการยืนยันว่า 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 System Key Verifier) ลงในไฟล์ชื่อ 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

ตอนนี้เราพร้อมที่จะใช้คำสั่ง bundletoolcheck-transparency เพื่อ ยืนยันว่าลายเซ็นโค้ดที่ฝังอยู่ใน 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_system_apk

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

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

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