Охота за уязвимостью. Выполняем произвольный код на виртуальных машинах NVIDIA GeForce NOW
Введение
На фоне пандемии коронавируса возросла популярность облачных сервисов, позволяющих играть в видеоигры. Эти сервисы предоставляют вычислительные мощности, необходимые для запуска игр, и в режиме реального времени транслируют геймплей на устройства пользователей. Самое очевидное преимущество такой системы — игрокам нет необходимости иметь мощное железо. Чтобы запустить клиент сервиса и скоротать время на самоизоляции, хватит и вполне бюджетной машины: все вычисления происходят на удаленном сервере.
Одной из таких облачных платформ является GeForce NOW от компании NVIDIA. Согласно Google Trends, по всему миру пик поисковых запросов для этого сервиса пришелся на февраль. Это коррелирует с началом действия ограничений во многих странах Азии, Европы, Северной и Южной Америки и других регионах. В то же время для России, где режим самоизоляции начался позже, в марте, мы видим аналогичную картину, но с соответствующей задержкой.
Учитывая высокий интерес к GeForce NOW, мы решили рассмотреть эту платформу с точки зрения безопасности.
Исследуем платформу
На момент начала нашего исследования GeForce NOW был доступен в двух вариантах — бесплатном и по подписке. Их отличие в том, что при бесплатном использовании сервиса необходимо подождать, пока станет доступной свободная виртуальная среда. В случае платного варианта виртуальная машина стартует с более высоким приоритетом, и ждать игроку обычно не нужно. В плане обеспечения безопасности обе версии сервиса одинаковы. За любое нарушение правил использования платформы облачная среда выполнения сразу выключается, а учетная запись провинившегося геймера может быть заблокирована.
В меню представлен список игр, поддерживаемых сервисом. Для игры необходим аккаунт одного из магазинов цифрового контента, к которому уже привязана та или иная игра (если она платная, то купить ее нужно заранее). В этом исследовании мы рассматриваем связку GeForce NOW и магазина Steam.
При нажатии на кнопку «Играть» в главном окне приложения происходит запуск удаленной виртуальной среды и стриминг в реальном времени со стороны сервера на устройство пользователя.
Если выбранная игра уже куплена, она будет запущена в полноэкранном режиме, и другие функции виртуальной среды должны быть недоступны пользователю. Однако если настройки игры позволяют выбрать в ней оконный режим работы, то у нас появляется возможность получить доступ к библиотеке Steam. Другой способ попасть в нее — выбрать игру, которой в библиотеке еще нет.
Уже сейчас понятно, что мы можем выполнить произвольный код, если проэксплуатируем уязвимость в игре, которую поддерживает сервис. Единственное ограничение — эксплойт должен быть доставлен по сети. Здесь возможны различные варианты развития событий. Например, если в результате работы эксплойта создается исполняемый модуль на диске, сервис теоретически может предотвратить выполнение полезной нагрузки, отследив создание исполняемого файла от имени пользователя kiosk (это стандартный пользователь в виртуальных машинах сервиса GeForce NOW). С другой стороны, если в результате эксплуатации уязвимости выполняется шелл-код, сервис защититься уже никак не сможет.
Чтобы провести полноценную разведку окружения среды виртуальной машины, нам не помешает доступ к cmd.exe или powershell.exe. Но как его получить? Немного побродив по меню библиотеки Steam, находим способ, который позволит запустить произвольный исполняемый ехе-файл, уже имеющийся в системе. Для этого мы будем использовать функцию «Добавить стороннюю игру…».
В обычных условиях добавить файл cmd.exe в библиотеку в качестве сторонней игры не составило бы проблемы. Однако в GeForce NOW такая возможность заблокирована, и нажатие на кнопку «Обзор» на скриншоте ниже ни к чему не приводит. Тем не менее, можно выбрать одно из уже имеющихся приложений (а заодно и посмотреть, какие вообще программы установлены в недрах виртуальной машины). Для примера выберем архиватор 7-Zip (другие программы также отлично подойдут).
После добавления 7-Zip в библиотеку Steam параметры программы можно изменить. Здесь мы и исправляем путь до нужного нам файла cmd.exe. Готово! Запускаем нашу стороннюю «игру» и получаем рабочий шелл:
Теперь мы можем осмотреться и узнать, где мы вообще находимся. Запускаем winver:
Как оказалось, виртуальная машина сервиса работает на Windows Server 2019.
В результате мы уже можем делать то, что по умолчанию не предусмотрено виртуальными машинами GeForce NOW. Но что еще мы можем сделать, и насколько это будет опасно?
Согласно FAQ на странице NVIDIA для отправки отчетов о найденных уязвимостях, получение доступа к cmd.exe на виртуальной машине сервиса GeForce NOW не является уязвимостью. Это объясняется тем, что в виртуальной среде у пользователя имеются минимальные права, а также присутствует фильтрация запускаемых приложений. Так, например, после запуска powershell.exe среда выполнения будет сразу же остановлена.
Таким образом, чтобы наше исследование восприняли всерьез, нам нужно решить две задачи:
1) доставить полезную нагрузку на виртуальную машину,
2) запустить ее с обходом белого списка приложений.
В процессе решения первой задачи были испробованы популярные для скачивания LOLBIN-ы, такие как regsvr32, bitsadmin и т. д. Во всех случаях виртуальная машина аварийно завершалась:
Но решение пришло само собой. GeForce NOW — это сервис для игр (в том числе многопользовательских), где игровой клиент может подключаться к игровому серверу и скачивать оттуда звуки, модели, карты и другие файлы. Поэтому нам необходимо выбрать такую игру, которая позволит доставить произвольный файл на клиент. При этом нам не стоит беспокоиться о расширении файла, так как у нас есть доступ к шеллу, и мы можем переместить скачанный файл туда, где мы сможем его использовать.
Но как быть с белым списком приложений? Ведь даже если нам удастся поместить стороннее приложение в виртуальную машину, при его запуске та аварийно завершит свою работу. Одно из решений этой проблемы — найти приложение из списка доверенных, для которого мы можем осуществить dll hijacking. Самая очевидная цель — это процесс игры.
Итак, попробуем реализовать эту идею на примере Counter-Strike: Source (далее мы будем сокращенно называть ее CS: S). Первое, что мы делаем, — создаем свой сервер CS: S, который будет отдавать dll-файл под видом, скажем, модели (d.mdl). Далее запускаем GeForce NOW для игры в CS: S и заходим на наш сервер, с которого на виртуальную машину загружается заранее подготовленный файл «модели». Теперь сворачиваем игру и запускаем cmd.exe. Перемещаем файл d.mdl в «Counter-Strike Source/bin/user32.dll» и перезапускаем игру консольной командой. Успех: мы выполнили произвольный код в контексте доверенного процесса.
И даже записали видео:
Заключение
Несмотря на то, что атаки на пользователей сервиса потенциально возможны, они все же маловероятны. К тому же риски для других пользователей сервиса будут минимальны. Дело в том, что для каждой новой игровой сессии в GeForce NOW запускается чистая виртуальная среда. После того как игрок окончил сеанс, виртуальная машина завершает работу и «обнуляется». Поэтому даже в случае успешной эксплуатации уязвимости вредоносный код сможет проработать лишь до тех пор, пока работает скомпрометированная виртуальная машина. А чтобы атаковать других пользователей, злоумышленникам потребуется выбраться из виртуальной среды при помощи эксплойта типа Virtual machine escape. Такие эксплойты встречаются достаточно редко, и реализовать их сложно. Но в случае успеха под угрозой окажутся уже не единичные пользователи, а все, кто запустил игровую сессию после первоначальной компрометации сервиса через одну из виртуальных машин GeForce NOW.
Однако более простой и реалистичный сценарий атаки — использовать скомпрометированную виртуальную машину для майнинга криптовалют, проведения DDoS-атак и выполнения других незаконных действий, требующих вычислительных мощностей.
После нашего обращения NVIDIA подтвердила наличие проблемы и выпустила соответствующее исправление для своего сервиса.
Хронология событий:
18.04.2020 — Информация об уязвимости отправлена в NVIDIA
20.04.2020 — NVIDIA PSIRT подтвердил получение репорта и смог воспроизвести проблему
13.05.2020 — NVIDIA PSIRT проинформировал, что разработчики работают над проблемой
21.08.2020 — NVIDIA PSIRT проинформировал, что выпуск исправления должен состояться до 30.08
02.09.2020 — Мы запросили уточнение о дате выхода исправления
03.09.2020 — NVIDIA выпустила исправление
04.09.2020 — NVIDIA выпустила уведомление о найденной уязвимости
07.09.2020 — Мы опубликовали наш отчет.