В мае этого года исследователи Check Point Software Technologies обнаружили совершенно новый вектор атак — атаки через субтитры. Злоумышленники могут использовать файлы субтитров для получения контроля над компьютерами пользователей, при этом избегая обнаружения. В этой статье мы расскажем, как это у них получилось (обязательно запасись кофе – статья вышла большая 🙂 – прим. ред.)
 

Что мы знаем

Этот вектор атак возможен из-за уязвимостей, обнаруженных в популярных стриминговых платформах, включая VLC, Kodi (XBMC), PopcornTime и strem.io. Перед злоумышленником он открывает безграничные возможности: кражу конфиденциальной информации, установку программ-вымогателей, массовые DDoS-атаки и многое другое.

К счастью, эти уязвимости были устранены очень быстро после публикации первых материалов, поэтому теперь мы можем рассказать о проблеме во всех подробностях.

 

PopcornTime

Созданная всего за несколько недель как проект open source, мультплатформа «Netflix для пиратов» оказалась гремучей смесью из BitTorrent-клиента, медиаплеера и бесконечных возможностей скрепинга (сбора данных при помощи скриптов), объединенных очень привлекательным графическим интерфейсом.

PopcornTime GUI
PopcornTime GUI

Хотя программа стала очень популярна благодаря простоте использования и хорошей коллекции видеофильмов, разработчики внезапно закрыли проект из-за давления со стороны Американской ассоциации кинокомпаний (MPAA).

После этого разные инициативные группы создали форки PopcornTime для поддержки программы и разработки новых функций. Создатели оригинального PopcornTime поддержали версию popcorntime.io (позднее — popcorntime.sh) как преемника своего закрытого проекта.

Интерфейс на основе WebKit содержит множество информации о фильмах и метаданные. Здесь есть трейлеры, краткое содержание сюжета, информация об актерах, фотографии обложек, рейтинги IMDB и многое другое.

 

Субтитры в PopcornTime

Чтобы еще больше облегчить жизнь пользователя, субтитры к фильмам подгружаются автоматически. Можно ли использовать это в своих целях? (Подсказка: да).

Без ведома пользователя PopcornTime использует в качестве своего единственного поставщика субтитров open-subtitles. Более четырех миллионов субтитров и очень удобный API делают этот репозиторий суперпопулярным. В нем есть алгоритм выдачи рекомендации, помогающий пользователю выбрать файл для конкретного фильма и релиза.

 

Поверхность атаки

Как упоминалось ранее, PopcornTime работает на движке WebKit, а именно — NW.js. Ранее известная как node-webkit, платформа NW.js позволяет разработчику использовать веб-технологии — например, HTML5, CSS3 и WebGL — в своих родных приложениях. Более того, обращаться к API Node.js и модулям третьих сторон можно напрямую из DOM.

В сущности, приложение NW.js — это веб-страница с произвольным содержимым, написанная на JavaScript или HTML и оформленная с помощью CSS. Как всякая веб-страница, приложение может подвергаться XSS-атакам. В данном случае, из-за того, что программа работает на Node.js, XSS позволяет использовать возможности серверной части. Иными словами, запросы XSS в реальности становятся запросами RCE (на выполнение удаленного кода).

 

На старт, внимание, марш!

Наше приключение начинается, как только пользователь включает воспроизведение фильма. PopcornTime делает запрос через вышеупомянутый API и скачивает рекомендованные субтитры (мы опишем этот процесс в деталях ниже). Затем PopcornTime пытается перекодировать полученный файл в формат .srt.

/src/app/vendor/videojshooks.js
/src/app/vendor/videojshooks.js

После перекодировок и парсинга созданный элемент (субтитр) прикрепляется к экрану в нужный момент, опираясь на массив «подсказок».

Функция updateDisplay
Функция updateDisplay

Это дает нам возможность добавить к отображаемому виду любой HTML-объект. Очевидно, что полный контроль над каким-либо HTML-элементом, — это уже опасно. Однако когда мы имеем дело с приложениями на основе узлов (node-based) важно понимать, что XSS равен RCE. Системные команды легко запускаются через модули типа child_process. Как только наш непроверенный JavaScript загружается на экран, до запуска вредоносного кода остается всего лишь несколько строк.

Обычный SRT-файл выглядит примерно так:

1
00:00:01,000 –> 00:00:05,000
Hello World

Вместо текста «Hello World» мы можем использовать HTML-тег изображения.

Мы пытаемся загрузить несуществующее изображение с атрибутом событий onerror, который позволяет задать срабатывание скрипта при возникновении ошибки во время загрузки внешнего файла.

malicious.srt – пример
malicious.srt – пример

Мы используем функцию JavaScript, связанную с атрибутом onerror, чтобы удалить компрометирующий нас значок отсутствующего изображения и прикрепить к странице нашу вредоносную удаленную полезную нагрузку (payload). Само собой, наш скрипт evil.js всего лишь запустит окно стандартного калькулятора calc.exe.

evil.js (Command execution)
evil.js (Command execution)

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

Cтатьи из последних выпусков журнала можно покупать отдельно только через два месяца после публикации. Чтобы читать эту статью, необходимо купить подписку.

Подпишись на журнал «Хакер» по выгодной цене!

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

3 комментария

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…