Уязвимость в Windows 7 и Vista позволяет повысить привилегии в обход UAC
Интересная уязвимость для повышения локальных привилегий до уровня системы, появилась 24 ноября в виде статьи на ресурсе The Code Project.
🕛 27.11.2010, 14:31
Буквально через несколько часов она была удалена с этого ресурса, но информация уже распространилась по сети и на мой взгляд удалять ее было бессмысленно. Повысить привилегии можно на системах начиная от XP и до Vista/Win7, причем серверные версии тоже находятся под ударом. А что еще более интересно уязвимость актуальна, как на х86 системах, так и на х64. Правда представленный PoC код удалось успешно запустить только на х86 системах.Всему виной недостаточный контроль параметров функции WinAPI RtlQueryRegistryValues(): Эта функция используется для получения сразу нескольких параметров реестра и на выходе заполняет структуру _RTL_QUERY_REGISTRY_TABLE с результатами.
В поле EntryContext, из этой структуры, определяется тип выходного буфера и вот тут существует интересный нюанс, буфер может быть интерпретирован как структура UNICODE_STRING или как буфер из ULONG значений.
По заполнению этого буфера определяется тип ключа реестра, к которому был сделан запрос. Все бы хорошо, но был найден ключ реестра HKCU\EUDC\[Language]\SystemDefaultEUDCFont, к которому можно обращаться только с правами пользователя и изменять его тип на REG_BINARY посредством вызова функции Win32k.sys->NtGdiEnableEudc(). В процессе работы этой функции предполагается, что значение реестра REG_SZ и буфер размещается в стеке, как структура UNICODE_STRING из которой первое значение ULONG интерпретирует длину буфера, но если значение реестра представлено, как REG_BINARY, то возникает классическое переполнение в стеке.
С учетом всех этих нюансов был разработан PoC (by noobpwnftw), который формирует в реестре значение перезаписывающее адрес возврата на стеке и выполняет произвольный буфер с кодом в режиме ядра.