В данном документе мы раскроем и продемонстрируем новый интересный способ преобразования локальных багов и возможностей в удаленно эксплуатируемые уязвимости, основанный на использовании хорошо известной платформы Steam в качестве вектора атаки на удаленные системы
В данном документе мы раскроем и продемонстрируем новый интересный способ преобразования локальных багов и возможностей в удаленно эксплуатируемые уязвимости, основанный на использовании хорошо известной платформы Steam в качестве вектора атаки на удаленные системы.
Цитата из Википедии: "Steam – платформа для цифровой дистрибуции, технических средств защиты авторских прав, многопользовательских игр и обмена информацией, разработанная Valve Corporation". Через Steam пользователи могут покупать игры, скачивать демонстрационные версии и бесплатные игры, искать сетевые матчи, обмениваться информацией с другими пользователями, делиться статистикой и так далее. Steam – платформа цифровой дистрибуции с наибольшим количеством пользователей (около 50 миллионов), которая поддерживает несколько платформ: Windows, MacOS, PS3, мобильные устройства и Linux.
Steam, как и другое ПО, использует свой собственный обработчик URL, чтобы интегрировать в свою платформу основанный на веб-технологиях функционал. URL-схема steam:// используется для:
Браузерный протокол Steam включает в себя несколько команд, большинство из которых перечислено на сайте Valve вместе с необновленным списком игр, использующих Steam в качестве платформы. Данный список команд не является исчерпывающей справкой по всем командам, доступным в браузерном протоколе Steam, поскольку некоторые команды на сайте Valve документированы лишь частично или вовсе не документированы.
В последующих разделах мы собираемся рассмотреть то, как Steam URL обрабатываются браузером и другим ПО, чтобы как следует понять возможные способы запуска удаленных атак через такие URL. На рисунке 1 дан обзор одного из возможных сценариев атак.
Рисунок 1. Удаленная эксплуатация команд протокола Steam: обзор
Сначала мы проверили, как наиболее известные браузеры ведут себя при обработке внешних (не обрабатываемых самими браузерами) протоколов URL (то есть, rtsp://, mms://, steam:// и т. д.).
Согласно результатам из таблицы 1, все те браузеры, которые запускают внешние обработчики URL напрямую, без предупреждений, и те, которые основаны на движке Mozilla (вроде Firefox и Seamonkey), являются превосходным вектором для выполнения вызовов браузерного протокола Steam. Кроме того, для браузеров вроде Internet Explorer и Opera все еще возможно предотвратить отображение вредоносной части URL в предупреждающем сообщении путем вставки нескольких пробелов между steam:// и собственно URL.
Internet Explorer | Отображается предупреждение, включающее URL, а в случае IE9 возможно дополнительное предупреждение ("защищенный режим") без каких-либо подробностей |
Firefox | URL не отображается, только запрос подтверждения (без предупреждений) |
Chrome | Предупреждение с подробным описанием URL и вызываемой программой |
Opera | Предупреждение, включающее только 40 символов URL |
Safari | Непосредственное выполнение без предупреждений |
Webkit | Непосредственное выполнение без предупреждений |
MaxThon | Непосредственное выполнение без предупреждений |
Avant | Непосредственное выполнение без предупреждений |
Lunascape | Непосредственное выполнение без предупреждений |
SeaMonkey | См. Firefox |
PaleMoon | См. Firefox |
SRWare Iron | См. Chrome |
Таблица 1: поведение различных браузеров при запуске обработчика протокола Steam
Помимо веб-браузеров существуют и другие программы, которые можно использовать для выполнения вызовов к внешним обработчикам протоколов. Большинство из них (но не все) основаны на использовании браузера по умолчанию.
Вот некоторые программы (протестированные в ходе нашего исследования), которые не показывают никаких предупреждений при выполнении вызовов внешнего протокола URL.
По нашему мнению, Steam browser представляет собой крайне интересную альтернативу обычным браузерам, однако имеет следующие ограничения:
Для полноты стоит упомянуть, что веб-браузер, используемый в игровом оверлей-интерфейсе Steam, действует иначе и позволяет полностью инорировать все сайты, за исключением ссылок steam://, так что данная разновидность браузера не может быть использована как вектор атаки. А мы хотим иметь возможность открывать ссылки, которые не предназначены для открытия в браузере Steam.
Если вы знакомы со Steam, вы знаете, что каждый пользователь платформы имеет страницу персонального профиля, которая может включать в себя информацию, изображения и видеоролики. В то время как изображения, предоставленные пользователями, загружаются на сервера Steam, видеоролики представляют собой лишь ссылки на ролики YouTube. Если пользователь попытается посмотреть видеоролик, прикрепленный к какому-нибудь профилю, он получит страницу, содержащую только видео с YouTube без комментариев или описания. Но если пользователь щелкнет на заголовке видеоролика (например, чтобы оставить комментарии), откроется новое окно со всеми подробностями, касающимися данного ролика, включая комментарии и описание. Так что, злоумышленник может оставлять ссылки на внешние хосты, которые удаленно вызывают команды Steam, путем использования обычных steam:// URL. Согласно своей стратегии браузер Steam будет выполнять вызовы обработчика протокола без каких-либо предупреждений. На рисунке 2 данный подход резюмирован графически.
Рисунок 2: удаленная эксплуатация через браузер Steam и перенаправление на YouTube.
На данный момент мы уже знаем преимущества и недостатки различных способов запуска steam:// URL, поэтому мы можем начать исследовать некоторые уязвимости и то, что мы можем получить, эксплуатируя их. В последующих разделах будут описаны некоторые новые уязвимости, которые мы обнаружили в ходе нашего исследования. Отметим, что все они могут эксплуатироваться удаленно, используя в качестве триггера браузерный протокол 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.
В Steam можно запускать установленные игры, используя одну из следующих команд steam://
Как и большинство программ, игры, доступные для платформы Steam, принимают аргументы командной строки. Steam позволяет вам передавать играм аргументы, однако не существует официальной документации по стратегии передачи аргументов. Исключение составляет команда –applaunch, которая не может считаться универсальным и «тихим» способом из-за различных методов кодирования URL, применяемых веб-браузерами.
Перечисленные четыре команды, которые можно использовать для запуска игр, большей частью недокументированы, однако вот как выглядят форматы этих команд:
Для удаленных сред подходят только команды run и rungameid, принимающие аргумент url_encoded_parameters – строку, закодированную в формате URL и передаваемую функции Q_URLDecode, которая сохраняет результат декодирования в буфер размером 128 байт. Функция Q_URLDecode позволяет вам использовать любые символы, а также демонстрирует, что существуют команды, используемые удаленно через браузер. Ограничение размера параметров 128 символами не влияет на эксплуатацию любых из перечисленных далее уязвимостей, поскольку, если нам понадобится больше места, мы можем просто использовать JavaScript для соединения фрагментов команд.
В качестве первого примера эксплуатации игр через 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, которые мы используем для создания файлов со специальным содержимым в произвольных локациях. Для эксплуатирования данного движка мы выбрали следующие опции командной строки:
Для эксплуатации данного бага мы создаем в папке автозапуска учетной записи пользователя файл с расширением .bat, который будет запускать наши команды, внедренные через опцию +echo, при следующем входе пользователя в систему. Существует также интересный сценарий атаки на выделенные сервера, который состоит в указании файла motd.txt игры в качестве файла журнала и запуска команды cvarlist, которая выгрузит все переменные игры в данный файл, который видим для любого игрока, подключающегося к серверу. Team Fortress 2 – одна из наиболее популярных игр, основанных на данном движке. Она к тому же является бесплатной.
Рисунок 5: удаленная эксплуатация движка Unreal через Steam
Для игр, основанных на движке Unreal мы выбрали следующую уязвимость, которая имеет место при получения контента с удаленных компьютеров (по протоколу WebDAV или из общей папки SMB), который мы можем загрузить, используя следующие параметры командной строки:
steam://run/ID/server nnHOSTnevil.upk –silent
На самом деле этот движок имеет множество уязвимостей к целочисленному переполнению (возможно скоро мы их задокументируем), которые позволяют выполнение вредоносного кода.
Полный список параметров командной строки движка Unreal доступен онлайн.
All Points Bulletin – хорошо известная массовая многопользовательская онлайн-игра (MMOG), которая имеет настраиваемую возможность автоматичечского обновления. В данном случае мы установили через командную строку произвольный сервер обновлений и эксплуатируем уязвимость выхода за пределы директории для перезаписи или создания файла с желаемым контентом в нужном месте.
Платформа Steam включает множество бесплатных MMO-игр вроде APB, так что количество их пользователей велико, и большинство из этих игр могут эксплуатироваться подобным образом. Кроме того, большинство этих игр используют механизмы предотвращения игрового мошенничества (anti-cheating) и, потому, требуют запуска с правами администратора (мы находимся в игровом мире, в котором есть множество людей, не обладающих знаниями о безопасности, но обладающих такими правами), что позволяет скомпрометировать систему целиком.
MicroVolts – еще один пример известной MMO-игры, эксплуатируемой через автообновление с помощью другой уязвимости выхода за пределы директории.
Приглашаем посетить канал vimeo.com/revuln для просмотра демонстрационного видео, иллюстрирующего все проблемы, затронутые в данном документе.
В данном разделе мы предлагаем некоторые решения, позволяющие избежать проблем, найденных нами в результате нашего исследования, или, хотя бы, уменьшить их влияние.
Проблема может быть ограничена путем отключения обработчика URL-схемы steam:// или использования браузера, который не позволяет прямого запуска браузерного протокола Steam.
Решением может стать запрет передачи аргументов командной строки сторонним программам и недокументированных команд из внешних и недоверенных источников вроде Internet.
Главная проблема браузерного протокола Steam в том, что он позволяет злоупотреблять локальными возможностями игр (например, использованием журнальных файлов), так что разработчики в данной ситуации не могут ничего поделать, за исключением попыток уменьшить возможные проблемы путем:
В данном документе мы доказали, что текущая реализация механизма обработки браузерного протокола Steam является отличным вектором атаки, который позволяет атакующим эксплуатировать локальные проблемы удаленно. В качестве подтверждения эффективности данного нового вектора атаки мы описали пять новых удаленно эксплуатируемых уязвимостей, включая одну в самой платформе Steam и две в широко используемых игровых движках (Source и Unreal). Из-за большой аудитории (более 50 миллионов человек) и поддержки различных платформ, включая Windows, MacOs и Linux и количества усилий, необходимых для эксплуатации багов через команды браузерного протокола Steam, Steam может рассматриваться в качестве высокоэффективного вектора атаки.
Цифровые следы - ваша слабость, и хакеры это знают. Подпишитесь и узнайте, как их замести!