หน้านี้จะอธิบายวิธีการต่างๆ เพื่อให้มั่นใจว่า 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
bundletool
bundletool
เป็นเครื่องมือที่ใช้สร้าง Android App Bundle (AAB) นอกจากนี้ยังใช้แปลง AAB เป็น APK ที่ติดตั้งในอุปกรณ์ได้ด้วย
โดยดาวน์โหลดได้จาก GitHub
Androguard
Androguard คือชุดเครื่องมือที่ใช้วิเคราะห์ APK โดยสามารถดาวน์โหลดและติดตั้งได้จากเว็บไซต์ Androguard
เครื่องมือยืนยันหลักฐานการรวม
นี่คือโมดูล 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 ที่เพิ่งดาวน์โหลด คุณจะต้องแตกไฟล์ ZIP ของ APK ก่อน เนื่องจาก APK เป็นไฟล์ ZIP ประเภทพิเศษ
computer:/tmp/testdir$ mkdir extracted && unzip contactkeys_candidate.apk -d extracted/
ขั้นตอนนี้จะแตกไฟล์ทั้งหมดที่ประกอบกันเป็น APK คุณดูชื่อและเวอร์ชันของแพ็กเกจได้ใน Manifest ของ APK ซึ่งโดยปกติจะอยู่ในไฟล์ชื่อ AndroidManifest.xml
อย่างไรก็ตาม ไฟล์ Manifest ที่ได้อยู่ในรูปแบบไบนารี ซึ่งมนุษย์อ่านไม่ได้ เราใช้เครื่องมือ axml
จากชุด androguard
(ตามที่จําเป็นต้องติดตั้งในส่วนข้อกําหนดเบื้องต้น) เพื่อแปลง XML แบบไบนารีเป็นรูปแบบที่มนุษย์อ่านได้
computer:/tmp/testdir$ androguard axml extracted/AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1413" android:versionName="1.48.688082145" android:compileSdkVersion="35" android:compileSdkVersionCodename="VanillaIceCream" android:requiredSplitTypes="" android:splitTypes="" package="com.google.android.contactkeys" platformBuildVersionCode="35" platformBuildVersionName="VanillaIceCream">
จากเอาต์พุตด้านบน ตอนนี้เรามั่นใจได้ว่าชื่อแพ็กเกจของ 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_system_apk
ผู้ตรวจสอบจะใช้จุดตรวจสอบที่เกี่ยวข้องและเนื้อหาบันทึก (ดูได้ที่ไดเรกทอรีไทล์) เพื่อตรวจสอบว่าเพย์โหลด APK ของคุณอยู่ในบันทึกความโปร่งใส ซึ่งยืนยันว่า Google เป็นผู้เผยแพร่แอปดังกล่าว
ระบบจะเขียนเอาต์พุตของคำสั่งไปยัง stdout
OK. inclusion check success!
หากโค้ดของแพ็กเกจรวมอยู่ในบันทึกFAILURE
หากไม่ใช่