Google VRPプログラムのハッキングを開始してから数か月後の2019年12月、私はYouTubeに目を向けました。自分が
Private
所有していないプライベート()ビデオにアクセスする方法を見つけたかった のです。
YouTubeに動画をアップロードするときは、3つのアクセスオプションのいずれかを選択できます。開く(
Public
)を使用すると、誰でもビデオを検索して表示
Unlisted
できます。リンクアクセス( )を使用すると、ビデオID(URL
Private
)を知っているユーザーのみがビデオを表示できます。制限付きアクセス()を使用すると、自分または他のアカウントに表示を許可 します。ビデオ。この許可のために。
私が最初にしたことは、ビデオを2番目のテストYouTubeチャンネルにアップロードし、ビデオのアクセスオプションをに切り替え
Private
て、テストに使用できるようにすることでした。 (テストは、所有しているリソース/アカウントで常に実行する必要があることに注意してください!)最初のテストアカウントからビデオにアクセスする方法を見つけることができれば、バグの存在を特定します。
最初のアカウントでYouTubeを開き、すべての機能を確認して、見つかったすべてのボタンをクリックしました。ビデオIDを持つHTTPリクエストを見るたびに、アクセス可能なテストビデオに置き換えました
Private
、彼に関するいくつかの情報が漏れることを期待して、しかし成功しませんでした。メインのYouTubeWebサイト(少なくとも私がテストしたすべてのエンドポイント)は、ビデオが状態にあるかどうかを常にチェックし
Private
、ターゲットの閉じたビデオをクエリしようとすると、常にのようなエラーを返すよう
This video is private!
です。
別の方法を見つける必要があります。
このような状況では、優れた解決策は、私たちの主な目標ではないが、何らかの形でそのリソースと内部的に相互作用する他の製品/サービスをチェックすることかもしれません。サイトリソースにアクセスできる場合は、メイン製品が持つすべての保護レベルを実装していない可能性があります。
これらの要件を満たす興味深いターゲットは、Google広告です。これは、広告主がYouTubeを含むすべてのGoogleサービスで広告を作成するために使用する製品です 。つまり、YouTube動画の前で視聴する広告は、ここGoogle広告プラットフォームの広告主によってカスタマイズされています。
そこで、Google広告アカウントを登録し、スキップ可能な広告としてすべてのYouTubeユーザーに動画を再生する新しい広告を作成しました。広告の作成プロセス中に、ターゲットのゲート付きビデオIDをあちこちで使用しようとしましたが、少しも成功しませんでした。
広告を作成した後、私はGoogle広告のさまざまな機能を探求し始めました。これは非常に大規模な製品であり、さまざまなオプションとツールがあります。 YouTubeに関連するものを見つけようとしていました。
プラットフォームで、というタイトルのページを見つけました
Videos
。そこでは、広告に使用されたビデオのリストが表示されました。ビデオをクリックすると、分析セクションが開きます(
Analytics
)このビデオの。その中に、組み込みのプレーヤー、統計、およびと呼ばれる興味深い関数が見つかりました
Moments
。これにより、広告主は動画の特定の瞬間に「タグ付け」して、さまざまなことが起こった時期を確認できるようになりました(たとえば、会社のロゴが表示された瞬間のタイムスタンプ)。正直なところ、広告主がこの機能を使用する理由はよくわかりませんでしたが、興味深いようでした。
プロキシログを見ると、「瞬間にタグを付ける」たび
POST
に、エンドポイントにリクエストが送信さ れていることがわかりました
/GetThumbnails
。このリクエストの本文には、ビデオIDが含まれていました。
POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1
Host: ads.google.com
User-Agent: Internet-Explorer-6
Cookie: []
__ar={"1":"kCTeqs1F4ME","2":"12240","3":"387719230"}
ここで、パラメーターの
__ar
値
1
はビデオIDであり、値
2
はミリ秒単位の瞬間時間でした。応答として、base64でエンコードされた画像が返されました。これは、Adsプラットフォームで使用されるサムネイルです。
私はすでに何度も行ったことを繰り返しました:リクエストのIDを2番目のアカウントの閉じられたビデオの識別子に置き換えました、そして驚いたことに、私はそれに応じてbase64画像を 受け取りました!
「base64toimage」をグーグルで検索し、base64データを最初に見つけたデコーダーに貼り付けました。画像には、対象となるプライベートビデオのサムネイルが含まれています 。動いた!動作するIDORバグを見つけました (安全でないダイレクトオブジェクトリファレンス)、アクセスが制限されているYouTubeビデオからフレームを取得できたおかげです!
でも、「うーん、これは一発だ」と思いました。私たちはもっとうまくやれる。
実際に動く「ビデオ」を生成する概念実証を備えたPythonスクリプトを書きたかったのです。情報を探して、ビデオが24 FPSで記録された場合、1フレームが
33
ミリ秒の間画面に表示されることに気付きました 。つまり、各画像をダウンロードして、から始めて
0
増分を実行し、
33
受信したすべてのフレームから一種のビデオを収集するだけで十分です 。
ビデオの最初の3秒間のフレームをダウンロードし、デコードしてからGIFを生成するPOCをすばやく作成しました。コードをテストするために、以前はアクセスを制限していた古いビデオを使用してコードを実行しました。これは、恥ずかしいためです。
したがって、このバグを使用すると、攻撃者はYouTubeで閉じたビデオをダウンロードできます。これは、私の意見では、かなり深刻な脅威です。しかし、もちろん、私が克服できなかったいくつかの制限があります。
- 実際には、ターゲットビデオのIDを知っている必要があります。それらの大規模なリークは、それ自体がバグと見なされます。
- 画像しか受信できないため、音声にアクセスできません。
- 解像度は非常に低いです(ただし、ビデオで何が起こっているかを理解するだけで十分です)。
両方の製品の開発チームはシステムをよく知っており、別の製品のリソースを操作するときに重要な詳細を見逃す可能性があるため、2つの異なる製品が互いに内部相互作用する状況に常に注意を払う価値があると結論付けることができます。
IDORのようなものを見つけることは、非常に単調で骨の折れる作業になる可能性があります。現在、私は、最善を期待して、単純なブラインドID置換を避けようとしています。製品をしばらくテストしてその内部構造を理解すると、開発者が考えていなかった可能性のあるさまざまな予期しないアクションについて考えたり、最近実装された機能に焦点を当てたりすることがより効果的(そしてより興味深い)になります。思いやりのある行動が必要なことをするだけです。長期的にはもっと楽しいと思うかもしれません。私の意見では、システムを理解すればするほど、システムをハッキングすることについてのアイデアが自然に思い浮かびます。
ただし、最も信頼性が高く、徹底的にテストされたシステムでも、リクエストのIDを置き換えるだけで、重大なバグが発生する可能性があります。
状況がどのように発展したか
[2019年12月11日]-
バグレポートが送信されました [2019年12月12日]-最初のトリアージ
[2019年12月 20日]-バグが受け入れられました(P4-> P1)
[2020年1月8日]-一時的にバグを修正するために実行された手順機能の無効化
Moments
[2020年1月17日] -5,000ドルの 報酬が発行されました
[??? ?? 2020]-機能
Moments
が再びオンになり、ビデオへのアクセスをチェックするようになりました。
広告
VDSinaは、毎日の支払いでVDSを提供 し、数回クリックするだけで独自のサーバー構成を作成し、任意のオペレーティングシステムをインストールする機能を提供します。各サーバーは500メガビットのインターネットチャネルに接続されており、DDoS攻撃から無料で保護されています。 Telegramでチャットを
購読して ください。