Наконец-то Яндекс запилил двухфакторную аутентификацию. Я не ждал подвоха, но, похоже, зря.
Как работает двухфакторная аутентификация Яндекса?
В браузере отображается QR-код, юзер сканирует его специальным приложением, браузер сразу это чувствует и авторизует пользователя.
QR-код расшифровывается в ссылку вот такого вида:
yandex.ru/promo/2fa?track_id=38e701d0bb5abaf50d381c3f95e0f341a8
Внутри всего этого веб-страничка с QR-кодом постоянно опрашивает сервер в ожидании авторизации:
POST /auth/magic/status/ HTTP/1.1
Host: passport.yandex.ru
track_id=38e701d0bb5abaf50d381c3f95e0f341a8
Как только пользователь отсканирует приложением Яндекса QR-код, следующий такой запрос отдаст браузеру куку.
В чем здесь проблема?
Для получения куки используется тот же ID, что закодирован в QR-коде.
Обратите внимание на параметр track_id в ссылке и такой же параметр в POST-запросе.
Это значит, что злоумышленник может подсмотреть из-за плеча пользователя его QR-код, достать из него ID сессии, и, притворившись браузером, выполнять часто-часто такой же запрос.
И если хакер раньше жертвы успеет получить сессию — он сразу окажется в аккаунте пользователя.
Я написал на коленке простенькое приложение под Android, которое демонстрирует эту уязвимость.
Достаточно встать за спиной жертвы и успеть отсканировать qr-код раньше нее, пока жертва запускает приложение и вводит пин-код.
После того, как она авторизуется, приложение покажет вам почтовый ящик жертвы.
Приложение декодирует QR-код с помощью библиотеки github.com/dm77/barcodescanner, быстро-быстро делает POST запросы к Яндексу, получает куки, подставляет их в WebView и открывает в нем Яндекс.Почту.
Для успешной атаки требуется относительно быстрый интернет на смартфоне (чтобы успеть получить cookie раньше жертвы) и желательна хорошая камера на устройстве. У меня код успешно распознавался с расстояния до метра, при этом мои подопытные друзья ничего не замечали и очень удивлялись этому фокусу, когда я им показывал их почту на своем телефоне.
Автор: zuyac