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:

  1. I metadati F-Droid selezionano un commit Git esatto e una versione esatta dell’NDK Android.
  2. F-Droid esegue il checkout di quel commit dal repository pubblico di Gem Wallet.
  3. Gli script pubblici di build riproducibile installano la toolchain nativa con versioni fissate ed eseguono :app:assembleFdroidRelease.
  4. 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.
  5. 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.
  6. 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-ndk in android/reproducible/versions.sh;
  • installando cargo-ndk con --locked, mentre le dipendenze Rust dell’applicazione vengono risolte tramite il file Cargo.lock incluso nel repository;
  • fissando la revisione esatta dell’NDK Android sia nel progetto Android sia nei metadati F-Droid;
  • compilando su un host Linux x86_64 con percorsi espliciti per il linker e l’archiver dell’NDK;
  • limitando i target nativi dell’APK ad armeabi-v7a e arm64-v8a, indipendentemente dall’host di build x86_64;
  • utilizzando il canale di prodotto dedicato fdroid, senza i moduli Google di push e review;
  • disattivando l’ottimizzazione R8 con -dontoptimize per 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.

Frequently Asked Questions

Le build riproducibili consentono a chiunque di compilare Gem Wallet dal codice sorgente pubblico e di verificare che l’app risultante corrisponda alla release ufficiale. Questo offre ulteriore trasparenza e aiuta a confermare che l’app pubblicata è stata compilata dallo stesso codice sorgente disponibile su GitHub.
Open source significa che il codice sorgente di Gem Wallet è disponibile pubblicamente e può essere esaminato da chiunque. Le build riproducibili fanno un passo in più: consentono a sviluppatori indipendenti e a servizi come F-Droid di compilare l’app dal codice sorgente dichiarato e di verificare che l’APK Android risultante corrisponda byte per byte alla release ufficiale di Gem Wallet.
Sì. Può compilare sia l’app Android sia l’app iOS dal codice sorgente pubblico di Gem Wallet. L’app Android supporta le build riproducibili tramite gli script di build pubblici e la toolchain con versioni fissate. Può anche compilare ed eseguire l’app iOS in locale.
Gli script di build riproducibile e la configurazione della toolchain con versioni fissate sono pubblici. I metadati F-Droid dichiarano per ogni release il commit sorgente esatto, la revisione dell’NDK Android, i comandi di build e l’APK atteso in output. F-Droid ricompila l’app Android in modo indipendente e la pubblica solo quando il contenuto dell’APK corrisponde byte per byte alla release di Gem Wallet.
Se ha una domanda, incontra un problema di build o riscontra una discrepanza, apra una issue nel repository GitHub di Gem Wallet. Includa informazioni sul suo ambiente, sui passaggi di build e su eventuali messaggi di errore rilevanti per aiutarci a esaminare il problema.