ある脆弱性により、研究者は、プロフィール名と簡単に取得できる部分的な電話番号を知っているだけで、あらゆるGoogleアカウントの回復電話番号をブルートフォースすることができ、フィッシングやSIMスワッピング攻撃の大規模なリスクを生み出している。
この攻撃方法は、Googleユーザー名回復フォームのJavaScriptを無効にしたバージョンを悪用するもので、最新の悪用防止対策が施されていない。
この欠陥を発見したのはセキュリティ研究者のBruteCat氏で、同氏は2月にYouTubeアカウントの個人メールアドレスを暴露することが可能であることを実証した人物である。
BruteCatによると、この攻撃はユーザーがGoogleアカウントの回復用に設定した電話番号を取得するが、大半の場合、これはアカウント保持者の主要な電話番号と同じだという。
ブルートフォース・グーグル番号
BruteCatは、レガシーなJavaScript無しのユーザー名回復フォームにアクセスできることを発見した。
このフォームでは、2つのPOSTリクエストによって、ユーザーのプロフィール表示名(”John Smith”)に基づいて、電話番号がGoogleアカウントに関連付けられているかどうかを問い合わせることができた。
研究者は、IPv6アドレスローテーションを使用して、これらのリクエストに対して/64サブネット経由で何兆ものユニークなソースIPを生成することにより、フォーム上の初歩的なレート制限防御を回避した。
多くのリクエストで表示される CAPTCHA は、’bgresponse=js_disabled’ パラメータを JS が有効なフォームから有効な BotGuard トークンに置き換えることで回避された。

ソースはこちら:ブルートキャット
このテクニックを使って、BruteCatはブルートフォースツール(gpb)を開発した。
研究者は、Googleの「libphonenumber」を使用して有効な番号フォーマットを生成し、国別マスクデータベースを構築して地域別の電話フォーマットを特定し、ヘッドレスChromeを介してBotGuardトークンを生成するスクリプトを作成した。
1秒あたり40,000リクエストのブルートフォース速度では、米国の番号は約20分、英国は4分、オランダは15秒未満かかる。
.jpg)
ソースはこちら:ブルートキャット
誰かに対する攻撃を開始するには、フォームにメールアドレスが必要だが、グーグルは昨年からこれを非表示に設定している。
BruteCatは、Looker Studioのドキュメントを作成し、ターゲットのGmailアドレスに所有権を移すことで、それを取得できることを発見した。
所有権が移されると、ターゲットのGoogleの表示名がドキュメント作成者のLooker Studioのダッシュボードに表示され、ターゲットとのやりとりが不要になる。
この電子メールアドレスで武装すれば、クエリーを繰り返し実行し、プロフィール名に関連するすべての電話番号を特定することができる。
しかし、同じプロファイル名を持つアカウントは何千と存在する可能性があるため、研究者はターゲットの部分的な番号を使用して絞り込みました。
ユーザーの部分的な電話番号を取得するために、研究者はグーグルの “アカウント回復 “ワークフローを利用した。
「PayPalのような他のサービスのパスワードリセットフローから電話番号のヒントを得ることで、この時間を大幅に短縮することもできます。
Googleアカウントに関連する電話番号が流出することは、ユーザーにとって重大なセキュリティリスクを引き起こす可能性があり、ユーザーは標的型ビッシング攻撃やSIMスワップ攻撃の標的にされる可能性がある。
この不具合を悪用したデモは以下のビデオで見ることができる。
修正されたバグ
BruteCatは、2025年4月14日にGoogleのVulnerability Reward Program (VRP)を通じてGoogleに発見を報告した。
グーグルは当初、悪用される危険性は低いと考えていたが、2025年5月22日、この問題を「中程度の重大性」に格上げし、暫定的な緩和策を適用し、研究者に5,000ドルの開示報酬を支払った。
2025年6月6日、グーグルは脆弱なno-JSリカバリ・エンドポイントを完全に非推奨としたことを確認した。
攻撃ベクターはもはや悪用できないが、悪意を持って悪用されたことがあったかどうかは不明のままである。
.ia_ad { background-color:#width: 95%; max-width: 800px; margin: 15px auto; border-radius: 8px; border:1px solid #d6ddee; display: flex; align-items: stretch; padding: 0; overflow: hidden; }:0; overflow: hidden; } .ia_lef { flex: 1; max-width: 200px; height: auto; display: flex; align-items: stretch; } .ia_lef a { display: flex; width: 100%; height: 100%; } .ia_lef a img { width: 100%; height: 100%; object-fit: cover; border-radius: 8px 0 0 8px; margin: 0; display: block; } .ia_rig { flex: 2; padding:display: flex; flex-direction: column; justify-content: center; } .ia_rig h2 { font-size: 17px !important; font-weight: 700; color:#line-height: 1.4; font-family:margin: 0 0 14px 0; } .ia_rig p { font-weight: bold; font-size: 14px; margin: 0 0 clamp(6px, 2vw, 14px) 0; } .ia_button { background-color:#border:1px solid #3b59aa; color: black; text-align: center; text-decoration: none; border-radius: 8px; display: inline-block; font-size: 16px; font-weight: bold; cursor: pointer; padding:10px 20px; width: fit-content; } .ia_button a { text-decoration: none; color: inherit; display: block; } @media (max-width: 600px) { .ia_ad { flex-direction: column; align-items: center; text-align: center; } .ia_lef { max-width: 100%; } .ia_lef a img { border-radius: 8px 8px 0 0; } .ia_rig { padding:15px; width: 100%; } .ia_button { width: 100%; } .
Comments