Yandexの2要素認証はどのように機能しますか?
QRコードがブラウザーに表示され、ユーザーが特別なアプリケーションでスキャンすると、ブラウザーはすぐにそれを感じてユーザーを認証します。
QRコードは、次のようなリンクに復号化されます。
yandex.ru/promo/2fa?track_id=38e701d0bb5abaf50d381c3f95e0f341a8
これらすべての中で、QRコードWebページは認証を待機している間、常にサーバーをポーリングします。
POST /auth/magic/status/ HTTP/1.1 Host: passport.yandex.ru track_id=38e701d0bb5abaf50d381c3f95e0f341a8
ユーザーがYandexアプリケーションによってQRコードをスキャンするとすぐに、そのようなリクエストはCookieをブラウザに返します。
ここで問題は何ですか?
クッキーを受信するには、同じIDが使用され、QRコードでエンコードされます。
リンクのtrack_idパラメーターとPOSTリクエストの同じパラメーターに注意してください。
これは、攻撃者がユーザーの肩からQRコードを覗き見、セッションIDを彼から取得し、多くの場合、ブラウザーのふりをして同じリクエストを行うことができることを意味します。
また、ハッカーが被害者の前でセッションを取得できた場合、ハッカーはすぐにユーザーのアカウントに入ります。
この脆弱性を示すシンプルなAndroidアプリケーションをひざの上に書いた。
被害者がアプリケーションを起動してPINコードを入力している間に、被害者の背後に立ち、QRコードをスキャンする時間があるだけで十分です。
ログインすると、アプリケーションは被害者のメールボックスを表示します。
アプリケーションは、 github.com / dm77 / barcodescannerライブラリを使用してQRコードをデコードし、Yandexに対してPOST要求を迅速かつ迅速に行い、Cookieを受信し、WebViewでそれらを置き換え、Yandex.Mailを開きます。
攻撃を成功させるには、スマートフォン上で比較的高速なインターネット接続が必要であり(被害者の前にCookieを取得するため)、デバイスに適切なカメラが必要です。 私のコードは1メートルの距離から正常に認識されましたが、実験的な友人は何も気づかず、電話でメールを見せたときにこのトリックに非常に驚きました。