Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Приветствую всех читателей. Как можно догадаться из названия, эта статья — очередное описание уязвимостей в игровых лаунчерах, где я потыкал Steam (CVE-2019-14743, CVE-2019-15316, CVE-2019-17180) и Origin (CVE-2019-19247, CVE-2019-19248). Сегодня речь пойдет о лаунчере GOG Galaxy компании CD Project RED.
Я уже почти забыл об этом исследовании, но недавняя новость, что Cyberpunk 2077 доступен для предварительного скачивания в лаунчере и вот-вот будет доступен, напомнила мне, что я так публично и не рассказал о своем исследовании. Это немного странная история, потому что я даже не знаю, чем она кончилась – об этом будет ниже. Я просто расскажу, как все было.
Исследование
14 июля 2019. На волне исследования лаунчеров игровых компаний я решил поковырять GOG Galaxy клиент для Windows. На момент исследования версия была 1.2.57.74. Уже тогда существовал GOG Galaxy 2, но был в бете, и доступ выдавался весьма ограничено.
Я обратил внимание, что лаунчер устанавливал два сервиса для своей работы: Galaxy client service и GalaxyCommunication. Сначала я не стал смотреть на первый, потому что второй сразу привлек мое внимание.
Сервис был расположен по пути C:\ProgramData\GOG.com\Galaxy\redists\GalaxyCommunication.exe, работал от имени высокопривилегированного пользователя NT AUTHORITY\SYSTEM и любой пользователь мог запускать и останавливать сервис.
Разрешения на папку стандартные для C:\ProgramData:
Таким образом были созданы прям все условия для атаки dll hijack. Права на папку не позволяют нам поменять содержимое GalaxyCommunication.exe, но позволяют подложить туда какую-нибудь библиотеку, например iphlpapi.dll. О том, как быстро написать библиотеку для такой атаки я писал ранее.
Я набросал PoC (proof of concept) и простую инструкцию: копируем библиотеку, перезапускаем сервис и вот так любой пользователь получил максимальные права. Подготовленные материалы я передал разработчикам.
8 октября 2019. Мы обменялись разными письмами, суть которых сводилась к тому, что уязвимость подтверждена, меня попросили не раскрывать 90 дней информацию об уязвимости и в ближайшую версию 1.2.60 войдет исправление.
Я проверил, что в бете клиента 1.2.60 сервис отключен и без прав администратора его не включить – уязвимость исправлена (в последствии этот сервис был вообще удален).
9 октября 2019. Я провел дополнительные исследования лаунчера и нашел еще две уязвимости. Одна была простой, другая сложной. Для простой я подготовил описание:
По пути C:\ProgramData\GOG.com\Galaxy\communication_config.json располагался файл с правами «Все – Полный доступ». Удаляем этот файла и на его месте создаем хардлинк, например, к файлу C:\Program Files (x86)\GOG Galaxy\GalaxyClientService.exe (исполняемый файл основного сервиса GOG Galaxy, не того, который удалили). После перезапуска сервиса права «Все – Полный доступ» выставлялись по хардлинку, после чего можно было изменить содержимое исполняемого файла сервиса (это позволяют новоустановленные права) и опять любой пользователь получал права NT AUTHORITY\SYSTEM.
Сложная уязвимость заключалась в том, что явно можно было с уровня пользователя отправить запрос, который бы делал то же, что и в случае выше, но сразу к нужному файлу, не используя хардлинки. Но подготовка PoC’а шла медленно, поэтому я ограничился чисто описанием.
10 октября 2019. Мне сказали, что эта проблема уже была зарепорчена другим исследователем и исправление готовится.
26 ноября 2019. Вышла версия 1.2.62 с исправлением уязвимости CVE-2019-15511. Как я и предполагал – существовало простое локально-сетевое API, которое позволяло с уровня пользователя запросить сервис на проведение изменений.
К сожалению, во-первых это не исправляло «легкую» уязвимость, а во-вторых это не исправляло и «сложную уязвимость» CVE-2019-15511. Разработчики просто добавили некоторое поле в запрос со специальным кодом, который проверялся.
Но раз легальное ПО может посчитать этот код от уровня пользователя, то и PoC сможет.
28 ноября 2019. Я предоставил PoC, который менял ACL у произвольного файла даже у «исправленной» версии.
И… фактические все. Реальное общение у нас на этом закончилось. Я несколько раз запрашивал CVE для 4 зарепорченных уязвимостей (ну фактически трех, к одной CVE уже был присвоен), а меня кормили завтраками и словами, что никак не получается запросить CVE у MITRE.
Сам я на тот момент уже не знал, что и где проверять – GOG Galaxy 2 публично вышел. Насколько я понимаю все описанные уязвимости были применимы и к нему, но я не знал версии продукта, а запрашивать CVE для по-сути не поддерживаемого ПО бессмысленно. Поэтому я и забил на эту ситуацию с мыслью, что как пройдет оговоренные 90 дней просто опубликую все, что есть. В итоге публикую сейчас, ибо за 90 дней просто забыл обо всем этом.
Заключение
Так или иначе я нашел и зарепортил 4 уязвимости в GOG Galaxy клиенте для Windows.
- Dll hijack в старой версии;
- Передача прав «Все – Полный доступ» по хардлинку;
- Передача прав «Все – Полный доступ» любому файлу (CVE-2019-15511);
- Обход для исправления CVE-2019-15511.
Скорее всего из этого списка исправлены только первая и третья уязвимости. А вторая и четвертая живы до сих пор. Но я не проверял, поэтому точно не знаю — прошло больше года, а не просто запрашиваемые 90 дней, поэтому моя совесть чиста. Те, кто использует GOG Galaxy, будьте аккуратны, скорее всего ваш компьютер может стать не вашим.