再現可能ビルドは、公開されたソースコードとリリースバイナリの間に検証可能なつながりを提供します。現在、Gem Walletの再現可能ビルドの対応範囲はAndroidのF-Droidリリースです。Gem Walletは、この対応範囲をその他のAndroidおよびiOSの配布チャネルにも拡大する予定です。
Android
F-Droid
Gem Walletは、独立したF-Droidビルドインフラを利用して、F-Droid APKを再ビルドし、公開前に検証しています。
検証モデル
Gem Walletは、リリースごとに署名済みのF-Droid APKを公開します。それとは別に、F-Droidのビルドサーバーがクリーンな環境で公開ビルドレシピを次の手順で実行します。
- F-Droidメタデータが、使用するGitコミットとAndroid NDKバージョンを厳密に指定します。
- F-Droidは、公開されているGem Walletリポジトリからそのコミットをチェックアウトします。
- 公開されている再現可能ビルドスクリプトが、固定されたネイティブツールチェーンをインストールし、
:app:assembleFdroidReleaseを実行します。 - ビルドは未署名のAPKを生成します。F-Droidは、対応する開発者署名済みAPKをダウンロードし、それが
AllowedAPKSigningKeysで宣言された証明書フィンガープリントで署名されていることを確認します。 - F-Droidは、APK署名を再ビルドされた成果物にコピーし、それを検証します。Android APK Signature Scheme v2/v3の署名は、署名ブロックを除くAPK全体を対象とするため、検証が成功するには、再ビルドされたAPKのペイロードがGem Walletのリリースとバイト単位で完全に一致する必要があります。
- F-Droidは、検証が成功した場合にのみ開発者署名済みAPKを公開します。再現できないリリースは公開されません。
決定論的ビルドの制御
Gem WalletにはRust製のネイティブライブラリが含まれているため、ビルド出力はコンパイラ、リンカー、NDK、ホストプラットフォーム、オプティマイザーの違いの影響を受けやすくなっています。F-Droidビルドは、これらの入力を次の方法で制御しています。
android/reproducible/versions.shでRustツールチェーンとcargo-ndkのバージョンを固定します。cargo-ndkは--lockedを指定してインストールし、アプリケーションのRust依存関係はコミット済みのCargo.lockで解決します。- AndroidプロジェクトとF-Droidメタデータの両方で、Android NDKの正確なリビジョンを固定します。
- Linuxの
x86_64ホスト上で、NDKのリンカーとアーカイバのパスを明示的に指定してビルドします。 - ネイティブAPKのターゲットを、
x86_64のビルドホストとは無関係に、armeabi-v7aとarm64-v8aに限定します。 - Googleのプッシュおよびレビューモジュールを含まない、専用の
fdroidプロダクトチャネルを使用します。 - 非決定論的なDEX出力やマッピング識別子を防ぐため、
-dontoptimizeでR8の最適化を無効化します。 - Gradleはデーモンや構成キャッシュを使用せずに実行し、リリースビルドの前に変換キャッシュをクリアします。
正確なソースコミット、ビルドコマンド、出力パス、NDKリビジョン、アップストリームAPKのURL、許可された署名証明書は、F-Droidメタデータで公開されています。Rust、Cargo、NDKツールチェーン、Gradleを設定するスクリプトは、アプリケーションのソースコードとともにandroid/reproducible配下で管理されています。
セキュリティ特性と限界
F-Droid検証の成功は、Gem Walletが公開した署名済みAPKを、宣言されたソースコミットとビルドレシピから再現できることを実証します。再ビルドはGem Walletのインフラの外部で実行されるため、単一の信頼点としての当社のリリースパイプラインへの依存が軽減されます。
再現性は、ソースコードに脆弱性がないこと、すべての依存関係が信頼できること、選択されたコンパイラツールチェーンが侵害されていないことを証明するものではありません。これらのリスクに対処するには、再現可能ビルドに加えて、ソースコードレビュー、依存関係の管理、ツールチェーンのセキュリティが必要です。
ビルドステータスと検証済みリリースは、Gem WalletのF-Droidページで確認できます。
Universal APKとGoogle Play
Gem WalletのUniversal APKおよびGoogle Playリリースには、現時点では上記のF-Droid検証が適用されていません。これらのAndroid配布チャネルに対する再現可能ビルドのサポートは、今後の取り組みとして計画されています。
iOS
App Storeリリースは、現時点では再現可能ではありません。iOSに対する再現可能ビルドのサポートと、App Storeバイナリの独立した検証は、今後の取り組みとして計画されています。