Что можно достать из приложения, имея jailbreak девайс (на примере Monobank)

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті.

Я, Яков Школьников, iOS разработчик в ITOMYCH STUDIO c 6-летним опытом работы в сфере. В последнее время, занимаюсь разработкой финтех приложений, где наиболее актуальна тема безопасности. Чтобы выявить проблемы такого рода, вам понадобится penetration testing. Некоторые проверки можно осуществить самостоятельно. Это поможет заранее обнаружить проблему и найти способ ее решения. Именно такие проверки и являются предметом данной статьи.

Речь пойдет о том, какую информацию можно узнать о приложении, имея jailbreak девайс, на примере Monobank.

Jailbreak

Джейлбрейк (iOS jailbreaking) дает доступ к файловой системе, где есть возможность получить .app файл, сендбокс и записи из кейчейна. Также, на джейлбрейкнутый девайс можно ставить deb пакеты, что понадобится для того, чтобы обойти ssl pinning.

Установка джейлбрейка

Утилит, которые джейлбрейкают девайс, много, и они зависят от модели и версии оси. Я использовал iPhone 5s с версией iOS 12.4.9. Для такой версии есть всего две утилиты: unc0ver и checkra1n. Я выбрал checkra (версия 0.12.2 beta). У него есть один недостаток — при перезапуске девайса джейл слетает, и нужно его устанавливать опять, но т.к. я использую этот девайс в тестовых целях, меня это устраивало.

Установка вспомогательных тулов

После джейла нужно поставить вспомогательные программы. Для этого можно использовать магазин (он ставится по дефолту после джейла для большинства утилит).

Нужно установить следующие тулы:

  • OpenSSH (нужен для подключения к телефону по ssh).
  • MTerminal (нужен для установки deb пакетов).
  • Debian Packager (нужен для установки deb пакетов).
  • Cydia Substrate (нужен для установки deb пакетов).
  • PreferenceLoader (ssl kill switch использует его чтобы добавить в приложение Settings возможность включать / отключать ssl валидацию).

После этих шагов можно приступить к получению и анализу данных.

В дальнейшем нам нужно будет подключаться через компьютер к айфону, для этого нужно чтобы оба были подключены к одной сети, и нужно знать ip айфона, который можно посмотреть в настройках вайфая (в примерах используется 192.168.0.0)

Network sniffing

[iOS Application Security] Jailbreak 12.4

  1. Скачиваем последний deb package.
  2. Открываем терминал на маке и копируем пакет на телефон: scp com.nablac0d3.sslkillswitch2_0.14.deb root@192.168.0.0:/var/mobile при подключении запросит пароль, если его не меняли, то по дефолту будет alpine
  3. Открываем терминал на телефоне
  4. Устанавливаем пакет: su alpine dpkg -i com.nablac0d3.sslkillswitch2_0.14.deb

  5. Отключаем ssl pinning в настройках

Для сниферинга данных использовался Charles.

Самое интересное, что можно достать из апилки — это ключи, которые не должны храниться на клиенте. Такого найдено не было. В некоторых запросах в открытом виде отправляются ИНН, ФИО, e-mail, IBAN, номер карточки, дата экспирации и CVV:

Также можно посмотреть какие есть feature flags и подменить запрос, чтобы посмотреть как будет вести себя приложение.

Для fintech приложений важно не допустить утечки данных, поэтому иметь, как минимум ssl pinning очень важно.

Bundle приложения

Все, что мы кладем в бандл, можно достать из app файла. Чтобы достать сам app файл нужно:

  1. Подключиться с компьютера к девайсу по ssh, для этого в терминале нужно выполнить ssh root@192.168.0.0
  2. Все приложения лежат в папке /var/containers/Bundle/Application/, переходим в нее.
  3. Все приложения имеют UUID, и по названию папки непонятно какое там приложение, поэтому чтобы найти нужное нам выполняем команду: ls * | grep -B 2 -i 'app_name'

    .

  4. Теперь можно перенести содержимое на компьютер, для этого в новом окне терминала выполняем команду: scp -r root@192.168.0.0:/var/containers/Bundle/Application/F1AD67B9-AFEB-4D7F-B956-CFBEFE42655A some_folder_on_mac some_folder_on_mac

Можно открыть app файл:

