Приветствую всех читателей. Довольно внезапно вышло, что это очередная статья о поиске уязвимостей в игровом лаунчере. Прошлыми испытуемыми были Steam (CVE-2019-14743, CVE-2019-15316, CVE-2019-17180), Origin (CVE-2019-19247, CVE-2019-19248) и GOG (я поленился получать CVE для уязвимостей). В этот раз я исследовал Plarium Play, лаунчер игр для Windows компании Plarium. Если вы впервые слышите о таком ПО, то возможно вы слышали о таких играх как Raid: Shadow legends и Vikings: War Of Clans, они часто рекламируются различными блоггерами в ютубе. Собственно, компания Plarium и создала Plarium Play для того, чтобы помогать пользователям Windows играть в свои игры.
Небольшая особенность этой статьи состоит в том, что уязвимости актуальны и работоспособны на данный момент. Собственно, в этом-то и проблема. Не смотря на то, что я передал информацию об исследовании, компания Plarium ответила мне отпиской вида "Спасибо за информацию, мы примем меры, если это будет необходимо", после чего стала игнорировать мои сообщения.
История общения
Plarium является израильской компанией-разработчиком игр, с офисами в Израиле, России, Украине и США. Компания пишет на своем сайте, что у нее 38000000 (38 миллионов) игроков по всему миру. Более того, российское отделение даже ведет блог на хабре. Поэтому, я даже не думал, что могут возникнуть проблемы.
После того, как я нашел две уязвимости, я обратился к официальному сайту в поисках security-контакта, но такого не нашлось. 10 мая я написал сообщение в диалогах хабра с просьбой предоставить security-контакт. Ответа не было, поэтому 13 мая написал сообщение через vk с той же просьбой. 14 мая получил ответ, мол давай просто передавай как есть через оба канала. За выходные я подготовил единый документ (который в общем-то был аналогичен тому, что будет описано в этой статье ниже) и 17 мая отправил его через vk, поскольку там файлы передавать проще, чем через хабр. Мне подтвердили получение и две недели сообщений не было. 1 июня я поинтересовался статусом, на что и получил ответ про "примем меры, если это будет необходимо". Я объяснил, что мне нужно знать, признает ли компания уязвимости, чтобы опубликовать статью в соответствии с ответственным разглашением информации об уязвимости, после патча, после того, как большинство пользователей обновится на безопасную версию. Но мое сообщение осталось даже не просмотренным, видимо решили что диалог со мной компании не интересен. 15 июня я отправил еще сообщение, чтобы привлечь внимание, но ничего не поменялось. Поэтому и публикуется эта статья, чтобы помочь компании Plarium защитить своих пользователей и стать более безопасной.
Исследование
Я люблю искать уязвимости типа повышение привилегий (escalation of privileges, local privilege escalation). Этот тип уязвимостей позволяет атакующему получить более высокие права на целевой системе пользователя. Дальше простор для воображения атакующего – просмотр файлов и данных других пользователей ПК, закрепление в системе, которое будет трудно обнаружить и отловить, установка рекламных программ или программ-майнеров, спрятанных от пользователей. Ниже я опишу две независимых уязвимости, которые позволяют любой запущенной программе выполнить свой код от имени пользователя NT AUTHORITY\SYSTEM – самого высокопривилегированного пользователя ОС Windows.
Уязвимость с некорректными настройками прав доступа
Первая уязвимость – банальная dll-инъекция (binary planting, в данном случае). При установке лаунчера происходит запрос прав администратора и установка программы в папку к пользователю. Причем довольно странным выглядит тот факт, что установка происходит в папку не того пользователя, что инициировал установку, а того, который права администратора предоставил. Видимо именно поэтому на папку с ПО (вида C:\Users\имя_пользователя_администратора\AppData\Local\Plarium\PlariumPlay) выставляют права для всех пользователей на полный доступ.
И так уж выходит, что в глубине этой папки лежит исполняемый файл для сервиса, который устанавливает лаунчер C:\Users\имя_пользователя_администратора\AppData\Local\Plarium\PlariumPlay\6.5.0-0.0.0\PlariumPlayClientService.exe. И этот сервис работает от имени пользователя NT AUTHORITY\SYSTEM, поэтому любой код, запущенный в контексте этого сервиса, будет исполнятся с максимально возможными правами. Посмотрим лог старта сервиса в ProcMon'е и увидим очевидное пространство для инъекций.
Атакующему пользователю нужно просто создать proxy-dll для любой библиотеки из списка в логе (например, на скрине это cryptsp.dll, cryptbase.dll, wldp.dll и profapi.dll) и при старте сервиса код из этой dll будет исполнен в контексте сервиса от имени пользователя NT AUTHORITY\SYSTEM. Немного радует факт, что у пользователя хотя бы нет прав на перезапуск сервиса, поэтому атакующему нужно будет дождаться перезагрузки ПК.
Уязвимость с запуском произвольных программ
Вторая уязвимость гораздо интереснее. Она основана на непосредственно функциональности сервиса лаунчера. При старте сервис создает сетевой сокет на локальном интерфейсе с номером около 5400. Любой пользователь может отправить специально сформированную команду на этот сокет, и выполнить произвольный код от имени NT AUTHORITY\SYSTEM.
Детальное описание шагов для эксплуатации:
Необходимо вычитать из реестра HKU\.DEFAULT\Software\Plarium\PlariumPlay два значения ключей port и data.
Расшифровать их (используется алгоритм AES с ключом в base64 HTMCjgasdf450dFLKXJBED3rldkjvhi9s34hvLkfgh4= и инициализирующим вектором в base64 WcEOEGcSDi4ERtsFPExDkw==).
Значение port будет содержать номер порта для подключения, а значение data нужно для формирования команды.
Необходимо сформировать JSON-команду для отправки на порт. Сначала это будет вспомогательный JSON с параметрами для исполнения: {'args':'', 'link':'C:/Windows/system32/cmd.exe'}.
Теперь основной JSON со следующими параметрами:
method – “invokeInstaller”
data – JSON с предыдущего шага
requestId – любое, я поставил “rid”
signature – нужно посчитать хекс строку от SHA512 от конкатенации строк значений method, data из пункта 3 и data из этого JSON.
Отправить этот JSON в сокет, предварительно отправим длину пакета в 8 байтах.
Вот основная часть кода, реализующая PoC для уязвимости:
В данном примере будет запущена консоль команд, но любой пользователь может запустить любую полезную нагрузку, и она будет исполнена от имени пользователя NT AUTHORITY\SYSTEM.
Выводы
Я надеюсь, что компания Plarium обратит внимание на мою статью и проблемы безопасности в своем продукте, а разработчики поскорее примут меры, которые защитят игроков на платформе Windows.
Хотя еще больше мне бы хотелось, чтобы эта статья вышла не как рассказ об актуальной уязвимости, а статья об уже решенной проблеме.
Update 06.07.2021
Разработчики через vk сообщили мне, что в новой версии уязвимости исправлены, позже это написали и здесь в комментариях.
Вот прям глубоко не смотрел, но, действительно, в версии 6.6.0-0.0.1 (актуальная на данный момент), уязвимости отсутствуют. Работа с сервисом вынесена в отдельную папку, доступ к которой ограничен, а команда запуска приложения удалена.