再現可能ビルドは、公開されたソースコードとリリースバイナリの間に検証可能なつながりを提供します。現在、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のビルドサーバーがクリーンな環境で公開ビルドレシピを次の手順で実行します。

  1. F-Droidメタデータが、使用するGitコミットとAndroid NDKバージョンを厳密に指定します。
  2. F-Droidは、公開されているGem Walletリポジトリからそのコミットをチェックアウトします。
  3. 公開されている再現可能ビルドスクリプトが、固定されたネイティブツールチェーンをインストールし、:app:assembleFdroidReleaseを実行します。
  4. ビルドは未署名のAPKを生成します。F-Droidは、対応する開発者署名済みAPKをダウンロードし、それがAllowedAPKSigningKeysで宣言された証明書フィンガープリントで署名されていることを確認します。
  5. F-Droidは、APK署名を再ビルドされた成果物にコピーし、それを検証します。Android APK Signature Scheme v2/v3の署名は、署名ブロックを除くAPK全体を対象とするため、検証が成功するには、再ビルドされたAPKのペイロードがGem Walletのリリースとバイト単位で完全に一致する必要があります。
  6. 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-v7aarm64-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バイナリの独立した検証は、今後の取り組みとして計画されています。

Frequently Asked Questions

再現可能ビルドにより、誰でも公開されているソースコードからGem Walletをビルドし、生成されたアプリが公式リリースと一致することを検証できます。これにより透明性がさらに高まり、公開されているアプリがGitHubで入手できるものと同じソースコードからビルドされたことを確認しやすくなります。
オープンソースとは、Gem Walletのソースコードが公開されており、誰でもレビューできることを意味します。再現可能ビルドはさらに一歩進んだ仕組みで、独立した開発者やF-Droidなどのサービスが、宣言されたソースコードからアプリをビルドし、生成されたAndroid APKが公式のGem Walletリリースとバイト単位で完全に一致することを検証できるようにします。
はい。AndroidアプリとiOSアプリのどちらも、公開されているGem Walletのソースコードからビルドできます。Androidアプリは、公開ビルドスクリプトと固定されたツールチェーン設定を使用した再現可能ビルドに対応しています。iOSアプリもローカルでビルドして実行できます。
再現可能ビルドスクリプトと固定されたツールチェーン設定は公開されています。F-Droidメタデータは、リリースごとに正確なソースコミット、Android NDKリビジョン、ビルドコマンド、期待されるAPK出力を宣言しています。F-DroidはAndroidアプリを独立して再ビルドし、APKのペイロードがGem Walletのリリースとバイト単位で完全に一致した場合にのみ公開します。
質問がある場合、ビルドの問題が発生した場合、または不一致を見つけた場合は、Gem WalletのGitHubリポジトリでissueを提出してください。調査に役立つように、環境、ビルド手順、関連するエラーメッセージの情報を含めてください。