Небезопасность браузерного протокола Steam (удаленная эксплуатация локальных багов)


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

Авторы: Luigi Auriemma и Donato Ferrante

Краткий обзор

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

1 STEAM

Цитата из Википедии: "Steam - платформа для цифровой дистрибуции, технических средств защиты авторских прав, многопользовательских игр и обмена информацией, разработанная Valve Corporation". Через Steam пользователи могут покупать игры, скачивать демонстрационные версии и бесплатные игры, искать сетевые матчи, обмениваться информацией с другими пользователями, делиться статистикой и так далее. Steam – платформа цифровой дистрибуции с наибольшим количеством пользователей (около 50 миллионов), которая поддерживает несколько платформ: Windows, MacOS, PS3, мобильные устройства и Linux.

2 Браузерный протокол Steam

Steam, как и другое ПО, использует свой собственный обработчик URL, чтобы интегрировать в свою платформу основанный на веб-технологиях функционал. URL-схема steam:// используется для:

  • Установки и удаления игр
  • Резервирования, проверки и дефрагментации игровых файлов
  • Соединения с игровыми серверами
  • Запуска игр
  • Выхода на различные страницы и разделы, где можно купить или активировать игры, загрузить утилиты, ознакомиться с новостями, посмотреть профили пользователей и т. д.

Браузерный протокол Steam включает в себя несколько команд, большинство из которых перечислено на сайте Valve вместе с необновленным списком игр, использующих Steam в качестве платформы. Данный список команд не является исчерпывающей справкой по всем командам, доступным в браузерном протоколе Steam, поскольку некоторые команды на сайте Valve документированы лишь частично или вовсе не документированы.

В последующих разделах мы собираемся рассмотреть то, как Steam URL обрабатываются браузером и другим ПО, чтобы как следует понять возможные способы запуска удаленных атак через такие URL. На рисунке 1 дан обзор одного из возможных сценариев атак.


Рисунок 1. Удаленная эксплуатация команд протокола Steam: обзор

2.1 Стратегия 1: веб-браузеры

