Драйверы компьютерных игр, которые используются для защиты целостности файлов игры, а также легитимности данных игроков не являются редкостью. Ранее публиковалось несколько обзоров наиболее известных подобных драйверов, например, nProtect GameGuard и Blizzard Lockdown. Такие драйверы могут использовать в своих целях перехваты API-вызовов на уровне ядра Windows, постоянное сканирование виртуального адресного пространства процессов, отслеживание доступа операций к системному реестру и др.
Несколько дней назад компания 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.
Автор: ESET NOD32