Введение
Предупреждение : Многие приложения, такие как LuckyPatcher, могут выполнять такие сценарии, но цель этой статьи — проинформировать разработчиков о проблемах встроенных покупок.
Встроенные покупки (In-app purchases, IAP) являются основой современных приложений, позволяя пользователям разблокировать премиум-функции или подписываться на услуги. Однако, когда разработчики не обеспечивают должной безопасности процесса выставления счетов, могут возникнуть уязвимости, позволяющие обойти проверку платежей. В этой статье мы расскажем о том, как Frida, динамический инструментарий, может обойти механизмы биллинга в приложениях для Android. Мы покажем, как можно взломать небезопасные процессы покупок и что могут сделать разработчики.
Что такое Frida?
Frida — это динамический инструментарий для разработчиков, реверсинженеров и исследователей безопасности. Он позволяет внедрять пользовательские скрипты в запущенные процессы. Используя Frida, мы можем манипулировать Android-приложениями в режиме реального времени, подключаясь к методам Java, изменяя ответы и обходя критические функции проверки, например, при покупках в приложении.
Небезопасный биллинг в приложении
Уязвимость заключается в том, что приложение выполняет проверку покупок на стороне клиента, а не через защищенный внутренний сервер. Когда приложение для Android доверяет проверку покупок клиенту, злоумышленники могут перехватить и модифицировать поток проверки покупок, чтобы обманом заставить приложение разблокировать премиум-функции без оплаты.
Основные проблемы небезопасного биллинга:
- Валидация на стороне клиента: ее можно перехватить, если проверяет покупку само приложение
- Отсутствие верификации на стороне сервера: покупки должны проверяться на внутреннем сервере, который может запросить API Google, чтобы проверить, является ли покупка законной
- Проверка статическими токенами: статические токены покупок уязвимы для перехвата и манипуляций, если они не обрабатываются безопасно
Целевое приложение: файловый менеджер
В этом примере мы обнаружили уязвимость в File Manager: File Explorer, приложении для управления файлами с более чем 10 миллионами загрузок в Google Play Store. File Manager предлагает премиум-функции и темы через покупки в приложении, которые мы смогли обойти с помощью Frida.
Обход механизма выставления счетов
Используемые инструменты:
- Frida: Для подключения к рантайму приложения
- Эмулятор Android: Для запуска File Manager в контролируемой среде
- Jadx: Декомпилирует APK и изучает исходный код приложения
Порядок действий при атаке
- Декомпиляция APK с помощью Jadx: первым шагом является декомпиляция APK для поиска классов и методов, отвечающих за покупки в приложении. Для File Manager класс BillingManager управляет потоком покупок в приложении.
- Перехват методов биллинга с помощью Frida: используя Frida, мы подключаемся к методу
querySkuDetailsAsync()
классаBillingManager
, который запрашивает данные о покупках в Google Play. Перехватив этот метод, мы можем имитировать успешную покупку, не взаимодействуя с серверами Google.
Java.perform(function() { var BillingManager = Java.use("com.explorer.filemanager.billing.BillingManager"); BillingManager.querySkuDetailsAsync.implementation = function(details, callback) { console.log("[*] Intercepting purchase request…"); // Create a fake SkuDetails object var SkuDetails = Java.use("com.android.billingclient.api.SkuDetails"); var fakeSkuDetails = SkuDetails.$new("{"productId":"premium_feature","price":"0.00"}"); // Call the callback with the fake details callback.onSkuDetailsResponse([fakeSkuDetails]); }; });
- Обход проверки покупки: приложение использует метод
validatePurchase()
для проверки токена покупки после того, как пользователь завершает платеж. Перехватив этот метод, мы можем имитировать правильный ответ на покупку.
var PurchaseValidator = Java.use("com.explorer.filemanager.billing.PurchaseValidator"); PurchaseValidator.validatePurchase.implementation = function(purchaseToken) { console.log("[*] Intercepting Purchase Validation…");
- Разблокировка премиальных функций:
Класс ProActivity
управляет премиум-функциями и темами. Мы можем перехватить логику проверки наличия премиум-функций, чтобы убедиться, что все премиум-функции разблокированы.
var ProActivity = Java.use("com.explorer.filemanager.module.activity.ProActivity"); ProActivity.k0.implementation = function(isPremium) { console.log("[*] Unlocking premium features…"); return true; //
Финальный скрипт
Объединение этих приемов в одном скрипте Frida позволяет нам обойти все механизмы биллинга:
Java.perform(function() { var BillingManager = Java.use("com.explorer.filemanager.billing.BillingManager"); var PurchaseValidator = Java.use("com.explorer.filemanager.billing.PurchaseValidator"); var ProActivity = Java.use("com.explorer.filemanager.module.activity.ProActivity"); BillingManager.querySkuDetailsAsync.implementation = function(details, callback) { console.log("[*] Intercepting purchase request..."); var SkuDetails = Java.use("com.android.billingclient.api.SkuDetails"); var fakeSkuDetails = SkuDetails.$new("{"productId":"premium_feature","price":"0.00"}"); callback.onSkuDetailsResponse([fakeSkuDetails]); }; PurchaseValidator.validatePurchase.implementation = function(purchaseToken) { console.log("[*] Intercepting Purchase Validation..."); return true; }; ProActivity.k0.implementation = function(isPremium) { console.log("[*] Unlocking premium features..."); return true; }; });
Успешная эксплуатация
После внедрения скрипта Frida приложение ведет себя так, будто пользователь совершил законную покупку. Премиум-функции разблокируются, а все покупки в приложении обходятся.
Устранение уязвимости
Проверка на стороне сервера: всегда проверяйте покупки на стороне сервера. Google предоставляет API для проверки токена покупки, и это должно быть сделано в защищенной среде бэкэнда, а не в клиентском приложении.
Обфускация: используйте такие инструменты, как ProGuard или R8, для обфускации чувствительного кода, связанного с логикой выставления счетов. Это затруднит злоумышленникам реверс-инжиниринг приложения и поиск уязвимостей.
Обнаружение несанкционированного доступа: реализуйте проверки для обнаружения того, что приложение работает в модифицированной или несанкционированной среде, например, обнаружение рута, эмулятора и проверки целостности.