Ес­ли ты ког­да‑нибудь заливал на YouTube при­ват­ное видео и подумы­вал, что оно может все рав­но стать дос­тоянием общес­твен­ности, то наход­ка незави­симо­го баг­ханте­ра Да­вида Шюца (David Shütz) уси­лит твои опа­сения. Шюц нашел нес­коль­ко спо­собов получить дос­туп к при­ват­ным видео на YouTube и извлечь инфу из акка­унта. Мы рас­ска­жем о том, какие баги сер­виса к это­му при­вели.
 

Как украсть приватное видео

В декаб­ре 2019 года в ходе работы по прог­рамме баг­баун­ти Google Vulnerability Reward Program (VRP) Давид Шюц заин­тересо­вал­ся воз­можностью прос­мотра при­ват­ных видео на YouTube. В нас­трой­ках каж­дого заг­ружен­ного на виде­охос­тинг ролика поль­зователь дол­жен ука­зать парамет­ры дос­тупа к нему. Все­го пре­дус­мотре­но три вари­анта:

  1. «Откры­тый дос­туп» (видео дос­тупно всем без исклю­чения и сво­бод­но индекси­рует­ся поис­ковыми сис­темами).
  2. «Дос­туп по ссыл­ке» (для прос­мотра ролика нуж­но перей­ти на сайт YouTube по спе­циаль­ной ссыл­ке).
  3. «Огра­ничен­ный дос­туп» (кон­тент видят толь­ко отдель­ные зарегис­три­рован­ные поль­зовате­ли, которых отме­тил вла­делец акка­унта).
Настройки YouTube позволяют ограничить доступ к контенту
Нас­трой­ки YouTube поз­воля­ют огра­ничить дос­туп к кон­тенту

Са­мая инте­рес­ная, с точ­ки зре­ния хакера, безус­ловно, третья катего­рия виде­оро­ликов. В попыт­ке прос­мотреть заг­ружен­ное им на собс­твен­ный акка­унт видео со ста­тусом «Огра­ничен­ный дос­туп» из‑под дру­гой учет­ки Давид щел­кал по всем кноп­кам и ссыл­кам на сай­те виде­охос­тинга и пытал­ся вся­чес­ки модифи­циро­вать URL ролика. Но попыт­ки ока­зыва­лись тщет­ными: YouTube с завид­ным упорс­твом воз­вра­щал сооб­щение об ошиб­ке дос­тупа.

Тог­да иссле­дова­тель решил пой­ти обходным путем. Он руководс­тво­вал­ся прос­той иде­ей, которую час­то берут на воору­жение пен­тесте­ры: если основной сер­вис в дос­таточ­ной сте­пени защищен от ком­про­мета­ции, могут отыс­кать­ся свя­зан­ные с ним сто­рон­ние сер­висы, исполь­зующие его API, или ресур­сы, у которых дела с безопас­ностью обсто­ят не так хорошо. В качес­тве цели он выб­рал сер­вис кон­текс­тной рек­ламы Google Ads.

Да­вид обра­тил вни­мание на то, что Google Ads вза­имо­дей­ству­ет со мно­гими служ­бами Google. Нап­ример, рек­лама, которая демонс­три­рует­ся при прос­мотре видео на YouTube, нас­тра­ивает­ся с помощью Google Ads. Ради экспе­римен­та Шюц зарегис­три­ровал акка­унт в рек­ламном кабине­те Google и попытал­ся нас­тро­ить рек­ламу с исполь­зовани­ем ID его при­ват­ного видео. Безус­пешно — сис­тема не поз­волила про­вер­нуть такой трюк.

Пос­ле это­го Шюц при­нял­ся изу­чать име­ющиеся в его рас­поряже­нии нас­трой­ки рек­ламно­го кабине­та. Целью поис­ков было что‑нибудь, име­ющее непос­редс­твен­ное отно­шение к YouTube. Сре­ди про­чего в рек­ламном акка­унте обна­ружил­ся раз­дел «Видео» (Video), в котором отоб­ража­ются исполь­зуемые для рек­ламы ролики. Щел­чок мышью на превью откры­вает раз­дел «Ана­лити­ка» (Analytics), где при­водят­ся све­дения о ролике и рас­полага­ется встро­енный про­игры­ватель. Давид обра­тил вни­мание на фун­кцию «Момен­ты» (Moments) — она поз­воля­ет рек­ламода­телю отме­чать опре­делен­ные эпи­зоды на видео. С ее помощью мож­но выделить кадр, в котором на экра­не демонс­три­рует­ся рек­ламиру­емый про­дукт или логотип ком­пании, и изу­чить дей­ствия поль­зовате­лей в этот момент. Луч­ше все­го механизм дей­ствия дан­ного инс­тру­мен­та демонс­три­рует ани­мация, соз­данная самим Давидом Шюцем.

Инструмент «Моменты» в рекламном кабинете Google
Инс­тру­мент «Момен­ты» в рек­ламном кабине­те Google

Про­ана­лизи­ровав логи прок­си, Давид обна­ружил, что вся­кий раз, ког­да он соз­дает «момент» в ролике, сайт Google Ads отсы­лает POST-зап­рос на эндпой­нт /GetThumbnails, тело которо­го содер­жит ID целево­го виде­оро­лика и име­ет сле­дующий вид:

POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1
Host: ads.google.com
User-Agent: Internet-Explorer-6
Cookie: [redacted]
__ar={"X":"kCTeqs1F4ME","Y":"12240","3":"387719230"}

Па­раметр X в стро­ке __ar — это ID целево­го ролика, а Y — вре­мен­ная мет­ка отме­чен­ного момен­та в мил­лисекун­дах. В ответ на этот зап­рос сер­вер воз­вра­щает закоди­рован­ную в Base64 кар­тинку — мини­атю­ру кад­ра, который выб­ран в рек­ламном кабине­те с помощью инс­тру­мен­та «Момен­ты». Заменив в зап­росе параметр X на ID сво­его «при­ват­ного» видео, Давид неожи­дан­но для себя получил ответ с закоди­рован­ным кад­ром. Таким обра­зом, он обна­ружил ошиб­ку IDOR (Insecure Direct Object Reference), поз­воля­ющую получить дос­туп к защищен­ным нас­трой­ками при­ват­ности дан­ным. Но с исполь­зовани­ем уяз­вимос­ти иссле­дова­телю уда­лось раз­добыть все­го лишь один кадр из час­тно­го видео. Хороший резуль­тат, но явно недос­таточ­ный.

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Оставить мнение