Пентестинг приложений iPhone – часть 2

Пентестинг приложений iPhone – часть 2

Цель статьи – рассмотреть всю методологию пентестинга приложений на реальном устройстве (под управлением iOS 5), а не на симуляторе.

Автор: satishb3

В первой статье серии мы обсудили анализ трафика приложений iPhone. В данной статье мы рассмотрим проблемы приватности и локального хранилища данных приложения.

Проблемы приватности

С каждым iPhone связан уникальный идентификатор устройства, UDID, получаемый на основе характеристик оборудования. UDID "зашит" в устройство и не может быть удален или изменен. Однако, с помощью инструментов вроде UDID Faker он может быть сфальсифицирован (то есть, приложение, пытающееся узнать UDID устройства, получит поддельное значение).

В последней версии iPhone UDID вычисляется по следующей формуле:

UDID = SHA1(Serial Number + ECID + LOWERCASE (WiFi Address) + LOWERCASE(Bluetooth Address))

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

NSString *uniqueIdentifier = [device uniqueIdentifier]

Исследования показывают, что с помощью UDID можно составлять шаблоны просмотра страниц, характерные для конкретного пользователя, и отслеживать его местоположение. Поскольку с помощью UDID устройства можно получить точное местонахождение пользователя, возникает большая проблема приватности. В статье Эрика Смита "iPhone application privacy issues whitepaper"описаны и другие возможные атаки. Исследование Эрика показывает. что 68% приложений отправляют UDID в Интернет без какого-либо уведомления. Отличный пример серьезной проблемы приватности был обнаружен в геймерской социальной сети Openfient. Openfient собирает UDID устройств, привязывает их к личной информации пользователей (адресу электронной почты, широте и долготе местонахождения, аватарам других социальных сетей) и помещает их в открытый доступ. В результате приватность пользователей оказывается под угрозой. Более подробно данный изъян безопасности описан здесь.

Во время тестирования на проникновение нужно анализировать сетевой трафик на предмет наличия UDID. Присутствие в сетевом трафике UDID означает, что приложение собирает идентификаторы устройств и может отправлять их третьей стороне для анализа поведения пользователя. В iOS 5 Apple пометила API-функции, которые получают UDID, как неиспользуемые (deprecated). Возможно, в последующих версиях ОС эти функции будут полностью удалены. Рекомендуется не использовать API, который собирает UDID устройств, поскольку его использование может негативно сказаться на приватности пользователей. Если разработчики хотят отслеживать поведение пользователя, вместо UDID им рекомендуется использовать сгенерированный уникальный идентификатор, относящийся к приложению. Недостаток использования такого идентификатора в том, что, в отличие от UDID, он идентифицирует только экземпляр приложения, а не устройство.

Помимо UDID, приложения могут передавать сторонним аналитическим компаниям другие персональные данные, например, возраст, имя или адрес. Передача персональных данных сторонним компаниям без ведома пользователя также нарушает приватность. Так что, в ходе пентестинга нужно внимательно исследовать трафик на предмет наличия каких-либо важных данных.

Пример. Приложение Pandora когда-то передавало, причем в незашифрованном виде, возраст и почтовый индекс пользователей сторонней аналитической компании (doubleclick.net). Разработчикам приложений, которым необходима информация о местоположении пользователя (например, социальным сетям она нужна для "чек-инов"), при вычислении местоположения рекомендуется использовать минимально допустимую точность. Это можно осуществить за счет соответствующего выбора константы фреймворка Core Location (например, CLLocationAccuracy kCLLocationAccuracyNearestTenMeters).

В iOS 6 Apple удалила API, который позволяет обращаться к UDID, и в качестве альтернативы ввела "рекламный" (advertising) идентификатор.

Локальное хранилище данных

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

Чтобы получить хранимую на iPhone конфиденциальную информацию, злоумышленник может использовать несколько способов. Вот несколько из них:

  • Из резервных копий
    Когда iPhone соединяется с iTunes, iTunes автоматически делает резервную копию всех данных устройства. В резервную копию на рабочей станции попадают и конфиденциальные файлы. Так что, злоумышленник, получивший доступ к рабочей станции, может получить конфиденциальную информацию из файлов резервных копий.
  • Физический доступ к устройству
    Потеря или кража телефона – дело обычное. В обоих случаях злоумышленник получит физический доступ к устройству и завладеет хранимой на телефоне конфиденциальной информацией. Парольный код, установленный на устройстве, не защитит данные, поскольку простой пароль iPhone можно найти перебором за 20 минут. Узнать больше про обход парольной защиты можно в этой статье.
  • Вредоносное ПО
    Используя брешь в безопасности iOS, злоумышленник может разработать вредоносную программу, которая умеет красть файлы с iPhone удаленно. Примеры таких атак продемонстрированы Эриком Монти в его презентации "iPhone Rootkit? There’s an App for That!".

