YouTubeユーザーのメールアドレス漏えい脆弱性で1万ドルの報奨金を受領
(brutecat.com)- YouTubeチャンネルの内部Googleアカウント識別子である obfuscated Gaia ID が露出し、これをPixel Recorder共有APIでメールアドレスに結び付けられるため、Googleアカウントのプライバシー問題となっていた
- ライブチャットのブロックメニューのInnertubeリクエストは、実際にブロックしなくても対象チャンネルの Gaia ID を含む
moderateLiveChatEndpointパラメータを返していた - リクエストパラメータのチャンネルIDを差し替えると、ライブチャットメッセージのない Topic Channel にまで対象を広げられ、特定の参加者に限られた問題ではなかった
- Pixel Recorderの
WriteShareListは共有対象の obfuscated Gaia ID を受け取り、レスポンスに メールアドレス を含んでおり、さらに250万文字の録音タイトルで通知メール送信も防げた - Googleは2024年9月15日に報告を受けた後、2025年2月9日に2つの脆弱性の修正を確認し、合計 $10,633 の報奨金を支払った
YouTubeのブロック機能で露出したGaia ID
- GoogleのInternal People APIステージングdiscoveryドキュメントから、
BlockedTargetオブジェクトが obfuscated Gaia ID とfallbackNameを使うことが確認されたprofileIdはブロック対象ユーザーの obfuscated Gaia IDfallbackNameはブロックされるユーザーの表示名
- GoogleアカウントのヘルプにはYouTubeでアカウントをブロックできる案内があり、実際にYouTubeライブ配信でユーザーをブロックすると、そのユーザーは
myaccount.google.com/blocklistに表示された - ブロックリストにはチャンネル名
Mega PrimeがfallbackNameとして、107183641464576740691が profile ID として表示された - YouTubeチャンネルが基盤となるGoogleアカウントを露出させるべきではないという前提のもと、過去にもGaia IDをメールアドレスへ変換するバグがあったため、追加の経路を探し始めた
ライブチャットメニューから全チャンネルへ拡大
- YouTubeライブチャットで三点メニューを開くだけで、
/youtubei/v1/live_chat/get_item_context_menuリクエストが発生した - レスポンスには
/youtubei/v1/live_chat/moderateへつながるmoderateLiveChatEndpointとparams値が含まれていた - この
paramsはGoogleでよく使われる base64エンコードされたprotobuf で、デコードするとブロック対象ユーザーのGaia IDが入っていた- 例のレスポンスには
113907466537670370590とチャンネル関連の識別子が含まれていた - 実際にブロックを実行しなくても対象のGaia IDを取得できた
- 例のレスポンスには
get_item_context_menuリクエストパラメータをデコードすると、ブロックしようとしているチャンネルの channel ID、ライブ配信動画ID、ライブ配信投稿者IDが含まれていた- リクエストパラメータ内のチャンネルIDを別の値に差し替えて試した結果、YouTubeが自動生成した Topic Channel のGaia ID
103261974221829892167も取得できた- Topic Channelは YouTubeが自動生成 するもので、ライブチャットメッセージがないことを前提にテストされた
Pixel Recorderがメール変換経路になった
- 古いGoogle製品でGaia IDをメールアドレスに変換できるバグやロジック欠陥を探す中で、nathanとともに Pixel Recorder を調査した
- Pixelスマートフォンでテスト録音を作成してGoogleアカウントに同期し、その後Webの
recorder.google.comエンドポイントを使用した - 録音をテスト用メールアドレスに共有する際、
WriteShareListリクエストは共有対象リストに obfuscated Gaia ID を含んでいた pixelrecorder-pa.clients6.google.comのPlaybackService/WriteShareListレスポンスは、その共有対象のメールアドレスを返した- テストレスポンスには
vrptest2@gmail.comが含まれていた - YouTubeブロック実験で得た
107183641464576740691Gaia ID を入れた場合でもredacted@gmail.comが返された
- テストレスポンスには
- これにより、YouTubeで得たGaia IDをPixel Recorder共有APIに入れてメールアドレスを突き止める攻撃チェーンが可能になった
通知メールを防いだ250万文字の録音タイトル
- Pixel Recorderで録音を被害者と共有すると被害者に通知メールが送信されるため、攻撃の影響度が下がる可能性があった
- 共有ポップアップには通知を無効化するオプションがなく、req2proto でリクエストprotobufを解析しても通知無効化フィールドは見つからなかった
WriteShareListRequest構造には次のフィールドがあったrecording_iddelete_obfuscated_gaia_idsupdate_shared_userssharing_message
- ユーザーを同時に追加・削除してもメールは送信され続けた
- 通知メールの件名に録音タイトルが含まれる点を利用し、録音タイトルを極端に長くすればメール送信が失敗する可能性があると判断した
UpdateRecordingTitleエンドポイントで録音タイトルを 250万文字 に変更するPythonスクリプトを作成してテストしたところ、サーバー側にはタイトル長の制限がなかった- タイトルを250万文字に設定した後で別のテストユーザーに共有したところ、通知メールは送信されなかった
最終PoCと対応スケジュール
- 完成した攻撃チェーンは3段階で構成されていた
- YouTube Innertube
/get_item_context_menuエンドポイントで対象チャンネルの obfuscated Gaia ID を取得する - 非常に長いタイトルを持つPixel Recorder録音を対象と共有し、Gaia IDをメールアドレスへ変換する
- Pixel Recorder録音の共有対象からそのユーザーを削除して後始末する
- YouTube Innertube
- PoC動画は YouTube動画 で提供されている
Googleの報奨金と修正タイムライン
- 2024-09-15: ベンダーへ報告を送信
- 2024-09-16: ベンダーがレポートをtriageし、
Nice catch!という返答を受けた - 2024-10-03: パネルが既存追跡バグの重複として扱い、初期のYouTube obfuscated Gaia ID露出に対する不完全なパッチを実施
- 2024-10-03: Pixel Recorder自体も脆弱性であることをベンダーに再説明
- obfuscated Gaia ID はGoogle MapsやGoogle Playレビュー投稿者でも露出し得た
- YouTubeチャンネルの obfuscated Gaia ID を再び漏えいさせる回避手法も提供された
- 2024-11-05: パネルが $3,133 の報奨金を支給
- 根拠は悪用可能性が中程度
- 高影響のabuse-related methodologyに分類
- 2024-12-03: 製品チームが追加報奨の検討のためレポートをパネルへ差し戻し、2025-02-03の公開日程を調整
- 2024-12-12: パネルが $7,500 の追加報奨金を支給
- 根拠は悪用可能性が高い
- 高影響のabuse-related methodologyに分類
- 攻撃チェーンの複雑さのため、基本金額から1段階引き下げて適用
- 2025-01-29: ベンダーが公開日程を2025-02-02まで延長するよう要請
- 2025-02-09: 攻撃チェーンの2つの部分がどちらも修正済みであることを確認
- 最初の報告から 147日 が経過した時点
- 2025-02-12: レポート公開
1件のコメント
Hacker Newsのコメント
タイトルが紛らわしかった。記事を最後まで読んでいない人のために言うと、漏えいしたメールによって費用がかかったのではなく、時間と機転を費やしてバグ報奨金1万ドルを受け取ったという話
責任ある開示、動機、報酬についての雑音は多いが、これが中央集権的な永続的アイデンティティに反対するもう一つの根拠だという話はあまり見ない
あるサービスがReal Identity™ひとつにだけ結び付けられていると最もうまく機能すると主張するたびに、企業はユーザーを実際に保護することには抽象的にしか関心がなく、それすらたまにしかないのだと思わされる
YouTubeでやり取りする誰もが、即座に個人特定へ3、4段階近づけると想像してみると、このバグの実際の影響はその程度だと思う。修正されてよかったが、この種のバグが近いうちになくなるとは思えない。こうした設計が爆発寸前の地雷原だと企業や大企業に気づかせるには、何が必要なのだろう
ただし、多くの人は実際のお金でこうした企業と取引している。たとえばYouTube Premiumの購読者やコンテンツ制作者などがそうだ。実務上は、その使い捨て可能なアカウントのどこかに、現実の身元識別子を保存せざるを得ない。詐欺リスクと銀行業務の現実のために、実際の身元と住所を企業に渡すことになり、企業もそれを保存する
ランダムなアプリやWebサイトには個人を識別できる情報を渡さないが、自分が取引する相手は必然的に現実の自分を知っており、理論上はそのデータが漏れ得る地点になる
医療サービス提供者が医療データを漏えいさせたら、完全に叩きのめされるだろう
「動作するエクスプロイトのPOCです: この動画はYouTubeの利用規約違反により削除されました」だなんて笑える
このスレッドの3つ目ごとのコメントが「Googleはこのバグに対して支払いが少なすぎる」という話なので、脆弱性の価値評価について基本的な話をすると、次のようになる。
サーバー側の脆弱性は、業者同士が競合しないため価値が低い。サーバー側の脆弱性には、実質的にグレーマーケットがない。Googleが即座に潰せて、発見された瞬間に半減期がほとんどなく、悪用すれば対象側で信頼できるテレメトリが発生するようなバグに、第三者が値段を付けるのは難しい。
逆に、Android/Chromeのフルチェーンのようなバグが数十万ドルで売れるのは、Googleが成熟したグレーマーケットと競合しているからだ。ある業者がそのバグを入手して、欧州の一国にある複数の機関、場合によっては6か所に売ることができる。
とはいえ、バウンティとグレーマーケットはリンゴとオレンジの比較だ。Googleが必要としているのは信頼性の高いエクスプロイトではなく「書ける」という証拠だけで、保守費用も不要なので、グレーマーケットよりはるかに少なく支払う。市場全体の総額は複数の段階に分かれ、リスク条件も付くが、Googleは割り引かれていても魅力的な一時金を提示できる。
攻撃者は既存の事業プロセスに合う脆弱性を買う。一般に、ある新しい脆弱性でできる格好いいことや稼ぎ方を投機的に想像するわけではない。決済情報の収集、ボットネット用に数千台を確保することは既存の事業プロセスだ。Googleアカウントの実名露出はビジネスになり得るか? 可能かもしれない。既に存在するか? おそらくない。
バウンティの支払額は、たいていそのバグがどれほど賢いか、興味深いかについての国民投票ではない。ただしここでは少しそういう面もあり、サーバー側のWebバグに1万ドルというのは異例に高く感じる。
こうしたバグを見つけて生計を立てる人にとっての事業戦略は、数多く見つけることに熟達することだ。1つの信頼性の高いエクスプロイトに何か月も費やすiOSエクスプロイト開発とは違う。
最近のキャリアでやっていた脆弱性研究が、他の多くの作業よりこちらに近かったので、かなり自信はある。それでもHNにはこうしたバウンティ作業をフルタイムでやっている人がいるので、そういう人が訂正してくれるならうれしい。
この分析を他のものに当てはめると、新しいカーオーディオや自転車の上限価格は約100ドルになり、著作権のあるあらゆる財の価格はネットワークで転送するコストに制限されることになる。
Googleが支払った金額を、この作業に費やした時間と、前回のバウンティ以降に失敗したすべてのエクスプロイト試行時間で割るほうが有用だと思う。
この分野の大多数は、努力に対して米国の最低賃金未満しか稼げず、年間6桁ドルの機会費用を払っているように思う。
その数字は、Googleがエンドユーザーのセキュリティとプライバシーをどれほど価値あるものと見ているかを正確に示している。同じ人々の個人情報を盗ませるために他のエンジニアへ何桁も多く支払うより、はるかに低い数字だ。
彼らにとっては追加の収入源だからだ。ソフトウェアエンジニアが高報酬の職業であってほしいと望むのと同じように、バグバウンティも高くなってほしいと思っている。労働者が自分の職業の賃金をもっと要求するのは自然で、どんな正当化もその本能を変えることはない。
攻撃者市場での価値とは別の誘因もある。オンライン有名人をストーキングする暴力的な人物は、こうしたゼロデイエクスプロイト市場では収益性の高い顧客ではないかもしれないが、企業が不注意に対象者の身元を暴力的なストーカーにさらし得るなら、その脆弱性は依然として責任と倫理上のリスクだ。
個人的には、セキュリティへの注意が不完全なまま膨大な量のコードを量産するLeetCodeパフォーマンスアーティストたちに巨額の金を払っているなら、悪いことが起こる前に彼らの数多くのミスを見つけて直すのを助ける人たちにも、きちんと払うべきだと思う。
「必要な攻撃チェーンの複雑さのため、基本額から1段階引き下げ適用」とあるが、これはよくあることなのか?
脆弱性プログラムにはいくつか参加しただけだが、多くはページソースにユーザーのメールアドレスが露出しているような、呆れるほど単純だが深刻な欠陥だと、むしろ報酬が少なかった。
「少し前にGoogleで研究対象を探していて、Internal People API (Staging) discoveryドキュメントを掘っていた」とあるが、これは単に公開されていてよいものなのか: https://staging-people-pa.sandbox.googleapis.com/$discovery/...
.proto定義から自動変換されたスキーマファイルにすぎない。Googleは曖昧さによるセキュリティではなく、実際の暗号技術に依存している。さらに、discoveryエンドポイントは公開ドキュメント化されており[0]、外部ユーザー向けに作られたものだ。内部の人間はdiscoveryエンドポイントを読まず、コード検索で
.protoファイルを直接見るはずだ。Googleで働いた経験からすると、APIを公開にさらすには官僚的手続きと何週間も戦わなければならなかった。偶然公開されたAWS S3バケットのようなものではない。チームはこれが公開であることを知っており、公開するために官僚制を突破したはずだ。
[0]: https://developers.google.com/discovery/v1/getting_started
投稿のタイムラインを見ると、2024-09-15に企業へ報告し、2025-01-29に企業が2025-02-12までの公開延期を求め、2025-02-09にエクスプロイトの両側がどちらも修正されたことを確認し、2025-02-12に公開したとのこと。
つまり136日間修正されず、Googleが延長を求めたということではないか。修正まで147日、公開まで150日である。
Google Project Zeroが他社に与える修正前の公開期限と比べると、「このバグには90日の公開期限が適用されます。90日の期限前にユーザーへ修正が提供された場合、このバグレポートは修正提供の30日後に公開されます。そうでなければ期限日に公開されます」としている。
「パッチが期限満了後14日以内に出ると予想される場合、Project Zeroは延長を提供できます……ただし14日の猶予期間は30日のパッチ適用期間と重なるため、猶予期間内に修正された脆弱性も、元の90日期限から遅くとも120日目には公開されます」
「14日以内に修正が用意できないと判断した場合、元の90日期限を公開時点として使います。つまり開発者が14日の猶予期間内に修正を配布すると約束した場合にのみ、14日の猶予延長を付与します」
https://googleprojectzero.blogspot.com/p/vulnerability-discl...
「そのparamsはbase64でエンコードされたprotobufにすぎず、Google全体でよく使われるエンコード形式だ」とは。立派なバイナリメッセージ形式をbase64エンコードしてJSONの塊に押し込む担当Google開発者に一杯おごるべきだ。
未来の姿を見たいなら、靴底に「worse is better」と刻まれたブーツがエンジニアの顔を永遠に踏みつける様子を想像すればいい。
JSON部分は自動変換だ。
メールシステムを壊してメールが送られないようにしたのが画竜点睛だ。Googleのように数多くの製品を作る巨大企業では、セキュリティがまがい物のように感じられる。
コードの一行一行が潜在的な脆弱性だとすれば、数百万行ではもはや必然だ。シンプルに保つこと、たとえばrecorderサイトを廃止すること以外に方法はなさそうだが、それでも簡単ではない。
ほとんどのソフトウェア製品は非常に複雑なソフトウェアスタックに依存しており、使っているすべてのライブラリとOSを100%信頼するなら、それは間違った姿勢だと思う。プロセッサにもMeltdownのようなバグがあった。セキュリティは終わりのない戦いであり、勝ったかどうかは決して分からず、負けた場合だけたまに分かる。
[1] https://en.wikipedia.org/wiki/Drake_equation
私もタイトルをGPU計算コスト1万ドルのような意味に誤解した。古いGoogle製品を一つ選んですぐに穴を見つけたのを見ると、こういうバグはさらに数十個、あるいは数百個ありそうだ。