首页
社区
课程
招聘
[原创]Windows condrv.sys 本地拒绝服务漏洞分析
2021-1-20 02:34 9015

[原创]Windows condrv.sys 本地拒绝服务漏洞分析

2021-1-20 02:34
9015

今天这个蓝屏比较火,故做了下分析

 

直接原因分析:
漏洞堆栈如下:

 

从堆栈可以看到,当用户态打开路径\.\globalroot\device\condrv\kernelconnect时,内核对象管理器会依次解析对象目录,直到解析到\device\condrv 发现这是个设备对象,而设备对象的设备类型是有ParseProcedure例程的.故调用设备的对象的ParseProcedure即函数IopParseDevice. 函数内部在处理完请求会去关闭打开的文件对象.

 

关闭文件对象内核会调用相应的驱动的IRP例程. IRP_MJ_CLEANUP 以及IRP_MJ_CLOSE。
即condrv驱动的函数:CdpDispatchCleanup CdpDispatchClose.

 

而CdpDispatchCleanup在处理IRP_MJ_CLEANUP时会尝试引用文件对象FILE_OBJECT的FsContext成员,此成员应该为驱动condrv自己创建的一个透明数据结构.但是事实是这个成员是未预期的值NULL. 所以导致空指针引用蓝屏.如下图:

 


 

根因分析:
我们可以假设这个文件对象是“非法”的,那么可能从它创建初始化的时候就出现问题。对内核有了解的应该知道,如果要引用设备对象那么必然要有打开操作即肯定要向condrv驱动发送IRP: IRP_MJ_CREATE 那么我看下condrv驱动的Create例程:

 

如上图所示,它其实是在循环比较要打开的文件名是不是预先定义的如果是则调用相应的回调函数 如下图:

由于Poc打开的是kernelconnect 所以我们看下函数CdCreateKernelConnection

 

第一个判断就是如果先前模式是usermode 则返回拒绝. 也就是condrv驱动的设计初衷就是不允许用户态直接访问这个符号链接.

 

但是问题出就处在此处返回拒绝上. 因为这是在处理IRP,它没有设置IRP的状态码以及调用IoCompleteRequest 来结束IRP.

 

如上图可以看到Irp->IoStatus.Status 为0. 而0 表示成功.
而在IopPraseDevice中是以IRP的IoStatus.Status成员来判断IoCallDriver是否成功.也就是本意是拒绝用户态打开这个符号链接,但实际因为开发疏忽导致内核认为打开成功.此时文件对象的fscontext成员没有被condrv赋值. 所以当关闭文件对象时,导致蓝屏。实际测试修改
IRP的IoStatus.Status的值为失败时,不会蓝屏。

 

总结:
其实归根到底就是condrv的驱动开发人员在处理IRP_MJ_CREATE时,没有正确处理拒绝情况, 导致本应该失败的 内核误以为是成功. 进而在后续对文件对象的操作时蓝屏.

 

#


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞1
打赏
分享
最新回复 (9)
雪    币: 14
活跃值: (263)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwTrojan 2021-1-20 08:40
2
0
从用户态的角度来看,为什么Chrome系和FireFox会触发蓝屏而旧浏览器不会呢
雪    币: 2321
活跃值: (4018)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
熊猫正正 9 2021-1-20 09:12
3
0
哥来了
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
evilkis 7 2021-1-20 09:32
4
0
ZwTrojan 从用户态的角度来看,为什么Chrome系和FireFox会触发蓝屏而旧浏览器不会呢
浏览器只是一个输入点不是触发蓝屏的必要条件. 其实分析已经很清楚了 就是用户态直接打开这个链接导致的蓝屏. 可以自己写poc 调用API:CreateFile 文件名填写这个符号链接即可触发蓝屏. 所以你说的旧浏览器不会触发 应该是旧浏览器没有触发对这个符号链接的打开 。
雪    币: 9664
活跃值: (4563)
能力值: ( LV15,RANK:800 )
在线值:
发帖
回帖
粉丝
银雁冰 16 2021-1-20 10:52
5
0
这个漏洞半年前就公开了:https://twitter.com/waleedassar/status/1281551510640504833
雪    币: 596
活跃值: (449)
能力值: ( LV12,RANK:320 )
在线值:
发帖
回帖
粉丝
evilkis 7 2021-1-20 11:11
6
0
银雁冰 这个漏洞半年前就公开了:https://twitter.com/waleedassar/status/1281551510640504833
看到了, 只是网上没有分析文章   这里是分析一下成因
雪    币: 125
活跃值: (161)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
zhangtaopy 1 2021-1-21 09:32
7
0
大哥牛逼
雪    币: 3350
活跃值: (3372)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengyunabc 1 2021-1-23 17:03
8
0
理解这个漏洞确实需要已经对对象管理器以及FILE_OBJECT.FsContext了解。
雪    币: 1556
活跃值: (2077)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
killleer 2021-1-27 08:55
9
0
银雁冰 这个漏洞半年前就公开了:https://twitter.com/waleedassar/status/1281551510640504833
发现人有复数人,没有人确认或者具体触发方式,只是那个人确定并公布了准确触发的poc,不然不可能微软半年不搭不理的
雪    币: 3143
活跃值: (5221)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
0346954 2 2021-1-28 10:49
10
0
学习了 谢谢
游客
登录 | 注册 方可回帖
返回