Сначала мы проверили, как наиболее известные браузеры ведут себя при обработке внешних (не обрабатываемых самими браузерами) протоколов URL (то есть, rtsp://, mms://, steam:// и т. д.).

Согласно результатам из таблицы 1, все те браузеры, которые запускают внешние обработчики URL напрямую, без предупреждений, и те, которые основаны на движке Mozilla (вроде Firefox и Seamonkey), являются превосходным вектором для выполнения вызовов браузерного протокола Steam. Кроме того, для браузеров вроде Internet Explorer и Opera все еще возможно предотвратить отображение вредоносной части URL в предупреждающем сообщении путем вставки нескольких пробелов между steam:// и собственно URL.

Internet ExplorerОтображается предупреждение, включающее URL, а в случае IE9 возможно дополнительное предупреждение ("защищенный режим") без каких-либо подробностей
FirefoxURL не отображается, только запрос подтверждения (без предупреждений)
ChromeПредупреждение с подробным описанием URL и вызываемой программой
OperaПредупреждение, включающее только 40 символов URL
SafariНепосредственное выполнение без предупреждений
WebkitНепосредственное выполнение без предупреждений
MaxThonНепосредственное выполнение без предупреждений
AvantНепосредственное выполнение без предупреждений
LunascapeНепосредственное выполнение без предупреждений
SeaMonkeyСм. Firefox
PaleMoonСм. Firefox
SRWare IronСм. Chrome

Таблица 1: поведение различных браузеров при запуске обработчика протокола Steam

2.2 Стратегия 2: альтернативы

Помимо веб-браузеров существуют и другие программы, которые можно использовать для выполнения вызовов к внешним обработчикам протоколов. Большинство из них (но не все) основаны на использовании браузера по умолчанию.

Вот некоторые программы (протестированные в ходе нашего исследования), которые не показывают никаких предупреждений при выполнении вызовов внешнего протокола URL.

  • Steam browser (свой веб-браузер Steam)
  • Встроенный браузер RealPlayer
  • Другие программы, которые могут обрабатывать html-страницы

По нашему мнению, Steam browser представляет собой крайне интересную альтернативу обычным браузерам, однако имеет следующие ограничения:

  • Веб-сайты, которые можно посещать через Steam browser, в основном ограничены доменами, принадлежащими Valve, например, steampowered.com и steamcommunity.com.
  • Valve предотвращает инъекции в протоколе steam:// путем выполнения нескольких проверок над ссылками, предоставляемыми пользователями.
  • Ссылки на внешние сайты перенаправляются вызовами steam://openurl/website, которые выполняются средствами браузера по умолчанию, а не браузера Steam.

Для полноты стоит упомянуть, что веб-браузер, используемый в игровом оверлей-интерфейсе Steam, действует иначе и позволяет полностью инорировать все сайты, за исключением ссылок steam://, так что данная разновидность браузера не может быть использована как вектор атаки. А мы хотим иметь возможность открывать ссылки, которые не предназначены для открытия в браузере Steam.

Если вы знакомы со Steam, вы знаете, что каждый пользователь платформы имеет страницу персонального профиля, которая может включать в себя информацию, изображения и видеоролики. В то время как изображения, предоставленные пользователями, загружаются на сервера Steam, видеоролики представляют собой лишь ссылки на ролики YouTube. Если пользователь попытается посмотреть видеоролик, прикрепленный к какому-нибудь профилю, он получит страницу, содержащую только видео с YouTube без комментариев или описания. Но если пользователь щелкнет на заголовке видеоролика (например, чтобы оставить комментарии), откроется новое окно со всеми подробностями, касающимися данного ролика, включая комментарии и описание. Так что, злоумышленник может оставлять ссылки на внешние хосты, которые удаленно вызывают команды Steam, путем использования обычных steam:// URL. Согласно своей стратегии браузер Steam будет выполнять вызовы обработчика протокола без каких-либо предупреждений. На рисунке 2 данный подход резюмирован графически.


Рисунок 2: удаленная эксплуатация через браузер Steam и перенаправление на YouTube.

3 Уязвимости

На данный момент мы уже знаем преимущества и недостатки различных способов запуска steam:// URL, поэтому мы можем начать исследовать некоторые уязвимости и то, что мы можем получить, эксплуатируя их. В последующих разделах будут описаны некоторые новые уязвимости, которые мы обнаружили в ходе нашего исследования. Отметим, что все они могут эксплуатироваться удаленно, используя в качестве триггера браузерный протокол Steam.

3.1 Команды браузерного протокола Steam

Команда retailinstall является недокументированной возможностью (не багом) браузерного протокола Steam, которая позволяет установку и восстановление резервных копий из локальной директории. Один из ее параметров – путь, который используется для задания локальной директории, однако, эта директория вполне может быть сетевой папкой, расположенной на удаленном хосте. Когда Steam запускает команду retailinstall, он проверяет и загружает два файла: splash.tga (заставка) и sku.sis (установщик). Пользователь видит заставку сразу после запуска данной команды (рис. 3).


Рисунок 3: Steam загружает spash.tga во время выполнения команды retailinstall

Функция Steam, ответственная за обработку заставок, содержит уязвимость переполнения целочисленного значения при обработке неправильно сформированных TGA-файлов. Проблема заключается в функции LoadTGA библиотеки vgui2_s.dll, которая загружает файлы TGA в память (рис. 4). В результате происходит переполнение буфера в куче, которое позволяет выполнение вредоносного кода в рамках процесса Steam.


Рисунок 4: ассемблерный код, соответствующий уязвимости к целочисленному переполнению в функции LoadTGA.

3.2 Параметры командной строки браузерного протокола Steam для запуска игр

В Steam можно запускать установленные игры, используя одну из следующих команд steam://

  • run
  • rungameid
  • runsafe
  • rungame

Как и большинство программ, игры, доступные для платформы Steam, принимают аргументы командной строки. Steam позволяет вам передавать играм аргументы, однако не существует официальной документации по стратегии передачи аргументов. Исключение составляет команда –applaunch, которая не может считаться универсальным и «тихим» способом из-за различных методов кодирования URL, применяемых веб-браузерами.

Перечисленные четыре команды, которые можно использовать для запуска игр, большей частью недокументированы, однако вот как выглядят форматы этих команд:

  • steam://run/id/language/url_encoded_parameters
  • steam://rungameid/id/language_bug/url_encoded_parameters
  • steam://runsafe/id
  • steam://rungame/id/lobby_id/parameters

Для удаленных сред подходят только команды run и rungameid, принимающие аргумент url_encoded_parameters – строку, закодированную в формате URL и передаваемую функции Q_URLDecode, которая сохраняет результат декодирования в буфер размером 128 байт. Функция Q_URLDecode позволяет вам использовать любые символы, а также демонстрирует, что существуют команды, используемые удаленно через браузер. Ограничение размера параметров 128 символами не влияет на эксплуатацию любых из перечисленных далее уязвимостей, поскольку, если нам понадобится больше места, мы можем просто использовать JavaScript для соединения фрагментов команд.

3.2.1 Эксплуатация игр 1: движок SOURCE

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

Вот наиболее известные игры, основанные на данном движке: Half-Life 2, Counter-Strike: Source, Half-Life: Source, Day of Defeat: Source, Team Fortress 2, Portal 2, Left 4 Dead 2, Dota 2, Alien Swarm, SiN Episodes, Dark Messiah of Might and Magic, The Ship, Zombie Panic! Source, Age of Chivalry, Synergy, D.I.P.R.I.P., Eternal Silence, Pirates Vikings & Knights II, Dystopia, Insurgency, Nuclear Dawn и Smashball.

Большинство из этих игр понимают базовые команды движка Source, которые мы используем для создания файлов со специальным содержимым в произвольных локациях. Для эксплуатирования данного движка мы выбрали следующие опции командной строки:

  • +con_logfi-le, позволяет определить файл, в который будет записано содержимое консоли (не может находиться в удаленной папке Windows)
  • +echo, используется для помещения в файл журнала предоставленных данных
  • +quit, (необязательная) закрывает игру
  • -hijack, (необязательная) полезна в случае, когда пользователь уже запустил экземпляр игры, и мы хотим послать ему дополнительные команды, которые ограничены 128 байтами из-за функции Q_URLDecode

Для эксплуатации данного бага мы создаем в папке автозапуска учетной записи пользователя файл с расширением .bat, который будет запускать наши команды, внедренные через опцию +echo, при следующем входе пользователя в систему. Существует также интересный сценарий атаки на выделенные сервера, который состоит в указании файла motd.txt игры в качестве файла журнала и запуска команды cvarlist, которая выгрузит все переменные игры в данный файл, который видим для любого игрока, подключающегося к серверу. Team Fortress 2 – одна из наиболее популярных игр, основанных на данном движке. Она к тому же является бесплатной.

3.2.2 Эксплуатация игр 2: движок UNREAL


Рисунок 5: удаленная эксплуатация движка Unreal через Steam

Для игр, основанных на движке Unreal мы выбрали следующую уязвимость, которая имеет место при получения контента с удаленных компьютеров (по протоколу WebDAV или из общей папки SMB), который мы можем загрузить, используя следующие параметры командной строки:

steam://run/ID/server nnHOSTnevil.upk –silent

На самом деле этот движок имеет множество уязвимостей к целочисленному переполнению (возможно скоро мы их задокументируем), которые позволяют выполнение вредоносного кода.

Полный список параметров командной строки движка Unreal доступен онлайн.

3.2.3 Эксплуатация игр 3: APB RELOADED

All Points Bulletin – хорошо известная массовая многопользовательская онлайн-игра (MMOG), которая имеет настраиваемую возможность автоматичечского обновления. В данном случае мы установили через командную строку произвольный сервер обновлений и эксплуатируем уязвимость выхода за пределы директории для перезаписи или создания файла с желаемым контентом в нужном месте.

Платформа Steam включает множество бесплатных MMO-игр вроде APB, так что количество их пользователей велико, и большинство из этих игр могут эксплуатироваться подобным образом. Кроме того, большинство этих игр используют механизмы предотвращения игрового мошенничества (anti-cheating) и, потому, требуют запуска с правами администратора (мы находимся в игровом мире, в котором есть множество людей, не обладающих знаниями о безопасности, но обладающих такими правами), что позволяет скомпрометировать систему целиком.

3.2.4 Эксплуатация игр 4: MICROVOLTS

MicroVolts – еще один пример известной MMO-игры, эксплуатируемой через автообновление с помощью другой уязвимости выхода за пределы директории.

3.3 Демонстрация

Приглашаем посетить канал vimeo.com/revuln для просмотра демонстрационного видео, иллюстрирующего все проблемы, затронутые в данном документе.

4 Возможные исправления и обходные пути

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

4.1 На стороне пользователя

Проблема может быть ограничена путем отключения обработчика URL-схемы steam:// или использования браузера, который не позволяет прямого запуска браузерного протокола Steam.

4.2 На стороне Steam

Решением может стать запрет передачи аргументов командной строки сторонним программам и недокументированных команд из внешних и недоверенных источников вроде Internet.

4.3 Со стороны игр

Главная проблема браузерного протокола Steam в том, что он позволяет злоупотреблять локальными возможностями игр (например, использованием журнальных файлов), так что разработчики в данной ситуации не могут ничего поделать, за исключением попыток уменьшить возможные проблемы путем:

  • Адаптации методов безопасного программирования к коду, не связанному с сетевым взаимодействием
  • Использования проверки сертификатов при автоматическом применении заплаток

5 Заключение

В данном документе мы доказали, что текущая реализация механизма обработки браузерного протокола Steam является отличным вектором атаки, который позволяет атакующим эксплуатировать локальные проблемы удаленно. В качестве подтверждения эффективности данного нового вектора атаки мы описали пять новых удаленно эксплуатируемых уязвимостей, включая одну в самой платформе Steam и две в широко используемых игровых движках (Source и Unreal). Из-за большой аудитории (более 50 миллионов человек) и поддержки различных платформ, включая Windows, MacOs и Linux и количества усилий, необходимых для эксплуатации багов через команды браузерного протокола Steam, Steam может рассматриваться в качестве высокоэффективного вектора атаки.