В файле _CodeSignature/CodeResources находятся имена сторибордов, ксибов и вью контроллеров. Если какой-то функционал спрятан в приложении, то можно понять о его существовании. Также лежат ассеты (картинки в формате png и json), серты (пару заэкспайренных). В папке Frameworks находится очень много фреймворков, и видно, что используется микросервисная архитектура.

Теперь конкретно по фреймворкам. Некоторые написаны на флаттере (например, App.framework)

В Core.framework лежит Configurations.json

MonoStatement.framework содержит моки выписок:

В процессе изучения этих моков было найдено 3 человека, и 2 фотографии, которые вывели на страницы этих людей в линкедин.

Также есть файл RemoteConfigDefaults.plist в котором тоже есть некоторые флаги:

Всегда нужно быть очень внимательным с тем, что кладется в бандл приложения. Иметь замоканную апилку очень удобно, и для тестов, и для работы без реального бека, но лучше это все убирать при архиве приложения. И желательно в моках не хранить реальных данных.

Сендбокс

В целом, выглядит все почти так же, как и для бандла, за исключением локации сендбокса:

  1. Подключиться с компьютера к девайсу по ssh, для этого в терминале нужно выполнить ssh root@192.168.0.0
  2. Сендбоксы приложений лежат в папке /var/mobile/Containers/Data/Application/, переходим в нее.
  3. Тут такая же история с UDID, только они не такие же, как для бандлов, поэтому опять ищем в подпапках наше приложение: ls -R | grep -B 2 -i 'app_name'

  1. Как и в прошлый раз, копируем содержимое на комп: scp -r root@192.168.0.0:/var/mobile/Containers/Data/Application/F1AD67B9-AFEB-4D7F-B956-CFBEFE42655A some_folder_on_mac

В папке Documents лежит база данных (реалм)

Также есть файл с логами, который находится в папке Caches/Logs. Там также видно все запросы, переходы по экранам, и т.п. Некоторые суммы (тоже было видно и при снифе нетворка) в строках, при этом с большим количеством цифр после запятой.

Все что будет закешированно, базы данных — будет видно в сендбоксе. В случае с реалмом можно заэнкриптить базу, и тогда ее не получится открыть, дампнув сэндбокс (по крайней мере так должно работать). У меня на одном компе не открылась база (запросило ключ), на другом открылась. Если логи пишутся в файл нужно быть предельно аккуратным что туда попадает, но лучше конечно пользоваться креш репортами и аналитикой.

Кейчейн

Для дампа кейчейна есть утилитка: ptoomey3/Keychain-Dumper

  1. Скачиваем или билдим локально.
  2. Копируем утилиту на девайс: scp keychain_dumper root@192.168.0.0:/var/KeychainDumper.
  3. Подключаемся к девайсу по ssh.
  4. Проверяем что keychain_dumper исполняемый файл, а keychain-2.db доступен на чтение всем.

  1. Переходим в папку с утилитой и выполняем команду: ./keychain_dumper

Все, что мы храним в кейчене, можно достать и посмотреть. В случае с паролями и любыми приватными ключами, перед тем как положить их в кейчен, их обычно шифруют. Можно использовать touch id для этих целей.

На все указанные моменты стоит обращать внимание при разработке.

И напоследок, какие могут быть проблемы, если работать не с Decimal (или Int, если такого типа данных нет):

Справедливости ради, скажу, что сейчас эта проблема не воспроизводится, но подобное случалось в 2019 году.

На основе полученных данных, можно увидеть, что API особо никак не скроешь. Достать ipa и сендбокс приложения, а также записи из кейчейна, не составляет особого труда. Поэтому, при разработке приложений, нужно уделять отдельное внимание тому, куда и какие данные мы складываем.

👍НравитсяПонравилось34
В избранноеВ избранном8
LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Double замість Decimal здивував, тим більше, що Decimal в Swift є. На одному з фінтех проєктів доводилося через це проходити 🤕

В некоторых запросах в открытом виде отправляются ИНН, ФИО, e-mail, IBAN, номер карточки, дата экспирации и CVV

Что значит «в открытом виде» — это до шифрования снято, с протокола. А надо — сниффером с сети. Потому что как бы эти данные и так в «открытом» виде передаются, но под шифрующим протоколом.