Структура директории приложения iPhone

В iOS приложения ассоциируются с содержанием определенной директории. В данной директории сконцентрированы ресурсы приложения, исполняемые и прочие файлы. В iPhone приложения выполняются в песочнице с привилегиями пользователя mobile. В отличие от ОС Android, где сегрегация приложений основана на UID, в iOS приложения запускаются от имени одного пользователя. По словам Apple, "Песочница – набор средств управления, ограничивающих доступ приложения к файлам, настройкам, сетевым ресурсам, оборудованию и т. д. Каждое приложение имеет доступ к своей песочнице, но не может обращаться к содержимому песочниц других приложений. Когда приложение устанавливается, система создает его домашнюю директорию, некоторые ключевые поддиректории и устанавливает привилегии безопасности его песочницы". Песочница – ограниченная среда, которая предотвращает доступ приложений к неавторизованным ресурсам. Стоит, однако, отметить, что после джейлбрейка защита песочницы отключается.

Директория приложения создается при его установке внутри директории /var/mobile/Applications. В домашней директории приложения содержится все, что необходимо для запуска этого приложения. Ниже показан типичный состав домашней директории приложения.

В iPhone приложения могут хранить информацию в одном из следующих мест:

  • Списки свойств (Plist)
  • Связка ключей
  • Домашняя директория приложения
  • Кэш
  • Журналы

Списки свойств

Список свойств – структурированный двоичный файл, который содержит конфигурацию приложения в виде вложенных пар ключ-значение. Списки свойств используются для хранения предпочтений пользователя и конфигурации приложения. Например, игры обычно хранят в списках свойств данные уровней и информацию о набранных очках. Приложения хранят файлы списков в папке [Application’s Home Directory]/documents/preferences. Поскольку XML-файлы не являются оптимальным способом хранения, многие приложения используют двоичные файлы plist. Данные, хранящиеся в списках свойств в двоичном виде, можно легко просматривать или модифицировать с помощью специальных редакторов (например, plutil). Редакторы списков свойств преобразуют двоичные данные в удобный для редактирования XML-формат. Как уже отмечалось, списки свойств преимущественно используются для хранения пользовательских предпочтений и конфигурации приложения, однако приложения могут использовать эти файлы для хранения в незащищенном виде учетных данных пользователей и информации о сессиях. Поэтому в ходе пентестинга следует проверить все списки свойств в домашней директории приложения на предмет наличия в них конфиденциальной информации вроде персональных данных, учетных данных, куки сессий и т. д. Нужно учесть, что разработчики могут назначить списку свойств произвольное расширение. Однако, список свойств можно легко опознать, просматривая содержимое файла с помощью команды cat: содержимое такого файла начинается с "bplist".

Списки свойств могут представлять еще одну потенциальную проблему: на их основе некоторые приложения делают решения, касающиеся аутентификации и авторизации. Например, если в ходе пентестинга вы обнаруживаете в списке свойств запись вида admin=0, попробуйте изменить значение admin на 1 и открыть приложение. Если данное приложение не проверяет должным образом введенные пользователем данные и проводит авторизацию на основе значения в списке свойств, вы сможете войти в приложение как администратор. Разработчикам рекомендуется не хранить в списках свойств никакой конфиденциальной информации, а также не принимать решений, касающихся аутентификации и авторизации, на основе их содержимого. Списки свойств содержат контролируемые пользователем данные, поэтому они должны проверяться соответствующим образом.

Например, приложение WordPress для iPhone когда-то хранило учетные данные пользователя в списке свойств в открытом виде. Приведенное ниже видео демонстрирует данную уязвимость. После того, как SANS сообщила об этой уязвимости, Wordpress исправила ее немедленно.

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

Модификация списков свойств на iPhone, не подвергшемся джейлбрейку.

На не подвергшемся джейлбрейку iPhone списки свойств можно просматривать и редактировать с помощью таких утилит, как iExplorer или iBackupBot.

Модификация записей с помощью iExplorer

iExplorer (ранее известный как iPhone Explorer) позволяет получить доступ к iPhone в режиме диска и напрямую просматривать содержимое всех папок.

