Le build riproducibili forniscono un collegamento verificabile tra il codice sorgente pubblicato e il binario di una release. La nostra attuale copertura delle build riproducibili si applica alla release F-Droid per Android. Intendiamo estendere questa copertura ad altri canali di distribuzione Android e iOS.
Android
F-Droid
Gem Wallet utilizza l’infrastruttura di build indipendente di F-Droid per ricompilare l’APK F-Droid e verificarlo prima della pubblicazione.
Modello di verifica
Gem Wallet pubblica un APK F-Droid firmato per ogni release. Separatamente, i server di build di F-Droid eseguono la ricetta di build pubblica in un ambiente pulito:
- I metadati F-Droid selezionano un commit Git esatto e una versione esatta dell’NDK Android.
- F-Droid esegue il checkout di quel commit dal repository pubblico di Gem Wallet.
- Gli script pubblici di build riproducibile installano la toolchain nativa con versioni fissate ed eseguono
:app:assembleFdroidRelease. - La build produce un APK non firmato. F-Droid scarica il corrispondente APK firmato dallo sviluppatore e conferma che è firmato con l’impronta del certificato dichiarata in
AllowedAPKSigningKeys. - F-Droid copia la firma dell’APK sull’artefatto ricompilato e la verifica. Le firme Android APK Signature Scheme v2/v3 coprono l’intero APK al di fuori del blocco di firma, quindi una verifica superata richiede che il contenuto dell’APK ricompilato corrisponda byte per byte alla release di Gem Wallet.
- F-Droid pubblica l’APK firmato dallo sviluppatore solo quando la verifica ha esito positivo. Una release che non si riproduce non viene pubblicata.
Controlli per build deterministiche
Gem Wallet include librerie native Rust, il che rende il risultato sensibile alle differenze di compilatore, linker, NDK, piattaforma host e ottimizzatore. La build F-Droid controlla questi input nel modo seguente:
- fissando le versioni della toolchain Rust e di
cargo-ndkinandroid/reproducible/versions.sh; - installando
cargo-ndkcon--locked, mentre le dipendenze Rust dell’applicazione vengono risolte tramite il fileCargo.lockincluso nel repository; - fissando la revisione esatta dell’NDK Android sia nel progetto Android sia nei metadati F-Droid;
- compilando su un host Linux
x86_64con percorsi espliciti per il linker e l’archiver dell’NDK; - limitando i target nativi dell’APK ad
armeabi-v7aearm64-v8a, indipendentemente dall’host di buildx86_64; - utilizzando il canale di prodotto dedicato
fdroid, senza i moduli Google di push e review; - disattivando l’ottimizzazione R8 con
-dontoptimizeper evitare output DEX e identificatori di mapping non deterministici; - eseguendo Gradle senza daemon né cache di configurazione e svuotando le cache di trasformazione prima della build di release.
Il commit sorgente esatto, i comandi di build, il percorso di output, la revisione dell’NDK, l’URL dell’APK upstream e il certificato di firma consentito sono pubblici nei metadati F-Droid. Gli script che configurano Rust, Cargo, la toolchain NDK e Gradle sono mantenuti insieme al codice sorgente dell’applicazione in android/reproducible.
Proprietà di sicurezza e limiti
Una verifica F-Droid superata dimostra che l’APK firmato pubblicato da Gem Wallet può essere riprodotto a partire dal commit sorgente e dalla ricetta di build dichiarati. La ricompilazione avviene al di fuori dell’infrastruttura di Gem Wallet, riducendo la dipendenza dalla nostra pipeline di rilascio come unico punto di fiducia.
La riproducibilità non dimostra che il codice sorgente sia privo di vulnerabilità, che ogni dipendenza sia affidabile o che la toolchain di compilazione scelta sia esente da compromissioni. Questi rischi richiedono la revisione del codice sorgente, controlli sulle dipendenze e la sicurezza della toolchain, in aggiunta alle build riproducibili.
Lo stato delle build e le release verificate sono disponibili sulla pagina F-Droid di Gem Wallet.
Universal APK e Google Play
L’APK universale di Gem Wallet e la release su Google Play non sono attualmente coperti dalla verifica F-Droid descritta sopra. Il supporto delle build riproducibili per questi canali di distribuzione Android è in programma per il futuro.
iOS
La release dell’App Store non è attualmente riproducibile. Il supporto delle build riproducibili per iOS e la verifica indipendente del binario dell’App Store sono in programma per il futuro.