Відтворювані збірки забезпечують перевірюваний зв’язок між опублікованим вихідним кодом і бінарним файлом релізу. Наразі відтворювані збірки охоплюють реліз для 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. Додайте інформацію про ваше середовище, кроки збірки та відповідні повідомлення про помилки - це допоможе нам дослідити проблему.