Контроль целостности
В целях исключения рисков модификации исполняемого кода SDK и разработанного с его использованием мобильного приложения предусмотрен механизм контроля целостности, включающий в себя следующие этапы.
1. Реализация контроля целостности при встраивании SDK в мобильное приложение - выполняется разработчиком собственного мобильного приложения.
2. Проведение контроля целостности после публикации приложения - выполняется разработчиком мобильного приложения (испытательной лабораторией).
3. Проверка целостности приложения, устанавливаемого конечным пользователям - выполняется Администратором (безопасности) или конечным пользователем.
Реализация контроля целостности при встраивании SDK в мобильное приложение
Контроль целостности обеспечивается средствами встраиваемого в мобильное приложение СКЗИ «КриптоПро CSP» на двух уровнях:
- для встраиваемого СКЗИ «КриптоПро CSP» и *.so-библиотек приложения;
- для всего исполняемого кода МП.
Примечание
В случае ошибки при тестировании или обнаружения нарушения целостности вызывающее приложение должно заблокировать возможность последующего использования криптографических функций и сообщить пользователю о нарушении целостности.
Вычисление контрольных эталонных сумм приложения
Для выполнения контроля целостности требуется, чтобы Ключ SDK был успешно инициализирован,
а также чтобы в папке \res\raw
приложения находились следующие файлы:
- поставляемые вместе с SDK файлы с хэшами нативных so-библиотек для каждой из ABI в формате digests** и extra;
- файл
dexdigests
c самостоятельно рассчитанными хэшами файловclassesN.dex
собранного APK/AAB приложения.
Файл dexdigests
должен содержать пары значений = по числу dex-файлов, например:
classes.dex=4E4DB45628502E8F0ABCA3088C166ECA32ED009A611AAE93B33B48E26479E674
classes2.dex=33F01BDBA8EA0888E07EA0EAD45D17F345A5A724DEAF181CD9132E0AB52A6F96
На момент сборки файла APK/AAB в ресурсах проекта «src\main\res\raw» должен быть файл-заглушка dexdigests, например:
mkdir -p myapp-example/src/main/res/raw
touch myapp-example/src/main/res/raw/dexdigests
mkdir -p myapp-example-jni-kt/src/main/res/raw
touch myapp-example-jni-kt/src/main/res/raw/dexdigests
Он нужен для генерации ID ресурса и доступа к нему в коде.
Хэш отдельного dex-файла на алгоритме ГОСТ 34.11-2012 (256) можно рассчитать с помощью утилиты cpverify из дистрибутива КриптоПро CSP для Windows/*nix, например:
cpverify -mk classes.dex -alg GR3411_2012_256
Рассчитать хэш нужно для каждого файла dex.
Добавить файл dexdigests в собранный APK/AAB можно, например, следующим образом:
- распаковать имеющийся APK/AAB;
- в случае APK - извлечь его dex-файлы в папку, в случае AAB - извлечь из base/dex dex-файлы в папку;
- с помощью cpverify вычислить хэш каждого файла, как описано выше:
cpverify -mk classes.dex -alg GR3411_2012_256
- последовательно добавить в файл dexdigests хэш с сохранением имени файла в виде пары =, например:
classes.dex=4E4DB45628502E8F0ABCA3088C166ECA32ED009A611AAE93B33B48E26479E674
- поместить полученный dexdigests в имеющийся архив APK/AAB по пути «/res/raw/dexdigests» в случае APK и «/base/res/raw/dexdigests» в случае AAB, например:
zip -ur myapp-example.apk res/raw/dexdigests
- подписать измененный APK/AAB. В случае APK выполняется выравнивание с помощью zipalign и затем подпись с помощью apksigner, например:
zipalign -p -f 4 myapp-example.apk
apksigner sign --ks <keystore> --ks-key-alias <alias> --ks-pass pass:<password> --key-pass pass:<password> --v3-signing-enabled false --v1-signing-enabled false myapp-example.apk
В случае AAB - подпись с помощью jarsigner и выравнивание с помощью zipalign, например:
jarsigner -keystore <keystore> -storepass <password> -keypass <password> myapp-example.aab <alias>
zipalign -p -f 4 myapp-example.aab
Пусковой контроль
Пусковой контроль целостности выполняется при запуске приложения. Необходимо
вызвать метод checkIntegrity
при запуске собственного мобильного приложения для проверки
контрольной суммы приложения.
Регламентный контроль
Для выполнения предъявляемых требований в мобильное приложение
следует встроить кнопку, при нажатии на которую будет проверяться целостность приложения.
Кнопка должна использовать метод checkIntegrity
.
Пример реализации:
Автоматический контроль
По умолчанию контроль целостности выполняется автоматически для SDK и мобильного приложения после корректной сборки каждые 10 минут.
Проведение контроля целостности после публикации приложения
Порядок обеспечения целостности
Для исключения рисков преднамеренной и непреднамеренной модификации мобильного приложения (МП), загруженного в магазин приложений (далее - Google Play), разработчику МП необходимо выполнить следующие действия в рамках проведения контроля целостности МП после публикации.
1. Зафиксировать исполняемый код МП перед загрузкой в магазин приложений.
2. После загрузки МП в магазин приложений осуществить контрольное скачивание МП и проверить соответствие значимых модулей скачанного МП зафиксированным на этапе 1.
3. Сформировать эталонные контрольные суммы для проверки целостности МП конечным пользователем (Администратором (безопасности)).
Перед проведением контроля целостности необходимо получить доверенным образом средство контроля целостности (cpverify) из состава КриптоПро CSP.
Для контроля целостности МП, предназначенного для использования под управлением ОС Android, на ПК разработчика необходимо установить утилиту командной строки Android Device Bridge (ADB) и архиватор (WinRAR).
Проверка соответствия опубликованного приложения и формирование эталонных контрольных сумм
Для контроля целостности МП, скачанного из магазина приложений Google Play, необходимо провести следующие действия:
1. МП скомпилировать и собрать для публикации в Google Play, не подписывая apk-файл ключом магазина приложений;
2. Вычислить значения хэш-функции (в соответствии с ГОСТ 34.11-2012 с длиной хэша 256 битов) для всех файлов classes[n].dex
и *.aap
(модули, содержащие код приложения) с помощью следующей команды:
cpverify -mk <file> -alg GR3411_2012_256
3. Полученные значения записать в файл и поместить в ресурсы внутри неподписанного apk-файла.
4. Подписать итоговый дополненный apk-файл;
5. Выполнить публикацию МП в Google Play;
6. Установить МП на Android устройство;
7. Подключить Android устройство к ПК через USB-соединение;
8. Для вывода всех установленных на Android устройстве apk-файлов ввести в командной строке следующую строку:
adb shell pm list packages
Для оптимизации поиска можно воспользоваться утилитой findstr
:
adb shell pm list packages -f | findstr <Часть наименования apk-файла>
9. В списке всех установленных на Android устройстве apk-файлов найти необходимый пакет и скопировать полное название пакета (без префикса «package:
»);
10. Необходимо выполнить поиск расположения apk-файла на Android устройстве следующей командой:
adb shell pm path <Полное наименование apk-файла>
11. Скопировать полный путь расположения apk-файла (без префикса «package:
»);
12. Скачать apk-файл на ПК:
adb pull <Полный путь расположения apk-файла>
13. Распаковать apk-файл с использованием архиватора;
14. Вычислить значения хэш-функции (в соответствии с ГОСТ 34.11-2012 с длиной хэша 256 битов) для всех файлов classes[n].dex
и *.aap
(модули, содержащие код приложения) с помощью команды:
cpverify -mk <file> -alg GR3411_2012_256
15. Сравнить значения, записанные в файле с хэш-значениями в ресурсах apk-файла, и зафиксированные эталонные значения;
16. При успешном сравнении опубликовать зафиксированные эталонные значения. В случае обнаружения искажений или подмены кода выполнить удаление МП из Google Play.