Вся индустрия программного обеспечения переживает смену парадигмы в связи с широким внедрением облачной архитектуры. Несмотря на то, что сообщество devops разработало широкий спектр инструментов для поддержки этого перехода, важным фактором, который упускается из виду, является модель угроз. Ниже приведена запись в блоге нашего консультанта, в которой неправильная настройка безопасности в CDN привела к экс-фильтрации контента поставщика услуг потоковой передачи.

Где-то в августе 2015 года я зарегистрировался на сервисе, который очень похож на Netflix, но для южно-индийских фильмов (преимущественно Тамиж). Интерфейс казался плавным, очень похожим на Netflix, и я смог выделить как минимум 5 приятных UX-вещей, которые я узнал из выступления Рошель Кинг в штаб-квартире Spotify несколько лет назад. Я решил поковыряться в бэкенде, чтобы посмотреть, какие у них есть механизмы безопасности, чтобы пользователи не могли загружать или хотлинковать фильмы с CDN.

Пообщавшись некоторое время с Chrome Developer Tools, я увидел, что они использовали базовую установку Akami. Я никогда не работал с сервисами потокового видео, поэтому для меня это было проблемой. Цель состояла в том, чтобы посмотреть, есть ли возможность загрузить фильм в высоком качестве напрямую из CDN (не из локального кеша браузера).

Игра началась

Веб-плеер получил набор файлов списка воспроизведения index_x_av.m3u8 из CDN, где indexwget -d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"
--header="Accept-Encoding: compress, gzip" -i links.txt
av.m3u8 — самое высокое разрешение, а index_0_av.m3u8 — самое низкое. Открытие его в VLC загрузило поток, но, поскольку моей целью было загрузить фильм, я пропустил детские вещи. В файлах index_x_av.m3u8 были URL-адреса всех сегментов фильма. Простая магия wget должна делать это правильно?

Поскольку URL-адреса следовали одному и тому же шаблону во всех сегментах, мне даже не нужно было анализировать URL-адреса из файла плейлиста. Приведенный ниже сценарий bash сгенерировал URL-адреса для всех сегментов фильма и попытался загрузить каждый сегмент.

#!/bin/bash
echo "Generating Links..."
for i in `seq 1 1013`;
do
echo "http://xxxxxx-vh.akamaihd.net/i/Movie_Name/5.1/YA_1080,.mp4.csmil/segment${i}wget -d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"
--header="Accept-Encoding: compress, gzip" -i links.txt
av.ts" >> links.txt
done
echo "Initiating Download.. Fasten your seat belts.."
wget -i ./links.txt

Я мучительно наблюдал за тем, как wget скачивал каждый сегмент со скоростью 40 кбит/с. Хорошие дни Мадраса, а. Облом! Бывает, Akamai тормозит хрень, если у вас не установлен штатный юзер-агент браузера на wget. Но это легко исправить, тот, что ниже, устранил проблему, и я смог вернуться к первой мировой скорости.

wget -d --header="User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"
--header="Accept-Encoding: compress, gzip" -i links.txt

Теперь, когда все 1013 сегментов были загружены на мой локальный диск, нужно было сшить их все вместе. ffmpeg — универсальный магазин для всего, что связано с видео. Когда-то я использовал его для просмотра демонстраций безопасности. Итак, я провел следующие 6 часов, пытаясь найти правильный аргумент/кодек, который можно использовать для объединения всех этих сегментов, когда я наткнулся на параметр -i, который в основном работал как wget. Вы передаете файл списка воспроизведения в ffmpeg, и он автоматически загружает и вставляет файлы на лету.

ffmpeg -i http://xxxxxxx-vh.akamaihd.net/i/Movie_Name/5.1/YA_1080,.mp4.csmil/index_4_av.m3u8 -t 10122 -c copy fullmovie.ts

Проблема с User-Agent снова нанесла ответный удар, и казалось, что плагин User-Agent в ffmpeg не работает. Разбились мечты.

Через некоторое время мне пришло в голову, что, поскольку у меня уже есть все сегменты на моем локальном диске, я могу просто запустить ffmpeg -i в файле списка воспроизведения после изменения URL-адресов, указывающих на мою локальную копию, размещенную на локальном веб-сервере. Таким образом, я могу избежать нападок пользовательского агента Akamai.

После моей модификации файл плейлиста выглядел так

#EXTINF:10.000,
http://127.0.0.1:1337/segment1_4_av.ts
#EXTINF:10.000,
http://127.0.0.1:1337/segment2_4_av.ts
.....
.....

И запустить ffmpeg с

ffmpeg -i http://127.0.0.1:1337/index_4_av.m3u8 -t 10122 -c copy fullmovie.ts

сделал работу. Миссия выполнена.

О проблеме было сообщено команде разработчиков на следующий день вместе с возможными мерами по ее устранению, такими как проверка игрока и зашифрованная потоковая передача, которые предоставляет Akamai (за дополнительную плату). Это была довольно серьезная ошибка, потому что люди, которые управляют этой службой, покупают права на международные телетрансляции для фильмов у продюсеров / дистрибьюторов, и они, вероятно, не будут очень счастливы, если узнают, что украсть фильм так легко.