บิลด์ที่ทำซ้ำได้สร้างความเชื่อมโยงที่ตรวจสอบได้ระหว่างซอร์สโค้ดที่เผยแพร่กับไบนารีของรุ่นที่ปล่อยออกมา ปัจจุบันขอบเขตบิลด์ที่ทำซ้ำได้ของเราครอบคลุมรุ่น F-Droid บน Android เราตั้งใจจะขยายขอบเขตนี้ไปยังช่องทางการเผยแพร่อื่น ๆ ทั้งบน Android และ iOS

Android

F-Droid

Gem Wallet ใช้โครงสร้างพื้นฐานการบิลด์ของ F-Droid ที่เป็นอิสระ เพื่อบิลด์ F-Droid APK ขึ้นใหม่และตรวจสอบก่อนการเผยแพร่

โมเดลการตรวจสอบ

Gem Wallet เผยแพร่ F-Droid APK ที่ลงลายเซ็นแล้วสำหรับแต่ละรุ่น ในขณะเดียวกัน เซิร์ฟเวอร์บิลด์ของ F-Droid จะรันสูตรบิลด์สาธารณะจากสภาพแวดล้อมที่สะอาดแยกต่างหาก ดังนี้

  1. ข้อมูลเมตาของ F-Droid กำหนดคอมมิต Git ที่แน่นอนและเวอร์ชันของ Android NDK
  2. F-Droid เช็กเอาต์คอมมิตดังกล่าวจากคลังโค้ด Gem Wallet ที่เป็นสาธารณะ
  3. สคริปต์บิลด์ที่ทำซ้ำได้ ซึ่งเป็นสาธารณะจะติดตั้ง toolchain แบบเนทีฟที่ตรึงเวอร์ชันไว้ และรัน :app:assembleFdroidRelease
  4. การบิลด์จะได้ APK ที่ยังไม่ได้ลงลายเซ็น F-Droid จะดาวน์โหลด APK ที่นักพัฒนาลงลายเซ็นไว้ซึ่งตรงกัน และยืนยันว่าถูกลงลายเซ็นด้วยลายนิ้วมือใบรับรอง (certificate fingerprint) ที่ประกาศไว้ใน AllowedAPKSigningKeys
  5. F-Droid คัดลอกลายเซ็น APK ไปยังอาร์ติแฟกต์ที่บิลด์ขึ้นใหม่และตรวจสอบลายเซ็นนั้น ลายเซ็นตามมาตรฐาน Android APK Signature Scheme v2/v3 ครอบคลุม APK ทั้งหมดนอกบล็อกลายเซ็น ดังนั้นการตรวจสอบจะสำเร็จได้ก็ต่อเมื่อเพย์โหลดของ APK ที่บิลด์ขึ้นใหม่ตรงกับรุ่นของ Gem Wallet แบบไบต์ต่อไบต์
  6. F-Droid เผยแพร่ APK ที่นักพัฒนาลงลายเซ็นไว้เฉพาะเมื่อการตรวจสอบสำเร็จเท่านั้น รุ่นที่ไม่สามารถทำซ้ำได้จะไม่ถูกเผยแพร่

การควบคุมบิลด์แบบดีเทอร์มินิสติก

Gem Wallet มีไลบรารีเนทีฟที่เขียนด้วย Rust ทำให้ผลลัพธ์อ่อนไหวต่อความแตกต่างของคอมไพเลอร์ ลิงเกอร์ NDK แพลตฟอร์มโฮสต์ และออปติไมเซอร์ การบิลด์ของ F-Droid ควบคุมอินพุตเหล่านี้โดย

  • ตรึงเวอร์ชันของ Rust toolchain และ cargo-ndk ไว้ใน android/reproducible/versions.sh
  • ติดตั้ง cargo-ndk ด้วย --locked ขณะที่ dependency ภาษา Rust ของแอปพลิเคชันถูกกำหนดโดย Cargo.lock ที่คอมมิตไว้
  • ตรึงรุ่นของ Android NDK ที่แน่นอนทั้งในโปรเจกต์ Android และในข้อมูลเมตาของ F-Droid
  • บิลด์บนโฮสต์ Linux x86_64 พร้อมระบุพาธของลิงเกอร์และอาร์ไคเวอร์ของ NDK อย่างชัดเจน
  • จำกัดเป้าหมาย APK แบบเนทีฟไว้ที่ armeabi-v7a และ arm64-v8a โดยไม่ขึ้นกับโฮสต์บิลด์ x86_64
  • ใช้ช่องทางผลิตภัณฑ์ fdroid โดยเฉพาะ ซึ่งไม่มีโมดูลพุชและรีวิวของ Google
  • ปิดการออปติไมซ์ของ R8 ด้วย -dontoptimize เพื่อป้องกันผลลัพธ์ DEX และตัวระบุ mapping ที่ไม่ดีเทอร์มินิสติก
  • รัน Gradle โดยไม่ใช้ daemon หรือ configuration cache และล้าง transformation cache ก่อนการบิลด์รุ่นเผยแพร่

