بیلدهای تکرارپذیر پیوندی قابلتأیید میان کد منبع منتشرشده و فایل باینری نسخه نهایی فراهم میکنند. پوشش فعلی بیلد تکرارپذیر ما شامل نسخه F-Droid برای Android است. قصد داریم این پوشش را به کانالهای توزیع دیگر Android و iOS گسترش دهیم.
Android
F-Droid
Gem Wallet از زیرساخت بیلد مستقل F-Droid برای بازسازی فایل APK نسخه F-Droid و تأیید آن پیش از انتشار استفاده میکند.
مدل تأیید
Gem Wallet برای هر نسخه یک فایل APK امضاشده F-Droid منتشر میکند. بهطور جداگانه، سرورهای بیلد F-Droid دستورالعمل بیلد عمومی را در یک محیط پاک اجرا میکنند:
- متادیتای F-Droid یک کامیت دقیق Git و نسخه Android NDK را انتخاب میکند.
- F-Droid آن کامیت را از مخزن عمومی Gem Wallet دریافت میکند.
- اسکریپتهای عمومی بیلد تکرارپذیر زنجیره ابزار بومی پینشده را نصب و
:app:assembleFdroidReleaseرا اجرا میکنند. - بیلد یک فایل APK بدون امضا تولید میکند. F-Droid فایل APK متناظر امضاشده توسط توسعهدهنده را دانلود میکند و تأیید میکند که با اثر انگشت گواهی اعلامشده در
AllowedAPKSigningKeysامضا شده است. - F-Droid امضای APK را در فایل بازسازیشده کپی میکند و آن را تأیید میکند. امضاهای Android APK Signature Scheme v2/v3 کل فایل APK خارج از بلوک امضا را پوشش میدهند؛ بنابراین موفقیت تأیید مستلزم آن است که محتوای APK بازسازیشده بایتبهبایت با نسخه Gem Wallet مطابقت داشته باشد.
- F-Droid فایل APK امضاشده توسط توسعهدهنده را تنها در صورت موفقیت تأیید منتشر میکند. نسخهای که تکرارپذیر نباشد منتشر نمیشود.
کنترلهای بیلد قطعی
Gem Wallet شامل کتابخانههای بومی Rust است و همین موضوع خروجی را نسبت به تفاوتهای کامپایلر، لینکر، NDK، پلتفرم میزبان و بهینهساز حساس میکند. بیلد F-Droid این ورودیها را از راههای زیر کنترل میکند:
- پین کردن نسخههای زنجیره ابزار Rust و
cargo-ndkدرandroid/reproducible/versions.sh؛ - نصب
cargo-ndkبا--locked، در حالی که وابستگیهای 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 یا کش پیکربندی و پاک کردن کشهای transformation پیش از بیلد نسخه نهایی.
کامیت دقیق منبع، دستورهای بیلد، مسیر خروجی، نسخه NDK، آدرس APK بالادستی و گواهی امضای مجاز همگی بهصورت عمومی در متادیتای F-Droid موجودند. اسکریپتهایی که Rust، Cargo، زنجیره ابزار NDK و Gradle را پیکربندی میکنند همراه با کد منبع برنامه در android/reproducible نگهداری میشوند.
ویژگیهای امنیتی و محدودیتها
تأیید موفق F-Droid نشان میدهد که فایل APK امضاشده منتشرشده توسط Gem Wallet را میتوان از کامیت منبع اعلامشده و دستورالعمل بیلد بازتولید کرد. بازسازی خارج از زیرساخت Gem Wallet انجام میشود و این موضوع اتکا به خط انتشار ما بهعنوان تنها نقطه اعتماد را کاهش میدهد.
تکرارپذیری ثابت نمیکند که کد منبع بدون آسیبپذیری است، همه وابستگیها قابلاعتمادند یا زنجیره ابزار کامپایلر انتخابشده از دستکاری در امان است. این ریسکها علاوه بر بیلدهای تکرارپذیر، به بازبینی کد منبع، کنترل وابستگیها و امنیت زنجیره ابزار نیاز دارند.
وضعیت بیلد و نسخههای تأییدشده در صفحه Gem Wallet در F-Droid در دسترس است.
Universal APK و Google Play
فایل Universal APK برنامه Gem Wallet و نسخه Google Play در حال حاضر تحت پوشش تأیید F-Droid توضیحدادهشده در بالا نیستند. پشتیبانی از بیلد تکرارپذیر برای این کانالهای توزیع Android در کارهای آینده برنامهریزی شده است.
iOS
نسخه App Store در حال حاضر تکرارپذیر نیست. پشتیبانی از بیلد تکرارپذیر برای iOS و تأیید مستقل باینری App Store در کارهای آینده برنامهریزی شده است.