재현 가능한 빌드는 공개된 소스 코드와 릴리스 바이너리 사이의 검증 가능한 연결 고리를 제공합니다. 현재 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를 다운로드하고, 해당 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 리비전을 고정합니다.
  • 명시적인 NDK 링커 및 아카이버 경로를 사용하여 Linux x86_64 호스트에서 빌드합니다.
  • 네이티브 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 저장소에 이슈를 제출해 주십시오. 문제를 조사하는 데 도움이 되도록 사용 환경, 빌드 단계, 관련 오류 메시지에 대한 정보를 포함해 주십시오.