«Шокирующие открытия» работы приложений в ios сильно натянуты.

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

Забавно, что в моковых списаниях видно револют. Которого нет в Украине.

В некоторых запросах в открытом виде отправляются..

Прямо по HTTP?

На основе полученных данных, можно увидеть, что API особо никак не скроешь.

Скорее вывод в том, что цели «скрыть API» не ставилось.

И практически никогда не ставится. Потому что скрытое API сложно тестить, и security through obscurity не заставит себя ждать.

Интересный текст. Прям из серии «бери и делай».
Айоси ломать прикольно.
Но я бы зассал такие статьи писать.

Но я бы зассал такие статьи писать.

Почему?

Потому что Эппэл следит за тем что пишут на русском в Украине, и забанит за то что москаль :)

Опять таблетки не выпил?

Опять свои таблетки рекламируешь? Запили хотя бы пост, не всё ж в комментах пахнуть.

шутит он, юмор у него специфический

Напевно є якесь хвилювання, що Моно може поскаржитись, звинуватити в чомусь і тд

В чому конкретно? Не знаю ще прецедентів покарання за реверс-інжинірінг та дослідження програм. Особливо тих, по яким заявлено що вони безпечні для управління вашими коштами.

Склад злочину почнеться в разі використання для протиправних дій.

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

Если исследуется приложение, а не серверная часть, то есть программа как продукт — которой пользователь вынужден ДОВЕРЯТЬ — тут уж извини, доверие пользователя может быть обосновано только работой исследователей. То есть наказывать за такое бесполезно, а за попытку — можно лишиться лицензий международных систем, потому что будет расценена как намеренная закладка уязвимостей.

Грубо говоря, программа сама по себе не несёт никаких данных для получения выгод. Вернее, не должна нести. А ежели туда какой дурак пароль админа спрятал, так виновен исключительно он сам, а отвечает его юр.лицо.

Это почему?

Люди, не прячась, описывали вскрытие в миллионы раз более критичных, опасных и крупнобюджетных штук. Как пример, шатание bootrom через DFU. To, что потом стало эксплоитом checkm8 и джеилбрейком checkra1n. А ещё более смелый австралийский гуру Крис Вейд сделал полную низкоуровневую эмуляцию iOS, после чего его фирме прилетел иск от Apple. Отбился и выиграл дело!

Зассать можно только в том случае, если расписываешь явно криминальный сценарий использования уязвимости.

Прикольная статья. Давай еще

Дякую велике за статтю.

На основе полученных данных, можно увидеть, что API особо никак не скроеш

Security by obscurity никогда и не прокала.

Провокуєш архітектів Дії?)

Ну почему же, временно это работает. Местами может работать и постоянно, если цена попытки высокая, а выхлоп с удачи низкий, исследование нерентабельно. Но никак не в проектах на широкую аудиторию.

Через мітм проксі не потрібне відключення ссл чи джейбрейк. Весь трафік і так видно якщо поставити сертифікат довіри.

Те ж саме про перегляд файлової системи, є ifunbox чи imazing

Напишіть тоді може теж маленьку статтю?)

Та їх вже сотні в інтернеті насправді, я й сам колись адмінив сайт по айподам і таких інструкцій понаписував багато.

1. medium.com/...​ng-mitmproxy-4d3c94831f62
2. www.i-funbox.com/en/index.html

Не знаю як на ios, але на Android таке не працює. Справа в тому, що сертифікати користувача вважаються ненадійними, і якщо для браузера ще підійде таке, то для програм які використовують ссл таке не пройде. На днях спробував таке повернути з лінкедіном, нічого не вийшло. Без рута (лінь його ставити, легше вже запустити емулятор) працювати не буде.

може бути, я теж тільки з браузером грався здається

В каких-то случаях разработчики могут банально отключить `NSAppTransportSecurity` - тогда все очень плохо

В других случаях без пиннинга действительно достаточно комбинации из прокси+сертификата.

В таких випадках можна перепакувати apk за допомогою apktool, додавши довіру до сертифікатів користувача в network_security_config, але не з усіма таке можна зробити. З linkedin.apk таке не пройшло, просто не розпакувало правильно.

Так идея в том, что поставив джейл — берёшь на себя все риски.
У привата например вход по морде перестает работать.

