Report CVE-2023-28218
Обзор уязвимости
Уязвимость приводит к повышению привилегий в ядре Windows. Ошибка присутствует в драйвере Windows Ancrillary Function Driver for WinSock (AFD.sys). Уязвимость была исправлена в обновлении от 11 апреля 2023 года. Имеет оценку CVSS:3.1 7.0 / 6.1 и классифицируется как Important.
Описание уязвимости
- Тип ошибки:
Double fetch и Integer overflow, приводящие к pool overflow.
- Ошибка возникает в функциях
Afd!AfdComputeCMSGLength и Afd!AfdCopyCMSGBuffer.

Обе функции принимают v82 в качестве входного параметра. v82 — это адрес, контролируемый usermode. В функции Afd!AfdComputeCMSGLength этот адрес напрямую разыменовывается для получения значения. Затем вычисляется длина CMSG buffer и возвращается. После этого по этому размеру выделяется pool. Контролируя два входных параметра a1 и a2, можно контролировать размер, который будет возвращён в параметре a3.

В функции Afd!AfdCopyCMSGBuffer адрес v82 напрямую разыменовывается для получения значения. После нескольких проверок это значение будет использоваться как размер операции memmove.

В этой функции есть ошибка Integer overflow; в сочетании с тем, что обе функции напрямую выполняют fetch из адреса на стороне usermode, мы можем изменить это значение во время выполнения. Это приводит к тому, что размер, используемый в memmove, становится очень большим. Когда копирование доходит до недоступной области памяти, срабатывает try catch. Но копирование предыдущих областей памяти уже произошло. Таким образом, мы можем выполнять копирование нужного нам размера.

- Чтобы запустить POC, сначала нужно создать
socket с параметром type равным SOCK_DGRAM. Затем использовать handle этого socket в качестве параметра при вызове функции bind. Наконец, создать 2 потока: один поток будет постоянно вызывать DeviceControl с IOCTL 0x120D3. Настроить подходящий userbuffer, чтобы обойти некоторые проверки. Оставшийся поток будет постоянно изменять значение, хранящееся по usermode-адресу, который передаётся в качестве параметра в обе вышеупомянутые функции.
Эксплуатация
- С помощью этой ошибки можно переполнить non-paged NX pool с нужным размером, при этом данные полностью контролируются со стороны usermode.
- Подход к эксплуатации: распылить (spray) как можно больше объектов Namedpipe, затем освободить часть объектов, чтобы создать дыры в куче. Затем создать пул на основе размера, вычисленного функцией
Afd!AfdComputeCMSGLength; этот размер должен совпадать с размером объекта Namedpipe. Тогда пул будет выделен в только что освобождённые объекты. Используя ошибку, переполнить соседние объекты Namedpipe, после чего использовать механизмы Namedpipe для получения возможности чтения/записи памяти ядра. Прочитать токен системного процесса и записать его в токен текущего процесса.
Затронутые версии
- Windows Server 2012 R2 (установка Server Core) сборки до версии 6.3.9600.20919
- Windows Server 2012 R2 сборки до версии 6.3.9600.20919
- Windows Server 2012 (установка Server Core) сборки до версии 6.2.9200.24216
- Windows Server 2012 сборки до версии 6.2.9200.24216
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 (установка Server Core) сборки до версии 6.1.7601.26466
- Windows Server 2008 R2 for x64-based Systems Service Pack 1 сборки до версии 6.1.7601.26466
- Windows Server 2008 for x64-based Systems Service Pack 2 (установка Server Core) сборки до версии 6.0.6003.22015
- Windows Server 2008 for x64-based Systems Service Pack 2 сборки до версии 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 (установка Server Core) сборки до версии 6.0.6003.22015
- Windows Server 2008 for 32-bit Systems Service Pack 2 сборки до версии 6.0.6003.22015
- Windows Server 2016 (установка Server Core) сборки до версии 10.0.14393.5850
- Windows Server 2016 сборки до версии 10.0.14393.5850
- Windows 10 Version 1607 for x64-based Systems сборки до версии 10.0.14393.5850
- Windows 10 Version 1607 for 32-bit Systems сборки до версии 10.0.14393.5850
- Windows 10 for x64-based Systems сборки до версии 10.0.10240.19869
- Windows 10 for 32-bit Systems сборки до версии 10.0.10240.19869
- Windows 10 Version 22H2 for 32-bit Systems сборки до версии 10.0.19045.2846
- Windows 10 Version 22H2 for ARM64-based Systems сборки до версии 10.0.19045.2846
- Windows 10 Version 22H2 for x64-based Systems сборки до версии 10.0.19045.2846
- Windows 11 Version 22H2 for x64-based Systems сборки до версии 10.0.22621.1555
- Windows 11 Version 22H2 for ARM64-based Systems сборки до версии 10.0.22621.1555
- Windows 10 Version 21H2 for x64-based Systems сборки до версии 10.0.19044.2846
- Windows 10 Version 21H2 for ARM64-based Systems сборки до версии 10.0.19044.2846
- Windows 10 Version 21H2 for 32-bit Systems сборки до версии 10.0.19044.2846
- Windows 11 version 21H2 for ARM64-based Systems сборки до версии 10.0.22000.1817
- Windows 11 version 21H2 for x64-based Systems сборки до версии 10.0.22000.1817
- Windows 10 Version 20H2 for ARM64-based Systems сборки до версии 10.0.19042.2846
- Windows 10 Version 20H2 for 32-bit Systems сборки до версии 10.0.19042.2846
- Windows 10 Version 20H2 for x64-based Systems сборки до версии 10.0.19042.2846
- Windows Server 2022 (установка Server Core) сборки до версии 10.0.20348.1668
- Windows Server 2022 сборки до версии 10.0.20348.1668
- Windows Server 2019 (установка Server Core) сборки до версии 10.0.17763.4252
Патч
- Ошибка была исправлена заменой двух старых функций на две новые; к именам старых функций добавлен суффикс
_old. Эти новые функции уже. В двух новых функциях, хотя double fetch всё ещё присутствует, извлечённое значение проверяется перед использованием. Функции Rtl используются для замены арифметических операций, предотвращая Integer overflow.
Заключение
- Уязвимость затрагивает очень широкий диапазон систем и угрожает многим системам. Однако у эксплойта при запуске всё ещё есть небольшой процент неудач, приводящих к падению Windows из-за spray в куче. Кроме того, после повышения прав процесса cmd до System, выход из этого процесса также приведёт к падению Windows, поскольку в процессе эксплуатации объект Namedpipe был повреждён (corrupt).
Вложения
- Минимальный POC

- Эксплойт POC
