Доработка безопасности приложения «ЮMoney» для Android
Участвовали в улучшении безопасности приложения ЮMoney для Android.
Клиент
ЮMoney — российская финтех-компания, входящая в экосистему Сбера, лидер по выручке среди финтех-компаний за 2025 год по оценке Smart Ranking. Кошелёк ЮMoney позволяет оплачивать товары и услуги онлайн и офлайн, переводить деньги, оформлять виртуальные и пластиковые карты, получать кешбэк и собирать средства на различные цели. Для иностранных туристов предусмотрена специальная карта для безналичных платежей в России.
Предпринимателям и компаниям доступна ЮKassa — сервис приёма платежей с поддержкой более десяти способов оплаты, выставлением счетов через мессенджеры автоматической отправкой чеков, быстрыми расчётами между юридическими лицами, разделением платежей и защитой от мошенничества.
Кроме того, компания развивает ЮSoft — платформу готовых финансовых модулей для встраивания в продукты партнёров.
Задача
Требовалось усилить механизмы обфускации и защиты кода для прохождения аудита безопасности.
Решение
В ходе анализа готовых решений рассмотрели dProtect — открытое решение на базе ProGuard для шифрования и обфускации кода.
Однако использование dProtect потребовало бы миграции на современные версии Gradle (системы автоматической сборки проекта) и дальнейшей самостоятельной поддержки библиотеки, поэтому команда отказалась от этого варианта.
Платные решения также не подошли из-за высокой стоимости.
Было решено самостоятельно реализовать механизмы защиты, необходимые для прохождения аудита: шифрование ресурсных строк, добавление мусорного кода и создание собственного словаря обфускации.
Реализация
Написали плагин, который подключается к модулям, ресурсы которых требуют шифрования.
Плагин регистрирует две задачи EncryptStringsTask и DecryptStringsTask. Первая отвечает за шифрование, вторая — за расшифровку.
EncryptStringsTask запускается до выполнения Gradle-задачи preBuild, обходит все файлы strings.xml, расположенные в директории res, и шифрует их.
DecryptStringsTask внедряет в приложение runtime-компонент, который управляет процессом расшифровки.
Кроме того, в рамках этой задачи регистрируется ClassVisitor. Он позволяет модифицировать байт-код (промежуточное представление программы) Java/Kotlin-классов во время компиляции и подменять стандартные методы получения строк на защищенные.
Добавление мусорного кода также реализовано с помощью ClassVisitor и модификации байт-кода в процессе компиляции. На этапе сборки в классы и методы добавляется бесполезный код, который усложняет анализ файла приложения как человеком, так и инструментами для реверс-инжиниринга — обратной разработки.
Также был реализован собственный словарь обфускации, что позволило избежать шаблонных имен классов, возникающих при использовании стандартного словаря. Для этого написана Gradle-задача, которая генерирует случайные названия и сохраняет их в файл. Этот файл подключается в proguard-rules.pro с помощью команд -obfuscationdictionary, -classobfuscationdictionary и -packageobfuscationdictionary. После этого R8 начинает использовать его в качестве словаря для обфускации имен классов, методов, полей и пакетов.
Результат
Разработан плагин для шифрования ресурсных строк и добавления мусорного кода, а также создан собственный словарь обфускации. Выполненные доработки позволили заказчику успешно пройти сертификацию.
Бизнес-эффект
-
Успешное прохождение аудита и сертификации приложения
-
Существенное повышение устойчивости приложения к реверс-инжинирингу
-
Защита интеллектуальной собственности и бизнес-логики
-
Сохранение работоспособности приложения при усиленной защите
Технологии
Библиотеки: org.ow2.asm:asm, com.android.tools.build:gradle-api.