Воспроизводимые сборки обеспечивают проверяемую связь между опубликованным исходным кодом и бинарным файлом релиза. В настоящее время воспроизводимые сборки охватывают релиз для Android в F-Droid. Мы намерены расширить этот охват на дополнительные каналы распространения для Android и iOS.

Android

F-Droid

Gem Wallet использует независимую инфраструктуру сборки F-Droid, чтобы повторно собрать APK для F-Droid и проверить его перед публикацией.

Модель проверки

Для каждого релиза Gem Wallet публикует подписанный APK для F-Droid. Отдельно от этого серверы сборки 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 контролирует эти входные данные следующим образом:

  • фиксирует версии тулчейна Rust и cargo-ndk в android/reproducible/versions.sh;
  • устанавливает cargo-ndk с флагом --locked, а Rust-зависимости приложения разрешаются по Cargo.lock из репозитория;
  • фиксирует точную ревизию Android NDK как в Android-проекте, так и в метаданных F-Droid;
  • выполняет сборку на хосте Linux x86_64 с явно заданными путями к компоновщику и архиватору NDK;
  • ограничивает нативные целевые архитектуры APK значениями armeabi-v7a и arm64-v8a независимо от сборочного хоста x86_64;
  • использует выделенный продуктовый канал fdroid без модулей push-уведомлений и отзывов Google;
  • отключает оптимизацию R8 с помощью -dontoptimize, чтобы исключить недетерминированность DEX-вывода и идентификаторов маппинга;
  • запускает Gradle без демона и кеша конфигурации, а также очищает кеши трансформаций перед релизной сборкой.

Точный коммит исходного кода, команды сборки, путь к выходному файлу, ревизия NDK, URL оригинального APK и разрешенный сертификат подписи общедоступны в метаданных F-Droid. Скрипты, которые настраивают Rust, Cargo, тулчейн NDK и Gradle, поддерживаются вместе с исходным кодом приложения в каталоге android/reproducible.

Свойства безопасности и ограничения

Успешная проверка F-Droid демонстрирует, что подписанный APK, опубликованный Gem Wallet, можно воспроизвести из заявленного коммита исходного кода и рецепта сборки. Повторная сборка выполняется вне инфраструктуры Gem Wallet, что снижает зависимость от нашего релизного конвейера как единой точки доверия.

Воспроизводимость не доказывает, что исходный код свободен от уязвимостей, что каждая зависимость заслуживает доверия или что выбранный тулчейн компилятора не скомпрометирован. Эти риски требуют ревью исходного кода, контроля зависимостей и безопасности тулчейна в дополнение к воспроизводимым сборкам.

Статус сборок и проверенные релизы доступны на странице Gem Wallet в F-Droid.

Universal APK и Google Play

Universal APK от Gem Wallet и релиз в 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.
Если у вас есть вопрос, возникла проблема со сборкой или вы обнаружили расхождение, создайте issue в репозитории Gem Wallet на GitHub. Укажите информацию о вашем окружении, шагах сборки и соответствующих сообщениях об ошибках - это поможет нам разобраться в проблеме.