Site icon AppTractor

Пример: взлом покупок в Android-приложении и защита от этого

Введение

Предупреждение : Многие приложения, такие как LuckyPatcher, могут выполнять такие сценарии, но цель этой статьи — проинформировать разработчиков о проблемах встроенных покупок.

Встроенные покупки (In-app purchases, IAP) являются основой современных приложений, позволяя пользователям разблокировать премиум-функции или подписываться на услуги. Однако, когда разработчики не обеспечивают должной безопасности процесса выставления счетов, могут возникнуть уязвимости, позволяющие обойти проверку платежей. В этой статье мы расскажем о том, как Frida, динамический инструментарий, может обойти механизмы биллинга в приложениях для Android. Мы покажем, как можно взломать небезопасные процессы покупок и что могут сделать разработчики.

Что такое Frida?

Frida — это динамический инструментарий для разработчиков, реверсинженеров и исследователей безопасности. Он позволяет внедрять пользовательские скрипты в запущенные процессы. Используя Frida, мы можем манипулировать Android-приложениями в режиме реального времени, подключаясь к методам Java, изменяя ответы и обходя критические функции проверки, например, при покупках в приложении.

Небезопасный биллинг в приложении

Уязвимость заключается в том, что приложение выполняет проверку покупок на стороне клиента, а не через защищенный внутренний сервер. Когда приложение для Android доверяет проверку покупок клиенту, злоумышленники могут перехватить и модифицировать поток проверки покупок, чтобы обманом заставить приложение разблокировать премиум-функции без оплаты.

Основные проблемы небезопасного биллинга:

Целевое приложение: файловый менеджер

В этом примере мы обнаружили уязвимость в File Manager: File Explorer, приложении для управления файлами с более чем 10 миллионами загрузок в Google Play Store. File Manager предлагает премиум-функции и темы через покупки в приложении, которые мы смогли обойти с помощью Frida.

Обход механизма выставления счетов

Используемые инструменты:

Порядок действий при атаке

  1. Декомпиляция APK с помощью Jadx: первым шагом является декомпиляция APK для поиска классов и методов, отвечающих за покупки в приложении. Для File Manager класс BillingManager управляет потоком покупок в приложении.
  2. Перехват методов биллинга с помощью 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]); }; });
  1. Обход проверки покупки: приложение использует метод validatePurchase() для проверки токена покупки после того, как пользователь завершает платеж. Перехватив этот метод, мы можем имитировать правильный ответ на покупку.
var PurchaseValidator = Java.use("com.explorer.filemanager.billing.PurchaseValidator"); PurchaseValidator.validatePurchase.implementation = function(purchaseToken) { console.log("[*] Intercepting Purchase Validation…");
  1. Разблокировка премиальных функций:

Код Jadx

Класс 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, для обфускации чувствительного кода, связанного с логикой выставления счетов. Это затруднит злоумышленникам реверс-инжиниринг приложения и поиск уязвимостей.

Обнаружение несанкционированного доступа: реализуйте проверки для обнаружения того, что приложение работает в модифицированной или несанкционированной среде, например, обнаружение рута, эмулятора и проверки целостности.

Источник

Exit mobile version