В качестве примера рассмотрим игру Stick Cricket.

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

На данном снимке экрана показано исходное количество очков перед модификацией списка свойств.

Для изменения количества набранных очков с помощью iExplorer нужно выполнить следующие шаги:

  1. Загрузите iExplorer и установите его на вашу рабочую станцию.
  2. Соедините iPhone с вашей рабочей станцией через USB-кабель.
  3. В программе iExplorer перейдите в директорию Apps->com.sticksports.stickcricket.
  4. Перейдите в директорию Library->Preferences.
  5. Скопируйте на рабочую станцию файл com.sticksports.stickcricket.Plist, перетащив его на рабочий стол.
  6. В копии файла с помощью редактора списков свойств измените значение, соответствующее ключу yourBest5Overs.
  7. В данном случае я изменил количество очков с 30 до 180 и сохранил файл.

  8. Из iExplorer удалите с iPhone старый файл com.sticksports.stickcricket.Plist и перетащите на его место модифицированную копию.
  9. На iPhone закройте приложение Stick Cricket и откройте его заново. Теперь экран приветствия покажет модифицированное количество очков, что видно на следующем снимке экрана.

Видео, демонстрирующее модификацию количества набранных очков в игре Stick Cricket, доступно здесь.

Модификация записей списка свойств с помощью iBackupBot

Когда iPhone подключается к компьютеру, iTunes делает полную резервную копию данных, которая включает и конфигурационные файлы (списки свойств). Утилиту iBackupBot можно использовать для просмотра и модификации записей списков свойств внутри резервных копий и восстановления модифицированных копий на iPhone.

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

  1. Подключите iPhone к рабочей станции через USB-кабель.
  2. На рабочей станции откройте iTunes и сделайте резервную копию данных iPhone.
  3. Закройте iTunes.
  4. Откройте iBackupBot. Он автоматически найдет существующие резервные копии и отобразит содержащиеся в них файлы.
  5. Нажмите на Stick Cricket и откройте файл /Library/Preferences/com.sticksports.stickcricket.Plist.
  6. Измените количество очков, хранящееся в списке свойств.
  7. Нажмите на значок Экспорта, чтобы сохранить модифицированный список.
  8. Нажмите на значок восстановления на панели инструментов iBackupBot. В результате модифицированная резервная копия накатится на устройство. Теперь, если переоткрыть приложение Stick Cricket, игра отобразит измененное количество очков.

Модификация списков свойств на iPhone, подвергшемся джейлбрейку

На подвергшемся джейлбрейку устройстве списки свойств можно просматривать и модифицировать с помощью таких утилит, как plutil и iFile. Оба инструмента можно загрузить из Cydia (пакеты com.eric.tool и iFile). При этом iFile позволит модифицировать списки свойств прямо на iPhone.

В качестве примера рассмотрим стандартное приложение Phone для камеры. В данном приложении Apple спрятала режим панорамной съемки, планируя включить его в будущих версиях iOS. По сути, режим панорамной съемки позволяет пользователю делать непрерывную серию фотографий, перемещая камеру слева направо. Apple хранит переключатель, отвечающий за доступность режима панорамной съемки, в списке свойств. Возможность включения данного режима в iOS 5 путем модификации записи в файле com.apple.mobileslideshow.Plist обнаружили Conard и Chpwn.

На данном снимке экрана показан исходный список доступных опций приложения.

Чтобы изменить переключатель панорамного режима в списке свойств с помощью утилиты plutil, понадобится сделать следующие шаги.

  1. Подключитесь к iPhone по SSH, используя логин root и пароль alpine.
  2. Перейдите в папку /private/var/mobile/Library/Preferences/.
  3. Откройте список свойств com.apple.mobileslideshow.Plist с помощью утилиты plutil.
  4. > Plutil com.apple.mobileslideshow.plist

  5. Добавьте в файл com.apple.mobileslideshow.plist ключ 'EnableFirebreak' с помощью такой команды:
  6. > Plutil –key EnableFirebreak –value yes com.apple.mobileslideshow.plist

  7. Это позволит включить возможность панорамной съемки в приложении для камеры.

На снимке экрана показан список опций, доступных в приложении для камеры после модификации списка свойств.

Это вторая часть серии статей о пентестинге приложений iPhone. Третья часть будет посвящена связке ключей и анализу журналов ошибок.

Большой брат следит за вами, но мы знаем, как остановить его

Подпишитесь на наш канал!