Les builds reproductibles établissent un lien vérifiable entre le code source publié et le binaire d’une version. Notre couverture actuelle en matière de builds reproductibles s’applique à la version F-Droid pour Android. Nous prévoyons d’étendre cette couverture à d’autres canaux de distribution Android et iOS.
Android
F-Droid
Gem Wallet utilise l’infrastructure de build indépendante de F-Droid pour recompiler l’APK F-Droid et le vérifier avant publication.
Modèle de vérification
Gem Wallet publie un APK F-Droid signé pour chaque version. De leur côté, les serveurs de build F-Droid exécutent la recette de build publique dans un environnement propre :
- Les métadonnées F-Droid sélectionnent un commit Git exact et une version exacte du NDK Android.
- F-Droid récupère ce commit depuis le dépôt public de Gem Wallet.
- Les scripts publics de build reproductible installent la chaîne d’outils native épinglée et exécutent
:app:assembleFdroidRelease. - Le build produit un APK non signé. F-Droid télécharge l’APK correspondant signé par le développeur et confirme qu’il est signé avec l’empreinte de certificat déclarée dans
AllowedAPKSigningKeys. - F-Droid copie la signature de l’APK sur l’artefact recompilé et la vérifie. Les signatures Android APK Signature Scheme v2/v3 couvrent l’intégralité de l’APK en dehors du bloc de signature, de sorte qu’une vérification réussie exige que le contenu de l’APK recompilé corresponde octet par octet à la version publiée par Gem Wallet.
- F-Droid ne publie l’APK signé par le développeur que lorsque la vérification réussit. Une version qui ne se reproduit pas n’est pas publiée.
Contrôles pour des builds déterministes
Gem Wallet intègre des bibliothèques natives Rust, ce qui rend le résultat sensible aux différences de compilateur, d’éditeur de liens, de NDK, de plateforme hôte et d’optimiseur. Le build F-Droid contrôle ces entrées de la manière suivante :
- épinglage des versions de la chaîne d’outils Rust et de
cargo-ndkdansandroid/reproducible/versions.sh; - installation de
cargo-ndkavec--locked, tandis que les dépendances Rust de l’application sont résolues via le fichierCargo.lockversionné ; - épinglage de la révision exacte du NDK Android à la fois dans le projet Android et dans les métadonnées F-Droid ;
- compilation sur un hôte Linux
x86_64avec des chemins explicites vers l’éditeur de liens et l’archiveur du NDK ; - restriction des cibles natives de l’APK à
armeabi-v7aetarm64-v8a, indépendamment de l’hôte de buildx86_64; - utilisation du canal produit dédié
fdroid, sans les modules Google de push et de review ; - désactivation de l’optimisation R8 avec
-dontoptimizeafin d’éviter une sortie DEX et des identifiants de mapping non déterministes ; - exécution de Gradle sans daemon ni cache de configuration, et purge des caches de transformation avant le build de release.
Le commit source exact, les commandes de build, le chemin de sortie, la révision du NDK, l’URL de l’APK upstream et le certificat de signature autorisé sont publics dans les métadonnées F-Droid. Les scripts qui configurent Rust, Cargo, la chaîne d’outils NDK et Gradle sont maintenus avec le code source de l’application dans android/reproducible.
Propriétés de sécurité et limites
Une vérification F-Droid réussie démontre que l’APK signé publié par Gem Wallet peut être reproduit à partir du commit source et de la recette de build déclarés. La recompilation est effectuée en dehors de l’infrastructure de Gem Wallet, ce qui réduit la dépendance à notre pipeline de publication comme unique point de confiance.
La reproductibilité ne prouve pas que le code source est exempt de vulnérabilités, que chaque dépendance est digne de confiance, ni que la chaîne d’outils de compilation retenue est exempte de toute compromission. Ces risques exigent une revue du code source, des contrôles des dépendances et la sécurisation de la chaîne d’outils, en complément des builds reproductibles.
L’état des builds et les versions vérifiées sont disponibles sur la page F-Droid de Gem Wallet.
Universal APK et Google Play
L’APK universel de Gem Wallet et la version Google Play ne sont actuellement pas couverts par la vérification F-Droid décrite ci-dessus. La prise en charge des builds reproductibles pour ces canaux de distribution Android est prévue dans le cadre de travaux futurs.
iOS
La version App Store n’est actuellement pas reproductible. La prise en charge des builds reproductibles pour iOS et la vérification indépendante du binaire de l’App Store sont prévues dans le cadre de travaux futurs.