Учитывая, что закрытый невзломанный телефон открыть может только эпл — пофиг, что там сниффится в банковских приложениях на открытом настежь телефоне. Это не штатный режим ios платформы.
Ты знал на что шел, пользуя анковер.

Дело не совсем в этом. По сути мобильное приложение на джейле вполне себе может стать стартовой точкой для поиска уязвимостей сервера.
Например, у меня как-то знакомый хотел пушнуть зашитые в бинарнике актуальные креды актуальных админ юзеров, которые использовались для стейджинг билдов и упрощения их ввода. Тут вопрос совпадали ли креды с продакшном, но из бинарника их простыми `strings` на джейле можно было извлечь бы.

В смысле перестает? У меня стоит джейл и все приватовское работает

Видимо в комплекте с сидией стоит клоак или ты поставил и забыл.
Обычно детектит джейлбрейк

Так идея в том, что поставив джейл — берёшь на себя все риски.
У привата например вход по морде перестает работать.

А как он знает, что у него джейл? Неужто в Яббле настолько дырявая безопасность приложений, что приложение без полномочий может узнать о джейле?

настолько дырявая безопасность приложений, что приложение без полномочий может узнать о джейле?

Идет от обратного, скорее всего :)
Грубо говоря тыкает в вещи, которые в нормальных условиях сработать не должны. И если срабатывает — считает что на телефоне стоит джейл. Если честно, я никогда особо не понимал на кого рассчитано такое поведение и в чем его сакральный смысл.

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

К примеру fork в сендбоксе обычно не работает, в старых джейлах (лет 7 назад) он внезапно начинал работать и по нему можно было проверить. Я бы не сказал, что это «все и всем». В принципе, еще почти в каждом «пользовательском» джейле в комплекте шла сидия. У которой есть url схема (стандартная штука, чтобы открывать из одного приложения другое), и можно было потыкать в эту схему, известна ли она iOS.

Вопрос про то, от чего такой детекшн защищает — все еще остается для меня загадкой

Перестраховка юридических задниц, по сей день уверенных, что security through obscurity — лучшая политика.

Тупо может попробовать touch вне своей песочницы.
Прокатило — джейл.

Заблуждение.

1. NSO, продающий эксплоиты для iOS направо и налево. Хотя, этот пункт можно всерьёз не воспринимать, ради обчистки банковских счетов такое вряд ли используют, крутовато и дороговато будет.

2. Некоторые VPN втихую предлагают проставить на телефон доверенный Root CA. С целью полного MITM https—трафика VPN—сервером, под благовидным предлогом отсечения мусорного трафика. Недавно этот процесс сильно осложнили, запретив частным лицам размещать VPN—аппки в аппсторе, но наплодить пачку юрлиц тоже не такая проблема с нужным уровнем заинтересованности. Так вот, если в банк-клиенте не включен SSL Pinning, то трафик становится читаемым для владельцев VPN—сервера.

3. Повышение привилегии внутри злоумышленной аппки А до уровня sandbox escape, с целью кражи данных из аппки Б — сравнительно более простая задача, чем полнoфункциональный jailbreak с root—доступом, rw—remount’ом корневого раздела, и прочими плюшками.

4. Если имеется локальный доступ к разблокированному чужому телефону, опять же проставляется Root CA, и если в банк-клиенте нет pinning, шифровка трафика опять же снимается.

5. Хрен с ними с некоторыми VPN (п.2). Несколько лет назад бесплатный WiFi в Минском аэропорту мне подсовывал Root CA на captive portal’е, вместе с инструкцией по включению, иначе отказывался работать :)

А что насчет исследования приложения с помощью дампа сигнатур + рантайм инъекции и поиска «неиспользуемых» методов, которые там могут остаться?

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

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

К сожалению я это делать ещё не пробовал, но если доберусь, то можно будет продолжение этой статьи сделать.

Хороше чтиво, цікаво було б ще про Дію почитати

Это если бы от Приват24 так разобрал — тогда да.
А это Моно.

Приват24 разобрал? Смешно. Его разве только собственными внутренностями в лог не тошнит (но это не точно).

Да они не выедут (и не въедут) если ты им баги прямо в саппорт пришлёшь. Даже если найдёшь куда надо слать баги — всё равно напишут «а у нас всё работает, значит не баг».

Подписаться на комментарии