Охота за уязвимостью. Выполняем произвольный код на виртуальных машинах 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 — Мы опубликовали наш отчет.
    Доктор Веб
    Компания

    Комментарии 19

      +5

      Уязвимость уровня "открыть справку, найти справку по принтеру, получить доступ к панели управления" времён игровых локеров 95-98 ых.


      Если бы я был админом этой штуки (и всё ещё был виндовым админом — спасибо, не надо), то первая вещь, которую бы я сделал, была бы групповая полиси, запрещающая запускать файлы не из белого списка. А белом списке остались бы только разрешённые игры.


      А вот как с плагинами бороться… Ну, если в игрушке поддерживаются моды из community, то что мешает свой remote shell засунуть в качестве мода? Ничто.

        +1
        > А вот как с плагинами бороться… Ну, если в игрушке поддерживаются моды из community, то что мешает свой remote shell засунуть в качестве мода? Ничто.
        Не допускать такие игры в сервис. Либо совсем, либо только с белым списком «одобренных» модов.
          0

          А как вы узнаете, какие типы модов поддерживаются в игре? Реверс-инженеринг? Решение задачи остановки?

          0

          При запуске некоторых игр стартует и cmd, так что этот вариант не подходит.

          0
          Как оказалось, виртуальная машина сервиса работает на Windows Server 2019.
          а конфигурацию железа не удалось подсмотреть?
            0

            Я в какую-то игру играл когда только открылся сервис, и там засветилась часть характеристик: какой-то хеон на 16 ядер, 32гб оперативки, и видеокарта нвидия Квадро.

              0
              у них своё железо, которое можно посмотреть через assassin's cred origins или загуглить)

                0
                это можно сделать в самом стиме — сведения о системе:
                Intel CC150 3.5 Ghz
                15 Gb RAM
                Tesla T10 16 Gb (аналог RTX 2080Ti)
                XEN

                  0
                  В чьем облаке они работают не известно?
                    0

                    Яндекса

                0

                Что-то не очень понятна модель безопасности. Запуск cmd.exe уже по сути выполнение произвольного кода. Оттуда что угодно в винде можно сделать.

                  0
                  Без прав админа ты ничего не сделаешь из cmd.
                    0
                    Эта статья не демонстрирует повышение привилегий до уровня администратора. Всё, что она демонстрирует — возможность запуска cmd.exe

                    Проблема в том, что система безопасности, считающая запуск cmd.exe приемлемым, а других приложений — нет — не имеет никакого смысла, т.к. из cmd.exe напрямую можно сделать всё, что возможно сделать из других приложений.
                      0
                      Если вы внимательно читали статью, то запуск cmd.exe был лишь промежуточным шагом. По факту из cmd.exe ничего интересного сделать не получится из-за наличия списка разрешенных к запуску приложений и низких привилегий.

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

                      >т.к. из cmd.exe напрямую можно сделать всё, что возможно сделать из других приложений.

                      Что конкретно вы хотите сделать интересного из cmd.exe?
                        0
                        > По факту из cmd.exe ничего интересного сделать не получится
                        Из cmd.exe можно сделать почти что угодно. Это скриптовый язык, какой код хотите, такой и выполняйте.

                        > Что конкретно вы хотите сделать интересного из cmd.exe?
                        del %USERPROFILE%

                        Вопрос больше в том чего нельзя сделать из cmd.
                  +1
                  Так а в чём уязвимость? Произвольная виртуальная машина которая долго не живёт и в ней только свои данные можно украсть, так же наверно можно в стиме игрушку выложить которая своя и позволяет делать что хочешь на виртуалке и вовсе не надо через игру передавать.
                    0
                    В стим выложить игрушку не так-то просто: partner.steamgames.com/steamdirect

                    То есть запариться придется как для получения левой подписи для файлов, а перспективы весьма туманны.
                    0

                    Зачем такие сложности с сетевой загрузкой библиотеки? Если можно запаковать в архив, конвертнуть в base64 и просто посимвольно передать в файл через cmd.

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

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

                    Самое читаемое