
Эксплойт удаленного выполнения кода в библиотеке RPC
CVE-2022-26809 — уязвимость в ключевом компоненте Windows (RPC) получила оценку CVSS 9,8 не без причины, поскольку атака не требует аутентификации и может быть выполнена удалённо по сети, что может привести к удалённому выполнению кода (RCE) с привилегиями службы RPC, которые зависят от процесса, размещающего среду выполнения RPC. Эта критическая ошибка при определённых условиях позволяет получить доступ к незапатченному хосту Windows, на котором запущен SMB. Уязвимость может быть использована как из внешней сети для её взлома, так и между машинами внутри сети.
В CVE указано, что уязвимости находятся в среде выполнения Windows RPC, которая реализована в библиотеке rpcrt4.dll. Эта библиотека времени выполнения загружается как в клиентские, так и в серверные процессы, использующие протокол RPC для связи. Мы сравнили версии 10.0.22000.434 (март) и 10.0.22000.613 (исправленная) и выделили список изменений.
Функции OSF_SCALL::ProcessResponse и OSF_CCALL::ProcessReceivedPDU схожи по своей сути; обе обрабатывают RPC-пакеты, но одна работает на стороне сервера, а другая — на стороне клиента (SCALL и CCALL). Сравнивая OSF_SCALL::ProcessReceivedPDU, мы заметили два блока кода, которые были добавлены в новую версию.


Глядя на исправленный код, мы увидели, что после QUEUE::PutOnQueue вызывалась новая функция. Исследуя новую функцию и погружаясь в её код, мы выяснили, что она проверяет целочисленные переполнения. Другими словами, новая функция в патче была добавлена для проверки того, что целочисленная переменная оставалась в пределах ожидаемого диапазона значений.

Углубившись в уязвимый код в OSF_SCALL:GetCoalescedBuffer, мы заметили, что ошибка целочисленного переполнения может привести к переполнению буфера в куче, когда данные копируются в буфер, слишком малый для их размещения. Это, в свою очередь, позволяет записывать данные за пределы буфера в кучу. При эксплуатации этот примитив приводит к удалённому выполнению кода!
Такой же вызов для проверки целочисленного переполнения был добавлен и в других функциях:
OSF_CCALL::ProcessResponse OSF_SCALL::GetCoalescedBuffer OSF_CCALL::GetCoalescedBuffer
Уязвимость целочисленного переполнения и функция, предотвращающая её, существуют как в клиентских, так и в серверных потоках выполнения.
Ещё в разработке, сроков нет.