Интро
Нормальные люди проводят ночи смотря фильмы, читая статьи, общаясь в социальных сетях или (да, я знаю — это странно) засыпая на кровати.
Я же провожу свои ночи читая документации и тестируя самые разнообразные приложения и сервисы.
Одной ночью я просто читал документацию о ссылках tel, так как я был в восторге от старых технологий, которые использовались до сих пор, их недостатков и того, что люди никогда не читали RFC, что и приводит их к RTFM PWNAGE (как я привык это называть).
Нужно пробовать
Как только я закончил читать документацию по tel — я посмотрел на свой iPhone и сказал: Круто, нужно пробовать! Я накодил маленькую HTML страницу и загрузил ее в Safari, вот код:
Как только я кликнул по ссылке — тут-же появилось диалоговое окно, которое спрашивало действительно ли я хочу позвонить по телефону 0000.
Apple
На данном этапе была только моя заинтересованность в ссылках tel, я не искал уязвимость. Но тут меня озарило: Apple очень сильно любит менять что-либо и делать вещи лучше, так может быть у Apple есть своя документация по TEL? И я был прав
Строка, в которую я влюбился
Документация Apple по ссылке tel очень короткая и легка к прочтению. Читая первый параграф, кое-что привлекло мое внимание:
Когда пользователь тапает по ссылке tel на странице, iOS показывает алерт, который спрашивает действительно ли пользователь хочет набрать номер телефона и инициализирует набор, если пользователь жмет по «Согласен». Когда пользователь открывает URL со ссылкой tel через установленное приложение, iOS не показывает алерт и инициализирует звонок без последующего подтверждения пользователем.
Оригинал
When a user taps a telephone link in a webpage, iOS displays an alert asking if the user really wants to dial the phone number and initiates dialing if the user accepts. When a user opens a URL with the tel scheme in a native app, iOS does not display an alert and initiates dialing without further prompting the user.
Поэтому если я кликну по ссылке в Safari — я получу окошко, которое будет спрашивать у меня действительно ли я хочу позвонить, но если я кликну по ссылке в webView установленного приложения — вызов начнется без моего подтверждения.
Читают ли люди документации?
Нет. И это печально
После прочитанного меня терзали сомнения относительно таких «больших игроков» как Facebook, Twitter, Google, LinkedIn и так далее. Я думал, что такие «гиганты» могли бы позаботиться о подобной мелкой «дыре», но, как оказалось, я был не прав.
Тестируем на приложении Facebook Messenger
Я отправил ссылку на страницу через Facebook Messenger, кликнул по ней, чтобы попасть через webView на созданную ранее страницу (социальные приложения не хотят, чтобы вы покидали приложение и именно поэтому такие приложения используют webView), а потом кликнул по ссылке «click me»:
Клик по ссылке инициирует звонок. Погодите-ка… это не очень хорошо.
Делаем ссылку самокликающейся
Множество людей считают, что такие вещи, как ссылки могут быть нажаты только пользователем. Как бы да не так! Используя хитрый, но простой до ужаса javascript скрипт, я сделал ссылку «самокликающейся».
Смотрите что происходит
Заметка: вы так-же можете делать редирект на стороне сервера, перекидывая пользователя по tel ссылке используя header(«Location: tel://0000»)
Можно ли считать это проблемой безопасности?
Я могу заставить вас набрать любой номер телефона единственным кликом по ссылке в любом приложении, в котором не отрегулирован процесс обработки tel ссылок. Поэтому да, это проблема безопасности.
Только представьте — я зарегистрировал платный номер телефона и отправил вам ссылку в Facebook Messenger или Twitter. Вы нажали и позвонили мне, я поднял трубку, чтобы снять с вашего счета немного денег.
Это не правильно! Кто же виноват?
Ну… Компания Apple не виновата. Люди вообще не читают документацию. Первый параграф по ссылке tel все до мельчайших подробностей расписывает — что, когда и как происходит, а также четко формулирует, что как бы то ни было установленные приложения могут быть настроены показывать свои собственные алерты.
Кто же не RTFM?
Facebook Messenger
Gmail
Google+
А теперь для всех…
Будьте осторожны
Пока я тестировал эту уязвимость только на нескольких приложениях больших компаний, можно также предполагать, что компании, и платформы помельче даже не думали о том, чтобы залатать эту уязвимость.
Примечание автора: Кстати, все тоже самое отлично проделывается и с iFrame.