Независимый исследователь обнаружил уязвимость, которая позволяла подобрать номер телефона для любого аккаунта Google. Проблема создавала серьезные риски фишинговых атак и атак на подмену SIM-карт.
Уязвимость нашел ИБ-исследователь, известный под псевдонимом BruteCat. Напомним, что в начале текущего года он рассказывал о другом баге, благодаря которому можно было узнать адрес электронной почты для любого аккаунта на YouTube.
Новая атака специалиста строится вокруг использования устаревшей формы Google с отключенным JavaScript (accounts.google[.]com/signin/usernamerecovery), в которой отсутствовали современные механизмы защиты от злоупотреблений.
Эта страница создавалась для того, чтобы помочь пользователям проверить, связан ли резервный адрес электронной почты или номер телефона с определенным отображаемым именем — display name (например, «John Smith»).
Как объясняет BruteCat в своем отчете, новая атака позволяет узнать номер телефона, который человек использовал, когда настраивал восстановление для аккаунта Google. В подавляющем большинстве случаев этот номер совпадает с основным телефонным номером жертвы.
Старая форма без JavaScript позволяла узнать, связан ли конкретный номер телефона с аккаунтом Google с помощью пары запросов, основываясь на отображаемом имени пользователя.
Исследователь без труда обошел примитивную защиту от массовых запросов, реализованную в этой форме, используя ротацию IPv6-адресов для генерации триллионов уникальных IP через подсети /64.
Обмануть CAPTCHA, которая отображалась при запросах, удалось, подставив в параметр bgresponse=js_disabled в действительный токен BotGuard, взятый из формы с поддержкой JS.
В итоге специалист создал брутфорс-инструмент, который перебирал диапазоны номеров, используя форматы, характерные для разных стран, и отфильтровывал ложные срабатывания.
Также BruteCat использовал решение libphonenumber от Google для генерации корректных форматов номеров, создал базу масок телефонных номеров разных стран для определения форматов номеров по регионам, а также написал скрипт для генерации токенов BotGuard через headless Chrome.
В результате получилось решение, способное осуществлять перебор со скоростью около 40 000 запросов в секунду. Таким образом, на поиск телефонных номеров в США требовалось около 20 минут, в Великобритании — 4 минуты, в Нидерландах — менее 15 секунд, а в Сингапуре — менее 5 секунд.
Чтобы провести атаку против конкретного человека, требовалось выполнить еще несколько дополнительных шагов. Дело в том, что еще несколько лет назад узнать чужой display name не составляло труда, но с 2023 года разработчики Google начали скрывать отображаемое имя, если перед этим не было взаимодействия между жертвой и атакующим, а в 2024 году практически полностью отключили отображение display name для большинства сервисов.
BruteCat обнаружил, что для обхода этих ограничений можно создать документ Looker Studio и назначить жертву его владельцем (используя ее адрес на Gmail). В этом случае отображаемое имя учетной записи Google появлялось в Looker Studio, где пользователь становился владельцем документа, без какого-либо взаимодействия с жертвой.
Вооружившись полученной информацией, атакующий получал возможность выполнять повторяющиеся запросы, чтобы извлечь все телефонные номера, связанные с конкретным display name.
Поскольку учетных записей с одинаковыми отображаемыми именами могли быть тысячи, исследователь сужал круг поиска, используя частичный номер телефона цели. Чтобы узнать частичный номер телефона жертвы, он воспользовался функцией «восстановления аккаунта» Google (https://g[.]co/AccountRecoveryRequest), которая позволяет увидеть две последние цифры номера, использующегося для восстановления (например, ** ******03).
«Время [брутфорса] можно значительно сократить за счет подсказок о номере телефона, взятых из процедуры сброса пароля в других сервисах (например, PayPal), которые показывают еще несколько цифр (например, +14*****1779)», — отмечает BruteCat.
Видеодемонстрацию эксплуатации этой уязвимости можно увидеть здесь.
Исходно BruteCat уведомил Google о проблеме через программу bug bounty в апреле 2025 года. Однако тогда разработчики Google сочли риски от уязвимости низким, и только 22 мая 2025 года компания повысила уровень опасности этой проблемы до «среднего» и применила временные меры для ее устранения. В итоге BruteCat получил за свою находку вознаграждение в размере 5000 долларов.
В конце прошлой недели, 6 июня 2025 года Google окончательно закрыла доступ у уязвимому эндпоинту без JavaScript. То есть осуществить описанную исследователем атаку уже нельзя, однако неизвестно, не использовались ли обнаруженные BruteCat проблемы злоумышленниками ранее.