January 10, 2021

История кражи переписки и контактов в iOS-приложениях mail.ru и myMail через XSS

Эта статья носит исключительно образовательный характер. Автор не несет ответственности за любые последствия ее прочтения.

Данная статья является переводом и ведется со слов автора. Оригинал тут.

В июне 2020 года я обнаружил Stored XSS, которая позволяет злоумышленнику украсть сообщения электронной почты и контакты пользователей в приложениях mail.ru и myMail на iOS (версия 12.2.1). Mail.ru - одна из крупнейших организаций в России, у которой зарегистрировано более 100 миллионов активных аккаунтов.

История ошибки

Ошибка возникает из-за отсутствия проверки в файле изображения SVG. Пример SVG XSS:

<?xml version="1.0" standalone="no"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg">
<polygon id="triangle" points="0,0 0,50 50,0" fill="#009900" stroke="#004400"/>
<script type="text/javascript">
alert("XSS");
</script>
</svg>

Когда пользователь просматривает файл SVG выше, появляется всплывающее окно XSS, как показано ниже.

Поиск ценных файлов

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

Во-первых, я просто подумал о дампе /etc/passwd как PoC, но в iPhone /etc/passwd - это просто фича песочницы, поэтому мне нужно получить что-то еще. К счастью, у меня есть iPhone 5 с джейлбрейком, поэтому я могу просматривать все файлы и папки на iPhone. Данные приложения в файловой структуре iOS хранятся в /private/var/mobile/Containers/Shared/AppGroup/ после чего следует случайная папка, как показано ниже.

Я спросил себя, как узнать, в какой папке находятся данные приложения mail.ru. Имя папок не будет одинаковым на каждом iPhone (сама папка и некоторые файлы внутри этой папки останутся прежними), и я понял, что мне нужно получить путь к папке через XSS. Итак, я использовал alert(location.href); в файле SVG и отправил себе письмо, после чего получил расположение папки.

Затем я перехожу к этой папке и вижу несколько файлов базы данных SQLite + несколько папок.

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

Итак, я решил получить эту базу данных SQLite на свой сервер. Если я смогу получить её, этого будет достаточно, чтобы показать влияние данной XSS уязвимости, и я могу сообщить о ней с помощью хорошего PoC на mail.ru. Я начинаю писать свой PoC-скрипт, просматривая созданный SVG-файл на своем iPhone (у которого нет джейлбрейка), и да, я могу проверить, существование файла через вывод содержимого во всплывающем окне.

Устранение ошибок и написание работающего PoC

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

Скрипт сначала определяет расположение папки mail.ru, читает папку mail_cache.sq3, а затем загружает весь файл на сервер, контролируемый злоумышленником. Затем я отправляю этот SVG-файл пользователю, который использует приложения mail.ru и my.com. Если пользователь просмотрит созданный злоумышленником файл SVG, его база данных SQLite (содержащая сообщения электронной почты, контакты и т. д.) будет отправлена ​​злоумышленнику, и злоумышленник сможет просматривать сообщения электронной почты, контакты и т. д., как показано ниже.

Заключение

Я быстро сообщил об этой уязвимости в Mail.ru и получил 1000 долларов в качестве награды. Спасибо за вознаграждение :).

Менеджер программы сказал, что это не уязвимость Stored XSS, а ошибка - Cross application scripting (CAS). Насколько я понимаю, уязвимость, которая может выполнять JavaScript в iOS, называется XSS. Может я ошибся или ..

На этом все. Спасибо за просмотр.

Подпишись на канал - https://t.me/slivmens