
CVE-2023-34312
Затронутые продукты:
Затронутые компоненты:
Tencent QQ и TIM — два приложения для обмена мгновенными сообщениями, разработанные компанией Shenzhen Tencent Computer System Co., Ltd. Оба содержат компонент QQProtect.exe, расположенный в %ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin. QQProtect.exe устанавливается как служба Windows с именем QPCore и автоматически запускается от имени NT Authority\SYSTEM при загрузке системы. Как компонент QQProtect.exe, так и его зависимая библиотека DLL QQProtectEngine.dll содержат уязвимость записи по произвольному адресу. Злоумышленник с низкими привилегиями может объединить обе уязвимости, загрузить вредоносную DLL в процесс QQProtect.exe и получить оболочку NT Authority\SYSTEM.
Первая уязвимость находится в коде по адресу QQProtect.exe+0x40c9f8:

где a2 — указатель, который может контролировать злоумышленник, а dword_41a740 — глобальная переменная со значением 0x00000001. Таким образом, злоумышленник может записать значение DWORD(1) по любому адресу.
Вторая уязвимость находится в коде по адресу QQProtectEngine.dll+0x3B4F6:

где v3 — указатель, который может контролировать злоумышленник. Таким образом, злоумышленник может записать значение std::bit_cast<DWORD>(ptr) + 4 по любому заданному адресу ptr.
Злоумышленник может изменить указатель на функцию, находящийся в QQProtect.exe, и использовать ROP-цепочки для простого выполнения произвольного кода, поскольку QQProtect.exe не имеет защиты ASLR.
Код эксплойта (PoC) написан на языке Rust. Для компиляции следует использовать тулчейн i686-pc-windows-msvc.
$ cd poc
$ cargo +stable-i686-pc-windows-msvc build --release --config "build.rustflags = [\"-C\", \"target-feature=+crt-static\"]"
Вы получите две DLL:
target\release\tinyxml.dll
target\release\evil.dll
Затем поместите обе указанные выше DLL и %ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin\QQProtect.exe в одну папку.
Наконец, получите оболочку NT Authority\SYSTEM одной командой:
$ QQProtect.exe <PATH TO evil.dll>
