Типичные баги (вшитые в бинарник токены, ключи авторизации и прочие секреты) в iOS-приложениях

Mobile OWASP top 10 - азбука всех софтверных аудиторов.
В пункте Sensitive Information Disclosure подразумевается наличие в дистрибутиве приложения данных, которые можно использовать против пользователя или инфраструктуры поставщика.


Магазин App Store фактически стал мировым стандартом, так что выбирать, с кем работать, особенно не приходится. Скачивать приложения с него можно как непосредственно с устройства, так и через iTunes, установленный на рабочую станцию. В наших целях применим второй способ, так как на устройстве для доступа к App Store используется SSL pinning, в то время как в iTunes для рабочей станции его нет и SSL MITM легко устанавливается штатными средствами. А если есть доступ к протоколу, со слезами, кровью, снифером и питоном, но все-таки пишется скрипт для поточного скачивания бесплатных приложений :).

Все самое интересное обычно хранится в конфигах, а если точнее, то в XML-, PList- и SQLite-контейнерах, а сертификаты и ключи зачастую хранятся отдельными файлами. 

Скачать iOS-приложение проще всего через десктопную версию iTunes, достаточно зайти в соответствующий раздел и кликнуть Install -> Download, и приложение будет сохранено на диск в файл с расширением ipa, по сути ZIP-архив.

По-видимому, для многих разработчиков не является очевидным, что опубликованное приложение становится публичным. Так, периодически встречаются Oauth-токены твиттера и прочих популярных сервисов. Показательным случаем было приложение, которое собирало контакты, фотки, видео и deviceID пользователей и сохраняло их в амазоновском облаке, и да — используя при этом токен, зашитый в одном из PList-файлов. Используя этот токен, без особого труда можно слить данные по всем пользователям (кстати, для работы с Амазоном есть удобный Python-фреймворк — mobo).

Еще достойна внимания популярная библиотека Urban Airship, которая позволяет гибко управлять push-уведомлениями через одноименный сервис. В мануалах ясно написано, что ни в коем случае master secret в приложении хранить нельзя, так как в опубликованном приложении не может быть секретов. Но мастер-секреты все равно встречаются :).

Для того чтобы исследовать приложение более глубоко, необходимо снять с него DRM. В настоящее время известен способ снятия DRM с приложения, но, к сожалению, возможен он только на устройстве с jailbreak, то есть о поточном снятии говорить здесь не приходится. Для этого широко применяются две техники:
Для тех, кто не хочет разбираться, есть полностью автоматический инструмента clutch.

Первое, на что стоит обращать внимание, — это сертификаты, среди которых можно найти как вполне безобидные корневые сертификаты, так и PKCS-контейнер с сертификатом разработчика…

Как бы по своей сути ни был мерзок вопрос лицензирования, но он нашел свое место и здесь. Многие разработчики используют в своих программах код фреймворков, которые бывают под лицензией GPL, требующей раскрытия кода. А как GPL работает с платными и бесплатными приложениями в App Store — вопрос, на который пока нет определенного ответа.

И самое, наверное, минорное — базовая проверка параметров безопасной сборки: PIE (Position Independent Executable — аналог ASLR в Windows, когда код приложения при каждом старте размещается по случайному адресу) и SSP (Stack Smash Protection — контроль целостности стека). Само по себе их отсутствие багом не считается, но в случае обнаружения бага в самом бинарнике теоретически можно создать эксплойт. Правда, случаев такой эксплуатации in the wild пока не зафиксировано.

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

Итого, у нас есть тысячи приложений, в которых находятся тупейшие баги, и это только в App Store. А что происходит в мире Android, еще только предстоит разобраться. Из-за отсутствия DRM для андроидных приложений как минимум возможно автоматизировать декомпиляцию и работать со статическим анализом уже псевдоисходного. Еще нужно как-то «приучать к лотку» разработчиков, чтоб они проверялись перед релизом хотя бы с помощью сервисов вроде hackapp.