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