
Утилита командной строки Windows для чтения, записи и выполнения кода в режиме ядра из контекста администратора с использованием техники перенаправления выполнения при проверке шрифтов, что обеспечивает расширенную отладку ядра и устранение неполадок системы.
r0ak — это утилита командной строки для Windows, которая позволяет легко читать, записывать и выполнять код на уровне ядра (с некоторыми ограничениями) прямо из командной строки, не требуя ничего, кроме прав администратора.
r0ak v1.0.0 -- Ring 0 Army Knife
http://www.github.com/ionescu007/r0ak
Copyright (c) 2018 Alex Ionescu [@aionescu]
http://www.windows-internals.com
USAGE: r0ak.exe
[--execute <Address | module.ext!function> <Argument>]
[--write <Address | module.ext!function> <Value>]
[--read <Address | module.ext!function> <Size>]

Ядро Windows — это богатая среда, в которой на типичной системе выполняются сотни драйверов и присутствуют тысячи переменных, содержащих глобальное состояние. Для расширенной диагностики ИТ-специалисты обычно используют такие инструменты, как отладчик Windows (WinDbg), утилиты SysInternals или пишут собственные. К сожалению, использование этих инструментов становится всё более сложным, и они сами ограничены собственным доступом к API Windows и предоставляемым функциям.
Некоторые из сегодняшних проблем включают:
В такой среде стало очевидно, что простой инструмент, который можно использовать как экстренную «заплатку»/быстрое исправление и для быстрой диагностики проблем на уровне ядра/системы, которые могут быть выявлены при анализе состояния ядра, может быть ценен для сообщества.

r0ak работает, перенаправляя поток выполнения доверенных проверок шрифтов диспетчера окон при попытке загрузить новый шрифт. Для этого он заменяет процедуру сравнения доверенной таблицы шрифтов на альтернативную функцию, которая планирует элемент рабочей задачи (WORK_QUEUE_ITEM), хранящийся во входном узле. Затем правый дочерний элемент доверенной таблицы шрифтов (который служит корневым узлом) перезаписывается буфером записи именованного канала (NP_DATA_ENTRY), в котором хранится пользовательский элемент работы. Этот элемент, его базовая рабочая функция и параметр будут в конечном итоге выполнены выделенным ExpWorkerThread на уровне PASSIVE_LEVEL после попытки загрузки шрифта и выполнения процедуры сравнения, которая получит родительский узел, основанный на именованном канале, в качестве входных данных. Событие трассировки событий Windows (ETW) в реальном времени используется для получения асинхронного уведомления о завершении выполнения рабочего элемента, что позволяет безопасно разрушить структуры, освободить буферы режима ядра и восстановить нормальную работу.
При использовании опции --execute эта функция и параметр предоставляются пользователем.
При использовании --write используется специальный gadget для изменения произвольных 32-битных значений в любом месте памяти ядра.
При использовании --read write-gadget используется для изменения указателя и размера буфера HSTI системы (Примечание: это деструктивное поведение для любых других приложений, которые будут запрашивать данные HSTI. Поскольку это необязательное поведение Windows, а этот инструмент предназначен для аварийной отладки/экспериментов, потеря данных была сочтена приемлемой). Затем API запроса HSTI используется для копирования данных обратно в адресное пространство пользовательского режима инструмента, и выводится шестнадцатеричный дамп.
Поскольку используются только встроенные, подписанные Microsoft функции Windows, и все вызываемые функции являются частью битовой карты KCFG, не происходит нарушения каких-либо проверок безопасности, не требуются флаги отладки или использование плохо написанных сторонних драйверов.
Нет. Поскольку этот инструмент (и лежащая в его основе техника) требует привилегированного токена уровня SYSTEM, который может получить только пользователь, работающий под учётной записью администратора, не происходит обхода границ безопасности для достижения эффекта. Поведение и полезность инструмента возможны только благодаря повышенному/привилегированному контексту безопасности учётной записи администратора в Windows, и это считается поведением, предусмотренным архитектурой.
Конечно! Важно всегда сообщать о проблемах безопасности в Microsoft, даже если, казалось бы, не произошло нарушения привилегированных границ – их команды исследователей и разработчиков могут найти новые векторы и способы доступа к определённым путям кода, о которых внешний исследователь мог не подумать.
Соответственно, в ноябре 2014 года в Центр безопасности Microsoft (MSRC) был подан запрос по безопасности, на который ответили: «[…] не подпадает под категорию проблем безопасности, которые мы решали бы с помощью традиционного бюллетеня безопасности. Он […] предполагает наличие прав администратора — места, где архитектурно мы в настоящее время не определяем защищаемую границу безопасности. Поэтому мы не будем заниматься исправлением этого.»
Кроме того, в апреле 2015 года на конференции Infiltrate был представлен доклад под названием Insection : AWEsomely Exploiting Shared Memory Objects, в котором подробно описывалась эта проблема, в том числе для присутствовавших разработчиков Microsoft, которые согласились, что в настоящее время это выходит за рамки архитектурных границ безопасности Windows. Это связано с тем, что существуют буквально десятки (если не больше) других способов, с помощью которых администратор может читать/записывать/выполнять память Ring 0. Этот инструмент просто упрощает коммерциализацию одного из таких векторов для целей отладки и устранения неполадок системы.
Упаковка этого кода в виде библиотеки потребовала бы тщательного удаления всего интерактивного разбора командной строки и стандартного вывода, после чего, без серьёзных переписываний, «кит»: