Как не стоит использовать драйвер для повышения привилегий
Недавно мы начали получать подозрительные события от плагина для нашей внутренней «песочницы» под названием 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:WindowsSysWOW64». Затем драйвер загружается с помощью функции 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.
Уязвимый драйвер: почти выученный урок