Уязвимый драйвер: почти выученный урок

Как не стоит использовать драйвер для повышения привилегий

Недавно мы начали получать подозрительные события от плагина для нашей внутренней “песочницы” под названием Exploit Checker. Наши эвристики на исполнение кода в режиме супервизора в пользовательском адресном пространстве постоянно срабатывали, и исполняемый файл помечался для дальнейшего анализа. С первого взгляда это выглядело так, словно мы обнаружили уязвимость нулевого дня для повышения привилегий в Windows. Однако подозрительный файл – GundamOnline.exe – оказался чистым и подписанным исполняемым файлом, являющимся частью дистрибутива многопользовательской игры Mobile Suit Gundam Online от компании BANDAI NAMCO Online Inc.

Исходное приложение, на которое срабатывали эвристики Exploit Checker, упаковано и содержит различные средства анти-анализа, затрудняющие статический анализ кода. Приложение, к примеру, пытается определить, запущено ли оно в виртуальной машине, выполнив известную процедуру обнаружения гипервизора VMWare. Оно загружает регистр EAX специальным “магическим” значением гипервизора VMXh, а регистр ECX значением 0x0A, которое является специальной командой для получения версии гипервизора.  Затем выполняется команда in на I/O порт гипервизора VMWare. Если в результате этой операции регистр EBX перезаписывается значением VMXh, это означает, что исполняемый файл запущен в виртуальной машине VMWare.

В логах нашей “песочницы” видно, что исполнение кода в режиме супервизора на пользовательской странице памяти происходит в драйвере bandainamcoonline.sys, сразу после IOCTL запроса 0xAA012044 на объект устройства \\.\Htsysm7838, созданный этим драйвером. Сам драйвер устанавливается непосредственно перед этим – он распаковывается в памяти и сохраняется в папке “C:\Windows\SysWOW64\”. Затем драйвер загружается с помощью функции WinAPI NtLoadDriver(), сразу после чего удаляется:

Как правило, такого рода поведение невозможно из-за SMEP (Supervisor Mode Execution Prevention) – присутствующей на современных процессорах Intel функции безопасности, которая ограничивает исполнение кода в режиме супервизора на страницах пользовательской памяти. Тип страницы определяется с помощью флага User / Supervisor в записи таблицы страниц. Если в режиме выполнения в режиме супервизора вызывается страница пользовательской памяти, SMEP генерирует исключение нарушения доступа, и в результате система инициирует проверку и остановку – то, что обычно называют BSOD.

Установленный драйвер подписан сертификатом, выпущенным NAMCO BANDAI Online Inc

Срок действия сертификата может указывать на две вещи. Во-первых, сертификат является действующим с 2012 года, а это может означать, что первая уязвимая версия драйвера была выпущена примерно в тот же период времени. Однако мы не смогли обнаружить столь ранний сэмпл – и первый найденный нами образец драйвера bandainamcoonline.sys датируется ноябрем 2015 года. Во-вторых, поскольку срок действия сертификата истек более чем три года назад, можно предположить, что драйвер, подписанный данным сертификатом, нельзя установить в систему. На самом деле это неверно, так как вы все равно можете без проблем загрузить подписанный драйвер, даже с истекшим сроком действия сертификата.

Чтобы найти причину срабатывания эвристик “песочницы”, необходимо провести статический анализ самого драйвера. В функции DriverEntry он сначала декодирует строку имени объекта устройства в памяти, а затем создает устройство \\.\Htsysm7838. Остальные закодированные строки, “bandainamcoonline” и “bandainamcoonline.sys”, не используются в драйвере.

Сам драйвер очень небольшой и содержит только три зарегистрированные основные функции. Обрабатывающая I/O запросы функция IRP_MJ_DEVICE_CONTROL принимает только два IOCTL: 0xAA012044 и 0xAA013044. При вызове она проверяет размеры входных и выходных буферов и в конечном итоге вызывает функцию ExecuteUserspaceCode, передавая ей входной буфер в качестве аргумента.

