受影响产品:
受影响组件:
腾讯 QQ 和 TIM 是深圳市腾讯计算机系统有限公司开发的两款即时通讯软件。它们都有一个组件 QQProtect.exe,位于 %ProgramFiles(x86)%\Common Files\Tencent\QQProtect\bin。QQProtect.exe 被安装为名为 QPCore 的 Windows 服务,并在系统启动时以 NT Authority\SYSTEM 身份自动运行。组件 QQProtect.exe 及其依赖的 DLL QQProtectEngine.dll 都存在任意地址写入漏洞。低权限攻击者可以利用这两个漏洞在 QQProtect.exe 进程内加载恶意 DLL,并获得 NT Authority\SYSTEM shell。
第一个漏洞位于 QQProtect.exe+0x40c9f8 处的代码:

其中 a2 是一个可由攻击者控制的指针,dword_41a740 是一个全局变量,其值为 0x00000001。因此,攻击者可以在任意地址写入 DWORD(1) 值。
第二个漏洞位于 QQProtectEngine.dll+0x3B4F6 处的代码:

其中 v3 是一个可由攻击者控制的指针。因此,攻击者可以在任意给定地址 ptr 处写入值 std::bit_cast<DWORD>(ptr) + 4。
由于 QQProtect.exe 没有启用 ASLR 保护,攻击者可以篡改位于 QQProtect.exe 中的函数指针,并利用 ROP 链轻松执行任意代码。
该 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 shell:
$ QQProtect.exe <PATH TO evil.dll>
