概要
- Googleアカウントの ユーザー名回復フォーム が、JavaScript無効でも動作することを発見
- BotGuardトークン の仕組みを利用し、電話番号のブルートフォース攻撃が理論的に可能
- IPv6アドレス の大量利用でレートリミット回避を試みるも、追加の対策あり
- Looker Studio経由で 表示名リーク が可能
- ベンダーへの報告と 対応のタイムライン を記載
Googleアカウント ユーザー名回復フォームの脆弱性調査
- 2024年時点で、Googleの ユーザー名回復フォーム がJavaScript無効でも利用可能
- 通常、 BotGuard によるJSベースの証明が必要と考えられていたが、No-JSフォームも動作
- フォームは、 リカバリーメールや電話番号 が特定の表示名に紐付いているか確認可能
- 2つのHTTPリクエストで判定
- 1回目:リカバリー情報入力で ess値 取得
- 2回目:ess値と表示名でアカウント存在確認
- レスポンスのリダイレクト先で アカウント有無判定
ブルートフォースの可否とレートリミットの回避
- 通常は IPアドレス単位でレートリミット +CAPTCHA表示
- プロキシ利用やIPv6アドレス大量生成 で回避を試みる
- Vultr等のクラウドで/64レンジを活用し、 18京以上のアドレス でIPローテーション
- 実際は データセンターIP には常時CAPTCHA表示で突破困難
BotGuardトークンの活用と突破方法
- JS有効フォームで取得した BotGuardトークン をNo-JSフォームに流用
- bgresponse=js_disabled を BotGuardトークン に置換して送信→CAPTCHA回避に成功
- レートリミットも実質無効化
実際のブルートフォース手法
-
オランダ携帯番号(+31 6xxxxxx03)のように 桁数が限られる場合、総当たりが現実的
-
gpbツール を使い、数千スレッドでチェック
-
ヒット時は、同一表示名・電話番号下2桁が一致するアカウントのみ
- 表示名のみでヒットする場合もあるため、 ランダム姓でバリデーション を追加し精度向上
追加課題と最適化
- 被害者の 国番号特定 は、Googleのパスワードリセット時の 電話番号マスク から判別可能
- libphonenumbersの national format を利用し、各国のマスクパターンを収集
- 表示名の取得 は2024年4月以降困難化
- 例外的に Looker Studioの所有権移譲 で表示名リーク可能
- libphonenumbers によるリアルタイムバリデーションで無効番号のAPIリクエスト削減
- BotGuardトークン自動生成API も実装
攻撃チェーンまとめ
- Looker Studioで 表示名リーク
- パスワードリセットフローで 電話番号マスク取得
- gpbツールで 総当たり攻撃実施
ブルートフォース所要時間の目安
- $0.30/時サーバー(16vCPU)で 約4万件/秒 のチェック速度
- 下2桁のみ判明時の所要時間例
- 米国 (+1):20分
- 英国 (+44):4分
- オランダ (+31):15秒
- シンガポール (+65):5秒
- PayPal等他サービスのヒントでさらに高速化可能
ベンダー報告と対応タイムライン
- 2025-04-14 :Googleへ報告
- 2025-04-15 :トリアージ
- 2025-05-15 :初回報奨金$1,337+スワッグ
- 2025-05-22 :追加報奨金$3,663、合計$5,000+スワッグ
- 2025-05-22 :緩和策導入・エンドポイント廃止開始
- 2025-06-06 :No-JSフォーム完全廃止確認
- 2025-06-09 :レポート公開
今後の課題・連絡先
- 電話番号・表示名のリーク 対策の強化
- BotGuardトークンの取り扱い 厳格化
- 連絡先:筆者まで