Builds reproduzíveis fornecem um vínculo verificável entre o código-fonte publicado e o binário de uma versão. Nossa cobertura atual de builds reproduzíveis se aplica à versão do F-Droid para Android. Pretendemos expandir essa cobertura para outros canais de distribuição do Android e do iOS.
Android
F-Droid
A Gem Wallet usa a infraestrutura de build independente do F-Droid para recompilar o APK do F-Droid e verificá-lo antes da publicação.
Modelo de verificação
A Gem Wallet publica um APK do F-Droid assinado para cada versão. Separadamente, os servidores de build do F-Droid executam a receita pública de build a partir de um ambiente limpo:
- Os metadados do F-Droid selecionam um commit exato do Git e uma versão exata do NDK do Android.
- O F-Droid obtém esse commit do repositório público da Gem Wallet.
- Os scripts públicos de build reproduzível instalam a toolchain nativa fixada e executam
:app:assembleFdroidRelease. - A build produz um APK não assinado. O F-Droid baixa o APK correspondente assinado pelo desenvolvedor e confirma que ele está assinado pelo certificado cuja impressão digital está declarada em
AllowedAPKSigningKeys. - O F-Droid copia a assinatura do APK para o artefato recompilado e o verifica. As assinaturas do APK Signature Scheme v2/v3 do Android cobrem o APK completo fora do bloco de assinatura, de modo que uma verificação bem-sucedida exige que o conteúdo do APK recompilado corresponda byte a byte à versão publicada da Gem Wallet.
- O F-Droid publica o APK assinado pelo desenvolvedor somente quando a verificação é bem-sucedida. Uma versão que não se reproduz não é publicada.
Controles de build determinística
A Gem Wallet inclui bibliotecas nativas em Rust, o que torna o resultado sensível a diferenças de compilador, linker, NDK, plataforma host e otimizador. A build do F-Droid controla essas entradas da seguinte forma:
- fixando as versões da toolchain do Rust e do
cargo-ndkemandroid/reproducible/versions.sh; - instalando o
cargo-ndkcom--locked, enquanto as dependências Rust do aplicativo são resolvidas peloCargo.lockversionado no repositório; - fixando a revisão exata do NDK do Android tanto no projeto Android quanto nos metadados do F-Droid;
- compilando em um host Linux
x86_64com caminhos explícitos do linker e do arquivador do NDK; - restringindo os alvos nativos do APK a
armeabi-v7aearm64-v8a, independentemente do host de buildx86_64; - usando o canal de produto dedicado
fdroid, sem os módulos de notificações push e de avaliações do Google; - desativando a otimização do R8 com
-dontoptimizepara evitar saída DEX e identificadores de mapeamento não determinísticos; - executando o Gradle sem o daemon ou o cache de configuração e limpando os caches de transformação antes da build de lançamento.
O commit exato do código-fonte, os comandos de build, o caminho de saída, a revisão do NDK, a URL do APK upstream e o certificado de assinatura permitido são públicos nos metadados do F-Droid. Os scripts que configuram o Rust, o Cargo, a toolchain do NDK e o Gradle são mantidos junto com o código-fonte do aplicativo em android/reproducible.
Propriedades de segurança e limitações
Uma verificação bem-sucedida do F-Droid demonstra que o APK assinado publicado pela Gem Wallet pode ser reproduzido a partir do commit de código-fonte e da receita de build declarados. A recompilação é realizada fora da infraestrutura da Gem Wallet, o que reduz a dependência do nosso pipeline de lançamento como ponto único de confiança.
A reprodutibilidade não prova que o código-fonte esteja livre de vulnerabilidades, que cada dependência seja confiável ou que a toolchain de compilação selecionada não tenha sido comprometida. Esses riscos exigem revisão do código-fonte, controles de dependências e segurança da toolchain, além das builds reproduzíveis.
O status das builds e as versões verificadas estão disponíveis na página da Gem Wallet no F-Droid.
Universal APK e Google Play
O APK universal da Gem Wallet e a versão do Google Play atualmente não são cobertos pela verificação do F-Droid descrita acima. O suporte a builds reproduzíveis para esses canais de distribuição do Android está planejado como trabalho futuro.
iOS
A versão da App Store atualmente não é reproduzível. O suporte a builds reproduzíveis para iOS e a verificação independente do binário da App Store estão planejados como trabalho futuro.