Функция ExecuteUserspaceCode производит проверку входного буфера, содержащего указатель на функцию или шеллкод в пользовательском адресном пространстве, и отключает SMEP, сохраняя старые значения регистра CR4. Затем происходит вызов пользовательского кода, функция передает ему в качестве аргумента указатель на функцию ядра MmGetSystemRoutineAddress. После этого исходное состояние регистра CR4 восстанавливается, чтобы повторно включить SMEP.

Для того, чтобы иметь возможность напрямую вызывать пользовательскую функцию с привилегиями ядра, необходимо сначала очистить определенный бит в регистре CR4 для временного отключения SMEP, что и делается в функции DisableSMEP. Исходное значение CR4 затем восстанавливается в функции EnableSMEP.

Уязвимость в данном случае заключается в том, что помимо базовых проверок на формат входного буфера, никаких дополнительных проверок не производится. Следовательно, любой пользователь в системе может использовать данный драйвер для повышения своих привилегий и исполнения произвольного кода в “нулевом” кольце ОС. Даже если драйвер не присутствует в системе, злоумышленник может загрузить его, используя функции Windows API и проэксплуатировать уязвимость.

Проанализировав драйвер bandainamcoonline.sys, мы поняли, что эта уязвимость выглядит точно так же, как найденная в прошлом году в драйвере Capcom.

Бинарное сравнение драйверов bandainamcoonline.sys и capcom.sys подтверждает это, показывая, что оба файла почти идентичны. Единственные отличия, которые есть между этими двумя драйверами – закодированные строки и цифровые подписи. Учитывая, что самый ранний образец драйвера, который мы нашли, датируется ноябрем 2015-го года, можно сделать предположение, что эта уязвимость впервые появилась в драйвере bandainamcoonline.sys – почти за год до того, как аналогичный драйвер был использован Capcom.

Мы считаем, что оба драйвера почти наверняка были скомпилированы из одного и того же исходного кода, как часть некоего “анти-хакерского” решения, необходимого для предотвращения “читерства” пользователей игры. Наличие функций, которые явно отключают, а затем снова активируют SMEP, указывает на то, что решение реализовать данную возможность подобным образом было преднамеренным. Однако поскольку драйвер не производит никаких дополнительных проверок, любой пользователь может вызвать и использовать уязвимый IOCTL-код, передавая ему специальным образом подготовленный буфер, содержащий указатель на необходимую функцию. Это делает описанный драйвер по существу руткитом, позволяющим любому пользователю взаимодействовать с операционной системой на самом высоком уровне привилегий. Более того, мы обнаружили несколько уже детектируемых вредоносных программ, которые используют ранее известную уязвимость в capcom.sys для повышения своих привилегий в системе.

После обнаружения уязвимости мы связались с центром реагирования на инциденты BANDAI NAMCO Online Inc. – они оперативно ответили и выпустил патч в течении трех дней. Компания удалила драйвер bandainamcoonline.sys из дистрибутива игры, он больше не загружается и не используется исполняемым файлом. Это решение очень похоже на то, как это сделали свое время в Capcom, и является приемлемым в данном случае.

Найти эту уязвимость было бы невозможно без технологии Exploit Checker, являющейся плагином для нашей “песочницы”. Технология используется не только во внутренней инфраструктуре, но также входит в состав “песочницы” в KATA (Kaspersky Anti Targeted Attack Platform). Exploit Checker был разработан для мониторинга подозрительных событий, которые происходят на самых ранних этапах пост-эксплуатации, и может обнаруживать различные приемы и техники, часто используемые в эксплойтах – ROP, Heap Spray, Stack Pivot и т.д. В данном конкретном случае сработали множественные эвристики на исполнение кода в режиме супервизора в пользовательском адресном пространстве, и исполняемый файл был помечен для более подробного анализа аналитиками. Если бы была предпринята попытка изменения токена процесса на системный – техника, широко используемая в эксплойтах для повышения привилегий – она была бы автоматически задетектирована “песочницей” с использованием плагина Exploit Checker.

Решения “Лаборатории Касперского” детектируют уязвимые драйверы, упомянутые в статье, как HEUR: HackTool.Win32.Banco.a и HEUR: HackTool.Win32.Capco.a.

Публикации на схожие темы

Leave a Reply

Your email address will not be published. Required fields are marked *