Reprodukovatelná sestavení poskytují ověřitelnou vazbu mezi zveřejněným zdrojovým kódem a binárním souborem vydání. Naše současné pokrytí reprodukovatelnými sestaveními se vztahuje na vydání pro Android v katalogu F-Droid. Toto pokrytí hodláme rozšířit na další distribuční kanály pro Android a iOS.
Android
F-Droid
Gem Wallet využívá nezávislou sestavovací infrastrukturu F-Droid k opětovnému sestavení APK pro F-Droid a jeho ověření před zveřejněním.
Model ověřování
Gem Wallet zveřejňuje pro každé vydání podepsané APK pro F-Droid. Nezávisle na tom provádějí sestavovací servery F-Droid veřejný recept pro sestavení v čistém prostředí:
- Metadata F-Droid určují přesný commit Git a verzi Android NDK.
- F-Droid provede checkout tohoto commitu z veřejného repozitáře Gem Wallet.
- Veřejné skripty pro reprodukovatelné sestavení nainstalují zafixovaný nativní toolchain a spustí
:app:assembleFdroidRelease. - Sestavení vytvoří nepodepsané APK. F-Droid stáhne odpovídající APK podepsané vývojářem a potvrdí, že je podepsáno certifikátem, jehož otisk je deklarován v
AllowedAPKSigningKeys. - F-Droid zkopíruje podpis APK do znovu sestaveného artefaktu a ověří jej. Podpisy Android APK Signature Scheme v2/v3 pokrývají celé APK mimo podpisový blok, takže úspěšné ověření vyžaduje, aby se obsah znovu sestaveného APK bajt po bajtu shodoval s vydáním Gem Wallet.
- F-Droid zveřejní APK podepsané vývojářem pouze tehdy, když ověření uspěje. Vydání, které se nepodaří reprodukovat, není zveřejněno.
Opatření pro deterministické sestavení
Gem Wallet obsahuje nativní knihovny v jazyce Rust, což činí výstup citlivým na rozdíly v kompilátoru, linkeru, NDK, hostitelské platformě a optimalizátoru. Sestavení pro F-Droid tyto vstupy kontroluje takto:
- fixuje verze toolchainu Rust a
cargo-ndkvandroid/reproducible/versions.sh; - instaluje
cargo-ndks parametrem--locked, zatímco závislosti aplikace v jazyce Rust se řeší podleCargo.lockz repozitáře; - fixuje přesnou revizi Android NDK jak v projektu pro Android, tak v metadatech F-Droid;
- sestavuje na hostiteli Linux
x86_64s explicitně zadanými cestami k linkeru a archivátoru NDK; - omezuje nativní cílové architektury APK na
armeabi-v7aaarm64-v8a, nezávisle na sestavovacím hostitelix86_64; - používá vyhrazený produktový kanál
fdroid, bez modulů Google pro push notifikace a recenze; - vypíná optimalizaci R8 pomocí
-dontoptimize, aby se předešlo nedeterminismu ve výstupu DEX a identifikátorech mapování; - spouští Gradle bez démona a konfigurační cache a před sestavením vydání maže cache transformací.
Přesný zdrojový commit, příkazy sestavení, výstupní cesta, revize NDK, adresa URL původního APK a povolený podpisový certifikát jsou veřejně dostupné v metadatech F-Droid. Skripty, které konfigurují Rust, Cargo, toolchain NDK a Gradle, jsou udržovány spolu se zdrojovým kódem aplikace v adresáři android/reproducible.
Bezpečnostní vlastnosti a omezení
Úspěšné ověření F-Droid prokazuje, že podepsané APK, které Gem Wallet zveřejňuje, lze reprodukovat z deklarovaného zdrojového commitu a receptu pro sestavení. Opětovné sestavení probíhá mimo infrastrukturu Gem Wallet, čímž se snižuje závislost na naší release pipeline jako na jediném bodu důvěry.
Reprodukovatelnost neprokazuje, že zdrojový kód neobsahuje zranitelnosti, že každá závislost je důvěryhodná, ani že zvolený toolchain kompilátoru není kompromitován. Tato rizika vyžadují kromě reprodukovatelných sestavení také revizi zdrojového kódu, kontrolu závislostí a zabezpečení toolchainu.
Stav sestavení a ověřená vydání jsou k dispozici na stránce Gem Wallet v katalogu F-Droid.
Universal APK a Google Play
Universal APK od Gem Wallet a vydání pro Google Play nejsou v současnosti pokryty výše popsaným ověřováním F-Droid. Podpora reprodukovatelných sestavení pro tyto distribuční kanály systému Android je plánována do budoucna.
iOS
Vydání pro App Store není v současnosti reprodukovatelné. Podpora reprodukovatelných sestavení pro iOS a nezávislé ověřování binárního souboru z App Store jsou plánovány do budoucna.