Несколько дней назад компания Capcom уведомила своих пользователей об обновлении anti-hack драйвера (Capcom.sys), который используется для контроля за целостностью файлов игры и предотвращает возможную компрометацию содержимого памяти процесса игры с целью предотвращения читерства. Однако, пользователей в этом обновлении ждал неприятный сюрприз в одной из функций драйвера. Она позволяет отключать защитную меру ядра SMEP и исполнять код по указателю, полученному из пользовательского режима.
SMEP (Supervisor Mode Execution Prevention) уже является довольно известной мерой, о которой было написано несколько обзоров. Она требует поддержки как со стороны микропроцессора, так и со стороны ОС (Windows 8+). SMEP используется для блокирования операции исполнения кода пользовательского режима (Ring 3) в режиме ядра (RIng 0). Как бы это не выглядело странно (код режима ядра является самым привилегированным и имеет возможность доступа ко всей памяти в системе), SMEP является хорошей мерой для блокирования активности LPE-эксплойтов, которые часто передают управление на блок кода, расположенный в пользовательской части виртуального адресного пространства.
Драйверы Windows организованы таким образом, что для взаимодействия с клиентом из Ring 3, используется специальный интерфейс под названием IOCTL. Драйвер регистрирует специальный обработчик в ядре Windows, который может быть использован из пользовательского режима известной API-функцией DeviceIoControl. Приложение при использовании этого API передает драйверу код требуемой функции, набор аргументов и указывает входной, а также выходной буферы памяти для передачи аргументов и получения результата.
Новое обновление Capcom.sys использует интерфейс IOCTL и две функции с кодами 0xAA012044, 0xAA013044. Особенность этих функций заключается в том, что они позволяют клиенту пользовательского режима исполнить код в режиме ядра по указателю, полученному оттуда, причем перед этим отключает SMEP. После исполнения функции SMEP включается обратно установкой соответствующего бита регистра CR4. Очевидно, что отключение используется для исполнения кода в режиме ядра из пользовательского режима.
Рис. Функция Capcom.sys, которая исполняет указанную в IOCTL-запросе функцию с отключенным SMEP.
Очевидно, что так как драйвер компьютерной игры подписан цифровой подписью и предоставляет такой потенциально опасный интерфейс для доступа из пользовательского режима, он создает в системе бэкдор. Сторонний код может использовать данный драйвер для исполнения своего кода в Ring 0.
Компания Capcom уже выпустила обновление игры, закрывающее данную уязвимость.
We are in the process of rolling back the security measures added to the PC version of Street Fighter V. After the rollback process to the PC version, all new content from the September update will still be available to players. We apologize for the inconvenience and will have an update on the time-frame for the PC rollback solution soon.
Комментарии (34)
CodeRush
25.09.2016 13:06+14Вот так примерно и выглядит добрая половина драйверов режима ядра от сторонних производителей. Людям нужно было решить проблему, и они ее решили, а как это выглядит с точки зрения безопасности — всем наплевать. Вот еще один пример похожего поведения.
The ASUS «Generic Function Service» includes a couple of drivers, ASMMAP.sys / ASMMAP64.sys,
the version resources describe them as «Memory mapping Driver».
This description is very accurate, it has a pair of ioctls, 0x9C402580 and 0x9C402584, that map or
unmap to the calling process' address space ANY PART OF PHYSICAL MEMORY, with READ/WRITE permissions.
Using code that has been copypasta'd a bunch of times, but seems to originate from a sample driver for NT 3.1.
1993 vintage code, everybody.
It also has a couple of other ioctls that allocate or free some RAM and gives the physical and virtual pointers
to it, and another one that can make any I/O request (does in/out byte/word/dword with parameters given in the ioctl buffer, and returns the result for the case of in).nckma
26.09.2016 11:44Интересно, а как это было выявлено? Чтобы обнаружить подобную проблему нужно кропотливо сидеть хотя бы неделю с отладчиком WinDbg или дизассемблировать с Ida и изучать код. Скорее всего кто-то хотел взломать игру и нашел «это».
aspirineilia
26.09.2016 16:44причем перед этим отключает SMEP
Думаю по этому коду и нашлось каким-то автоматическим анализатором. А дальше раскурили уже спецы что и как происходит.
CodeRush
26.09.2016 21:56+1И еще пример. И еще. И RW Everything со своим драйвером, который и подписан, и может вообще все.
dartraiden
25.09.2016 14:28+6Сразу вспомнился драйвер защиты Frost от Innova Systems, печально известный тем, что одна из его версий без возражений принимала управляющие команды от любого приложения. Сам драйвер умел, например, скрывать указанные процессы и был подписан валидной цифровой подписью. Эдакий «официальный» руткит.
Saffron
25.09.2016 18:06+5Как майкрософт вообще подписывает такие драйвера, и почему не банит на веки вечные их производителей после таких косяков?
Или о пользователях и их безопасности мелкомягкие способны беспокоиться лишь на словах? Зачем тогда вообще механизм подписей?Karpion
26.09.2016 00:20Я так понимаю — драйвер подписывается авторами, которые имеют делегированное от MS право подписывать свои драйверы.
Механизм подписей нужен для того, чтобы в системе могли работать только авторизованные доверенными производителями программы. И чтобы можно было доказать вину автора программы.
dartraiden
26.09.2016 04:30Именно поэтому в Windows 10 все драйверы, работающие в режиме ядра, теперь обязаны получать подпись от Microsoft. До Windows 10 достаточно было подписи самого разработчика.
Впрочем, есть полуприватный способ обойти механизм подписей и загрузить вообще любой драйвер, не меняя настроек системы.dartraiden
26.09.2016 04:43Немного сумбурно вышло уточню:
— до Windows 10 для любого драйвера достаточно было подписи, приобретаемой разработчиком у Comodo, VeriSign и т.п. Бонусом существует способ обойтись без подписи вообще (не отключение этой защиты, а полный её обход прозрачно для пользователя).
— начиная с Windows 10 (с августовского обновления) добавились условия: если включена безопасная загрузка (SecureBoot), то все драйверы режима ядра, выпущенные после 29 июля 2015 года должны быть подписаны Microsoft. Если SecureBoot отключена, то поведение аналогично предыдущим версиям Windows.Aquilo
26.09.2016 16:15все драйверы режима ядра, выпущенные после 29 июля 2015 года должны быть подписаны Microsoft.
То есть, если во время написания левых вирусных драйверов, поставить дату локального времени до 29 июля 2015, то этот механизм защиты не будет работать?sumanai
26.09.2016 16:16Дата определяется по штампу времени независимого сервера и цифровой подписи на ней, локальное время значения не имеет.
dartraiden
26.09.2016 19:29Под выпуском понимается время подписывания. То есть, драйвер по-любому должен быть подписан: либо до 29.07.2015 легально приобретённой подписью разработчика драйвера (и при подписывании обязательно используется онлайн-сервер удостоверяющего центра, выдавшего этому разработчику сертификат), либо после этой даты — в Microsoft. Локальное время, как верно замечено в комментарии выше, роли не играет.
Goodkat
25.09.2016 16:56Ну а какие могут быть альтернативы таким драйверам?
Либо все игрушки только на консолях, либо с выполнением части логики игры на сервере, для которого быстро напишут эмулятор, либо DRM для приложений на уровне OS, как это сделано в iOS, который всё равно сломают, либо играть только в DRM-free инди-игры.nuclear_skillet21011
25.09.2016 17:05Зачем усложнять — отведите отдельный компьютер для игр и прочих радостей.(с условием если вы не оплачиваете не чего в играх) и можете забыть про реализацию чего угодно(если железо позволяет)
Smi1e
25.09.2016 17:55Имеется в виду альтернатива с т.з. разработчика для защиты, а не с т.з. пользователя.
Goodkat
25.09.2016 21:24Ага, этот отдельный компьютер для игр и прочих радостей называтся консоль — тем более, они сейчас здорово в цене упали.
RiseOfDeath
26.09.2016 09:17У консолей в этом плане есть два недостатка — ограниченный выбор устройств ввода (Можно-ли к иксбоксу или к соньке подключить клаву с мышкой, или
мой любимыйподаренный на др. джойстик для авиасимуляторов) и ограниченный выбор магазинов приложений. (речь идет именно о легальных копиях ПО, а не о скачивании игр с торрентов)
Pakos
26.09.2016 17:14Отдельный для игр, отдельный для банка, отдельный для котиков, отдельный для госуслуг. Не многовато ли?
vorphalack
25.09.2016 18:20+3денува? ее конечно тоже уже ломают, но она, внезапно, не творит херни. за системный драйвер «защиты» просто нужно бить по морде до тех пор пока ответственные не перестанут шевелиться, а потом еще и обоссать.
Arf
26.09.2016 00:20На самом деле нет, эмулятор написать достаточно сложно и долго.
Когда на сервере находится только механизм определения лицензии, то это обходится. Но в случае когда там лежат именно элементы игровых механик, таблицы контента и т.д., то требуется работа по фактически повторному созданию куска игры. Как пример до сих пор не взломанных — diablo 3. Были еще какие то, но кажется ни одной взломанной полноценно, так или иначе original game expirience всегда страдает.
Но такие меры потребуют обязательного стабильного интернет соединения(проблема для игроков) + поддержки серверов от разработчика. Близзард это потянут, их фанаты тоже, более мелкие конторы уже вряд ли.Deosis
26.09.2016 06:35+3За создание подобных игр хочется бить по рукам. Как только отключатся сервера, игра превратится в тыкву.
Единственное приемлемое решение это f2p, будет потеряно только время.maniacscientist
26.09.2016 16:14Таких злобных примеров всего два — Prince Of Persia: Forgotten Sands и Dark Spore. Для первой быстренько написали эмулятор, а вторая да, погибла.
Онлайн от Метелицы — это всё таки нечто большее чем просто сервера
dartraiden
26.09.2016 19:34Тут дело вообще не в DRM и защите от пиратства. Игра вполне могла быть DRM-free и бесплатной.
Речь в новости об античите. Играть же против читеров банально неинтересно.Goodkat
26.09.2016 19:49Да, виноват.
Если DRM ещё как-то можно реализовать в ОС, то с читерами бороться намного сложнее.
Alexey2005
25.09.2016 18:44+1Ещё один неприятный побочный эффект подобных защит — невозможность запустить защищаемую игру под wine. А в некоторых случаях (ArcheAge как пример) даже и под VirtualBox не запустится.
jedai
26.09.2016 16:14интересно, как microsoft подписывает такие драйвера? неужели у них нет тестов, которые должны следить за попытками возможного отключения внутренних механизмов защиты?
qw1
Я так понимаю, этого мало. Нужно отозвать цифровую подпись драйвера, чтобы никто не мог воспользоваться старой, дырявой версией, включив её в свой exploit pack