Вас приветствует Ян - старший пентестер из компании Xilant!

В этот раз научу вас искать, то что разрабы забывают прячут в приложениях iOS. Возможно мы найдем пароли, личные данные, а может даже и API-ключи от бэкенда, что позволит нам продолжать атаку на следующем уровне.

Для этого нам понадобятся знания из прошлой статьи. Напомню, что мы научились получать root-доступ к более-менее свежим iOS устройствам, а также пользовались аналогом adb через ssh и iproxy. Это дало нам полный доступ к системным ресурсам iOS и позволило не только устанавливать geek-твики, но и воздействовать на память и процессы.

Чтобы не выходить за рамки закона, мы будем использовать тестовое приложение DVIA-v2 для обучения себя этим навыкам. 

Ведь тот кто знает как нападать, сможет себя защитить.

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

Подготовка стенда: Установка DVIA

Damn Vulnerable iOS App v2 (рус.: Чертовски уязвимое приложение) - это приложение для iOS, написанное на Swift , которое имеет кучу специально встроенных уязвимостей для обучения пентесту данной платформы.

Дисклеймер: не вздумайте устанавливать DVIA на устройство, которое вы используете для личных нужд (банкинг, контакты и пр). Сохранность ваших данных в таком случае никак не гарантирована! 

Однако, его нельзя просто так взять и скачать из Apple Store из-за крайней уязвимости. Поэтому вся установка происходит вр��чную. 

  • Скачать локально IPA релиза DVIA

  • Установить с помощью Sideloadly (само подписывает и не требует платного аккаунта разработчика). Процесс установки приложения довольно прост, но в случае проблем - вот туториал.

  • Дать разрешения в настройках: После успешной установки приложения при запуске возникнет табличка от Apple, что разработчик (ваш серый аккаунт) - ненадежный. Для обхода необходимо зайти: Настройки - Основные - V** и управление устройством -  [ your_user] at email - Доверять [...] - Подтвердить.

  • Приложение откроется и вы можете зайти в раздел: Local Data Storage. 

Дисклеймер: НО есть одно НО! Необходимо будет ввести креды от AppleID в Sideloadly! Для этого необходимо завести серый AppleID, который вы нигде больше кроме как для тестирования использовать не будете. Хоть разрабы и клянутся, что эти данные используются только для генерации фейковой подписи потом затираются, но лучше не давать свой личный AppleID.

Менюшка с челленджами.
Менюшка с челленджами.

Теория: Почему локальное хранилище — это риск?

Как только вы установили и запустили приложение, время приступить к первому заданию: поиск уязвимости в локальном хранилище (Local Data Storage)

Дело в том, что обычно приложение должно общаться с бэкенд API (back-end API) для отсылки и приема запросов. Также на устройстве могут храниться конфиденциальные данные клиента, которые при плохой защите могут прочитать сторонние приложения или злоумышленники с локальным доступом к устройству (например, после кражи).

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

Разведка: Находим пути к приложению

И вот нас уже есть рут доступ к устройству.  Первым, делом надо подключиться по ssh и понять, в какой директории находится само приложение.

iproxy 2222 22 &
ssh -p 2222 root@localhost

Для удобства выключаем все приложения оставляем активным только то, что нам нужно и фильтруем процессы:

root# ps aux  | grep -i dvia
/var/containers/Bundle/Application/097D[...]53/DVIA-v2.app/DVIA-v2

В этой директории содержится бинарник приложения, библиотеки и Info.plist.

Также если поискать, то можно найти директорию, где содержатся песочницы с данными от всех установленных приложений:

/var/mobile/Containers/Data/Application

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

scp -r -P 2222 root@localhost:/var/containers/Bundle/Application/097D44A4-5503-409F-81E6-E0ACE6EE3553  .
scp -r -P 2222 root@localhost:/var/mobile/Containers/Data/Application/DD3F1424-3831-4FBA-8C8B-D9D1C3F3AA58  .

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

Дисклеймер: этот метод не подходит для дампа бинарника приложения, так как он будет зашифрован злым Apple. Как скачать читаемый бинарник, расскажем в следующей статье!

Первый эшелон: Анализ Info.plist

Начнем поиски утечек с ранее найденного файла Info.plist, который является чем-то вроде аналога манифеста в Android. Поэтому всегда надо начинать знакомоство с приложением именно с этого файла.

После скачивания директорий с iOS-устройства на локалку, вбиваем следующую команду на MacOS для просмотра *.plist:

 open ./097D44A4-5503-409F-81E6-E0ACE6EE3553/DVIA-v2.app/Info.plist

Наблюдаем как магически откроется xCode с данными приложения и его настройками.

Ничего криминального здесь не видим, поэтому ищем другие *.plist файлы (их много):  find . | grep plist 

Поиск секретов UserDefaults

Некоторые неопытные разрабы могут использовать метод UserDefaults для хранения данных в обычном plist-файле.

Этот файл:

  • не шифруется по умолчанию (даже в iOS 18/19 на 2026 год ситуация не изменилась кардинально)

  • легко извлекается

Вот так любой хакер с помощью самого простого grep найдет секреты, которые сохранены с помощью метода UserDefaults:

grep -ri 'key' . | grep user
./DD3F1424-3831-4FBA-8C8B-D9D1C3F3AA58/Documents/userInfo.plist:	<key>password</key>
./DD3F1424-3831-4FBA-8C8B-D9D1C3F3AA58/Documents/userInfo.plist:	<key>username</key>

И видим, что-то интересное скрыто в userInfo.plist. Если его открыть:

Это - небезопасное хранение данных, потому что креды не зашифрованы.

Также в данном тренажере секреты спрятаны после вызова UserDefaults в еще одном файле .plist:

cat Library/Preferences/com.highaltitudehacks.DVIAswiftv2.J8X7G4NN3H.plist

bplist00?YDemoValueYtoto12345

Хранить таким способом API-ключи и любые другие конфиденциальные вещи - не безопасно!

Поэтому, используя одну единственную команду - grep -, можно найти очень много интересного.

Ленивый вариант - использовать утилиту для автоматического сканирования: MobSF.

Итоги и рекомендации по защите

Находить утечки проще простого если есть root-доступ. Однако замечу, что кроме рута злоумышленник может воспользоваться бэкапом через iTunes или iMazing для дампа песочницы приложения. Не будьте наивны - не полагайтесь на защиту песочницы (iOS Sandbox)!

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

  • Используйте Keychain для всех секретов;

  • используйте kSecAttrAccessibleWhenUnlockedThisDeviceOnly;

  • Включите NSFileProtectionComplete;

  • Для баз данных (SQLite, Realm) добавьте explicit encryption;

  • Интегрируйте MobSF или методы из OWASP MSTG в ваш CI/CD для сканирования на утечки секретов и ключей.

Будьте безопасны! И ждите следующую статью.

Дисклеймер: ни один чат-бот не пострадал при создании данной статьи!