— У нас дыра в безопасности.
— Ну, хоть что-то у нас в безопасности.
— Айфоны, вон, каждый год ломают, и ничего.
Я нашел эту ошибку случайно. Уверен, что ни один тестировщик и не подумал бы пойти таким путем — это настолько не очевидно, дико и непредсказуемо, что только случайность помогла мне поучаствовать в bug bounty от Xiaomi. В этом посте расскажу о том, как мне это удалось, что за это было и почему китайские сервисы — зло.
Предыстория
В операционке MIUI можно создать два «пространства» (для простоты я буду называть их профилями) — полностью независимых набора настроек, приложений и файлов, недоступных друг из друга (не считая отдельного приложения «Импорт»). Оба профиля можно запаролить и, допустим, пользоваться устройством с кем-то еще.
В чем, собственно, замес?
Замес в том, что я нашел способ переходить из второго профиля в первый без ввода пароля. Это было возможно через приложение Google Диска, которое по умолчанию установлено в глобальной прошивке на MIUI 8 и сразу доступно во втором профиле.
Второй профиль имеет меньше прав, чем первый — в нем, например, нельзя включать-отключать мобильный интернет или управлять резервными копиями в Google Диске. Если попытаться это сделать, приложение предлагает сходить в системный диалог «Manage Users» и выбрать пользователя, от имени которого совершается действие.
Но что-то пошло не так, и выбор главного профиля в этом окне приводил не к управлению резервными копиями, а к переходу в него без ввода пароля.
Сомнительная аналитика #1
В принципе, ничего страшного. Для эксплуатации уязвимости нужно, как минимум, знать один из паролей и иметь физический доступ к телефону. Но даже в рамках какого-то ограниченного коллектива получение доступа к данным, хранимым во втором профиле, может быть крайне неприятным.
С другой стороны, я не успел толком исследовать принцип появления экрана «Manage Users». Вероятно, есть системные методы для его вызова и из других приложений, но так далеко я не заходил.
Как с этим жить?
Сначала я думал заявить это как баг гуглового приложения (я слышал, что они иногда дают деньги за это). Но здравый смысл все-таки подсказал, что дыра в безопасности операционки может быть оценена дороже (да и фиксить ее нужно быстрее), и я пошел искать программу для баг баунти от Xiaomi.
Недолгие поиски привели меня в Xiaomi Security Center. Это сейчас туда худо-бедно процентов на 30 добавили английский перевод, а тогда он выглядел примерно так:
Xiaomi Security Center, sec.xiaomi.com
С гугл-переводчиком я почитал какие-то общие вещи про программу и понял, что найденная уязвимость тянет на категорию High — к ней относят SQL-инъекции, уязвимости в бизнес-логике, XSS с доступом к cookie, получение информации о пользователях устройства, эскалацию привилегий, обход экранов логина и еще несколько вещей. «Окей», подумал я, методом тыка нашел форму и пошел описывать проблему.
Форма отправки уязвимости
Встроенный в хром гугл-переводчик хорош ровно до момента, когда дело доходит до динамически формируемых выпадающих списков. Если поля title, description, proof-of-concept и solution были еще как-то понятны, то, что от меня хотели в списках, я не понимал совсем. Пришлось выковыривать иероглифы из нужных мест страницы через просмотр HTML-кода и переводить вручную.
Спасибо, теперь все понятно
Оказалось, что первый список определял тип уязвимости, второй конкретизировал ее, а в третьем нужно было выбрать масштаб проблемы — от low до major.
Я, естественно, написал что проблема крайне важна и дайте мне скорее денег уже терпеть нет сил я же такой молодец. Для подтверждения намерений я записал пятиминутное видео, где на ломаном английском рассказал, как эксплуатировать уязвимость и легко получить доступ к личным данным. Отправил информацию об уязвимости и способах ее устранения (шестого апреля) и стал ждать.
Сколько пришлось ждать?
11 апреля прямо в Security Center я получил сообщение от безымянного сотрудника Xiaomi.
Оно было таким:
> Thanks for your submission,this is not miui's issue so this got minor and no reward.Thanks for your support.
> Спасибо за отправку, это не проблема miui, она помечена незначительной и останется без награды. Спасибо за поддержку.
«Да как же так? Но это! Же! Дыра! Размером! С! Кимберлитовую! Трубку! В Якутии!» — примерно так я негодовал следующие четыре часа, а потом успокоился и написал ответное сообщение. Вот такое:
> Miui allows to view «manage users» screen and switch account without pass. anyway, do you have plan to fix this issue?
> В MIUI можно попасть на экран «Управление пользователями» и переключаться между аккаунтами без пароля. В любом случае, вы планируете устранять проблему?
Я был морально готов ждать еще пять дней (раз уж я все равно остался без награды), но ответ пришел через час:
> sorry,my mistake ,I will test again
> Простите, виноват. Проверю еще раз.
Сомнительная аналитика #2
Из-за «ошибки» оператора дыра могла быть закрыта примерно через бесконечность. Не знаю, как это работает в других программах поиска уязвимостей, но такой подход в Xiaomi явно настраивает на удручающие мысли.
Ошибку, тем не менее, исправили уже через две недели после перетеста — в свежем апдейте системы такой трюк уже не повторялся. По этой же причине сейчас пишу этот пост.
К счастью, тестирование не заняло много времени и на следующий день я получил вознаграждение в 1000 (тысячу) монет в магазине внутри Security Center.
Что еще за магазин?
На sec.xiaomi.com есть каталог вещей, которые можно купить за внутреннюю-безопасностную-валюту-победы (извините, я просто не придумал объяснения проще).
Ни в чем себе не отказывайте на тысячу призовых монет
Поняв, что ничего дельного из товаров выбрать не получится, я начал изучать еще одну интересную опцию — можно было «купить» юани за монеты, по курсу 1 юань за 1,5 монеты. Быстрый подсчет показывал, что моя тысяча монет лихо превращалась примерно в 5200 рублей (по курсу на момент написания статьи), и это выглядело очень хорошим вознаграждением за нажатие на пару кнопок в сомнительных местах системы.
Конечно же, я набил корзину юанями за 900 монет (квантизация по 150).
Конечно же, нажал на китайскую версию надписи «Оформить заказ».
И, конечно же, сразу столкнулся с кучей проблем.
Здесь был бы скриншот формы, если бы я его не потерял
Они требовали от меня имя, номер банковской карты и CVV номер ID.
Китайская форма ввода имени
Ни имя, ни номер российского паспорта не подходили — китайский номер ID содержит от 12 до 16 символов, а для имени отводилось всего от 2 до 6.
Но после пройденного награду упускать не хотелось, и я решил написать письмо в техподдержку и узнать, как выводят деньги иностранцы (которых, судя по никам ловцов уязвимостей, было много). Окей, с переводчиком ищем нужный раздел, заходим…
… черт.
Ладно, пришлось выбирать товары. В тысячу монет вместились умная лампа, умная 360-градусная камера и bluetooth-колонка. Вместе они стоят около 7200 рублей (или 124 доллара).
Оставшиеся три десятка монет я проиграл в «колесе удачи» там же на сайте.
Благо с оформлением проще, и пришлось просто придумать, как вместить адрес международной доставки в поле с ограничением в 100 символов, а также сократить имя до шести букв — Evgeny, а полное написать в «Notes».
Заканчивался июль.
А долго мне еще ждать?
После заполнения формы в личном кабинете не изменилось ничего. Первого августа решил все-таки уточнить, что там с доставкой, и написал сообщение в тот же диалог, где сообщал об уязвимости. Ничего не произошло.
Двадцать пятого августа я сделал еще одну попытку, и через пять дней получил ответ с треком посылки и извинениями.
Доставка заняла еще неделю, и я наконец-то получил посылку с наградой за баг баунти в Xiaomi. Приятно, что курьер из EMS доставил ее до двери и не пришлось никуда ехать. Happy end.
В комментариях готов ответить на ваши вопросы о любых этапах этого растянутого во времени процесса.
Спасибо за внимание!
Автор: Евгений Шкляр