23.06.2014

Безопасность IOS-приложений (часть 30) – Атака при помощи URL-схем

image

В этой статье мы рассмотрим методики эксплуатации уязвимостей в IOS-приложениях, связанных с URL-схемами. URL-схемы используются приложениями для взаимодействия друг с другом.

Автор: Пратик Джианчандани (Prateek Gianchandani)

В этой статье мы рассмотрим методики эксплуатации уязвимостей в IOS-приложениях, связанных с URL-схемами. URL-схемы используются приложениями для взаимодействия друг с другом. Каждое приложение может зарегистрировать свою схему. Например, приложение Damn Vulnerable iOS application использует URL-схему dvia. Это означает, что любой URL, начинающийся с протокола dvia:// запустит приложение dvia. В зависимости от параметра и оставшейся части url приложение dvia может выполнять определенные действия. Другой пример: приложение для телефонных звонков использует схему tel, и при использовании URL’а tel://1-393-222-2222 приложение запустится и совершит вызов по указанному номеру. Основные проблемы возникают тогда, когда url не проверяется или пользователь не оповещается о совершаемом действии перед тем, как приложение будет выполнять задачу в соответствие со схемой.

Поначалу необходимо найти url-схему, которая закреплена за приложением. Об этом можно узнать из файла info.plist, который находится в песочнице, при помощи любого файлового менеджера (например, iExplorer).

Рисунок 1: Открытие info.plist с url-схемой

Здесь мы видим, что за приложением DVIA закреплена схема dvia.

Рисунок 2: Внутри файла info.plist находим URL-схему

Одно приложение может использовать более одной схемы. Например, на картине ниже видно, что приложение Facebook использует восемь URL-схем.

Рисунок 3: За одним приложением закреплено более одной URL-схемы

Далее необходимо выяснить полную структуру URL, используемую приложением для выполнения определенных действий. Здесь можно пойти несколькими путями в зависимости от ситуации. Один из самых простых способов – поискать строки в приложении, начинающиеся с URL-схемы. Сделать это можно при помощи команд, работающих со строками, или утилит наподобие Hopper. Не забывайте о том, что если вы загрузили приложение из App store, то вам необходимо расшифровать бинарный файл при помощи clutch. Я скопировал к себе исполняемый файл приложения Whatsapp и открыл его в Hopper. Это приложение использует URL-схему whatsapp://. Попробуем найти строки, содержащие эту схему.

Рисунок 4: Поиск строк, содержащих схему whatsapp://

По результатам поиска мы примерно можем понять полную структуру URL, используемую приложением. Например, можно открыть url (к примеру, в браузере) whatsapp://image/xyz и посмотреть, как на него среагирует приложение.

Еще один способ найти структуру URL, которая используется приложением, - изучить специальный метод класса App Delegate, который обрабатывает входящий URL:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

Таким образом, нам необходимо изучить реализацию этого метода и его псевдокода при помощи Hopper.

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

Одна из наиболее известных уязвимостей, связанная с URL-схемами, была найдена в Skype, когда приложение не проверяло URL’ы типа таких skype://14085555555?cal и осуществляло вызов по соответствующему номеру также без какой либо проверки. Более подробно об этой уязвимости можно прочитать здесь.

Есть несколько способов того, как злоумышленник может заставить пользователь использовать URL, сформированный определенным образом. Хакер может подсунуть пользователю веб-страницу, содержащую такой javascript-код:

<script>document.location=’tel://1123456789′<script>

Или iframe:

<iframe src=”tel://1123456789″></iframe>

Если в приложении нет проверки входящего URL, то это может привести к уязвимости. 

или введите имя

CAPTCHA