Старые добрые игры, старые добрые уязвимости

Выходящему Вышедшему Cyberpunk 2077 посвящается.

lrbqds_p4cewan3c1bvrvhua2fo.jpeg
Приветствую всех читателей. Как можно догадаться из названия, эта статья — очередное описание уязвимостей в игровых лаунчерах, где я потыкал 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:
hsh8u26qrz5nzqa7ophf32ih7r4.png

Таким образом были созданы прям все условия для атаки 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.

  1. Dll hijack в старой версии;
  2. Передача прав «Все — Полный доступ» по хардлинку;
  3. Передача прав «Все — Полный доступ» любому файлу (CVE-2019–15511);
  4. Обход для исправления CVE-2019–15511.


Скорее всего из этого списка исправлены только первая и третья уязвимости. А вторая и четвертая живы до сих пор. Но я не проверял, поэтому точно не знаю — прошло больше года, а не просто запрашиваемые 90 дней, поэтому моя совесть чиста. Те, кто использует GOG Galaxy, будьте аккуратны, скорее всего ваш компьютер может стать не вашим.

This article in english.

© Habrahabr.ru