คอมมิตต้นทางที่แน่นอน คำสั่งบิลด์ พาธของผลลัพธ์ รุ่นของ NDK, URL ของ APK ต้นทาง และใบรับรองการลงลายเซ็นที่อนุญาต เปิดเผยต่อสาธารณะในข้อมูลเมตาของ F-Droid ส่วนสคริปต์ที่กำหนดค่า Rust, Cargo, toolchain ของ NDK และ Gradle ได้รับการดูแลควบคู่กับซอร์สโค้ดของแอปพลิเคชันภายใต้ android/reproducible

คุณสมบัติด้านความปลอดภัยและข้อจำกัด

การตรวจสอบของ F-Droid ที่สำเร็จแสดงให้เห็นว่า APK ที่ลงลายเซ็นซึ่ง Gem Wallet เผยแพร่สามารถทำซ้ำได้จากคอมมิตต้นทางและสูตรบิลด์ที่ประกาศไว้ การบิลด์ใหม่นี้ดำเนินการนอกโครงสร้างพื้นฐานของ Gem Wallet จึงลดการพึ่งพาไปป์ไลน์การปล่อยรุ่นของเราในฐานะจุดความเชื่อถือเพียงจุดเดียว

ความสามารถในการทำซ้ำไม่ได้พิสูจน์ว่าซอร์สโค้ดปราศจากช่องโหว่ ว่า dependency ทุกตัวน่าเชื่อถือ หรือว่า toolchain ของคอมไพเลอร์ที่เลือกใช้ปลอดจากการถูกแทรกแซง ความเสี่ยงเหล่านี้ต้องอาศัยการตรวจสอบซอร์สโค้ด การควบคุม dependency และความปลอดภัยของ toolchain ควบคู่ไปกับบิลด์ที่ทำซ้ำได้

สถานะการบิลด์และรุ่นที่ผ่านการตรวจสอบดูได้ที่หน้า F-Droid ของ Gem Wallet

Universal APK และ Google Play

Universal APK ของ Gem Wallet และรุ่นบน Google Play ยังไม่อยู่ในขอบเขตการตรวจสอบของ F-Droid ตามที่อธิบายไว้ข้างต้น การรองรับบิลด์ที่ทำซ้ำได้สำหรับช่องทางการเผยแพร่ Android เหล่านี้อยู่ในแผนงานในอนาคต

iOS

รุ่นบน App Store ยังไม่สามารถทำซ้ำได้ในขณะนี้ การรองรับบิลด์ที่ทำซ้ำได้สำหรับ iOS และการตรวจสอบไบนารีบน App Store อย่างอิสระอยู่ในแผนงานในอนาคต

Frequently Asked Questions

บิลด์ที่ทำซ้ำได้ช่วยให้ทุกคนสามารถบิลด์ Gem Wallet จากซอร์สโค้ดสาธารณะ และตรวจสอบได้ว่าแอปที่ได้ตรงกับรุ่นทางการ ซึ่งช่วยเพิ่มความโปร่งใส และช่วยยืนยันว่าแอปที่เผยแพร่ถูกบิลด์จากซอร์สโค้ดเดียวกันกับที่เปิดเผยบน GitHub
โอเพนซอร์สหมายความว่าซอร์สโค้ดของ Gem Wallet เปิดเผยต่อสาธารณะและทุกคนสามารถตรวจสอบได้ ส่วนบิลด์ที่ทำซ้ำได้ก้าวไปอีกขั้น โดยเปิดโอกาสให้นักพัฒนาอิสระและบริการอย่าง F-Droid สามารถบิลด์แอปจากซอร์สโค้ดที่ประกาศไว้ และตรวจสอบว่า Android APK ที่ได้ตรงกับรุ่นทางการของ Gem Wallet แบบไบต์ต่อไบต์
ได้ คุณสามารถบิลด์ทั้งแอป Android และ iOS จากซอร์สโค้ดสาธารณะของ Gem Wallet แอป Android รองรับบิลด์ที่ทำซ้ำได้โดยใช้สคริปต์บิลด์สาธารณะและ toolchain ที่ตรึงเวอร์ชันไว้ นอกจากนี้คุณยังสามารถบิลด์และรันแอป iOS ในเครื่องของคุณเองได้
สคริปต์บิลด์ที่ทำซ้ำได้ และการตั้งค่า toolchain ที่ตรึงเวอร์ชันไว้เปิดเผยต่อสาธารณะ ข้อมูลเมตาของ F-Droid ประกาศคอมมิตต้นทางที่แน่นอน รุ่นของ Android NDK คำสั่งบิลด์ และผลลัพธ์ APK ที่คาดหวังสำหรับแต่ละรุ่น F-Droid จะบิลด์แอป Android ขึ้นใหม่อย่างอิสระ และเผยแพร่ก็ต่อเมื่อเพย์โหลดของ APK ตรงกับรุ่นของ Gem Wallet แบบไบต์ต่อไบต์เท่านั้น
หากคุณมีคำถาม พบปัญหาในการบิลด์ หรือพบความไม่สอดคล้อง โปรดส่ง issue ในคลังโค้ด GitHub ของ Gem Wallet โดยแนบข้อมูลเกี่ยวกับสภาพแวดล้อมของคุณ ขั้นตอนการบิลด์ และข้อความแสดงข้อผิดพลาดที่เกี่ยวข้อง เพื่อช่วยให้เราตรวจสอบปัญหาได้