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