作者: 维阵漏洞研究员 -- lawhack
摘要
漏洞类型:内核内存越界读
漏洞危害:BSOD
漏洞成因:未能对传入的参数进行有效验证,对读取内存的边界值控制不严格,导致超过了原有内存的2字节进行越界读取。
挖掘方式:代码审计
漏洞编号:CVE-2020-23938
漏洞定位:在安博士的Ahnlab V3 Lite(4.0.8.3)产品中,其中的文件过滤驱动服务为AntiStealth_V3LITE40F(4.11.0.1),对应的驱动文件名称为TfFRegNt.SYS。
漏洞触发函数:sub_4091FE
漏洞分析
1. 漏洞相关概述
极光无限维阵专家团队在对安博士杀毒软件进行分析时,发现Ahnlab V3 Lite(4.0.8.3)产品的TfFRegNt.SYS驱动存在DOS漏洞。
在进行代码分析前,我们首先需要对漏洞相关信息进行确认,下文将为大家分为四个步骤进行详解。
第一步,首先我们需要查看该驱动的服务属性:
![12d517e62ab2cf920513c741d8f5a1b6.png](https://i-blog.csdnimg.cn/blog_migrate/2478140fe2bda7f306469364f68e2dfa.jpeg)
第二步,确认访问用户层对内核层驱动时需要的符号链接:
![25271b4e0cb3a9d23432e1e51be85bdb.png](https://i-blog.csdnimg.cn/blog_migrate/daa6613a1c5827ed25051f7c9e88b9c2.jpeg)
第三步,查看安全属性:
![0472f78b1b9d1268744d2c6a4b2bc906.png](https://i-blog.csdnimg.cn/blog_migrate/10412ebeb5497d94fab6c40e3721a2b9.jpeg)
![4aec0ed26631daaa72ad9f5c836ceaa9.png](https://i-blog.csdnimg.cn/blog_migrate/48f427ff576424aff1d60da70dfe8480.jpeg)
如上图所示,我们发现必须通过管理员权限才能对该驱动进行读写。
第四步,我们还需要查看该驱动的设备属性:
![3631417536e11da64a6dfe8520fe5e1a.png](https://i-blog.csdnimg.cn/blog_migrate/33a5cefdefbb38ca0f101b5cfb24d36e.jpeg)
可以看出,该驱动运用的是BUFFERED_IO的缓冲读写方式,这意味着用户的输入会被拷贝到内核的内存空间中。
2. 代码分析
我们利用ida打开TfFRegNt.SYS,查找它处理IOCTL函数的地址,首先跟踪到处理分发函数的地方,如下图所示:
![e6f2784ccc313e8cae176c56889c2271.png](https://i-blog.csdnimg.cn/blog_migrate/76870f4e3ce411db701288db787bff8c.jpeg)
然后在sub_4087B2中对函数类型进行判断:
![dce9b39c18dcf6b1f624027c25df9e17.png](https://i-blog.csdnimg.cn/blog_migrate/071d93e83c1b26b02fc737c8fd1c423d.jpeg)
最终我们可以得到用户的IOCTL处理函数为sub_4095A0,代码如下:
![a52d1cd05ddbf5e202b2d0a0598eb44c.png](https://i-blog.csdnimg.cn/blog_migrate/629d174350bd573d34eb3d705cb274a5.jpeg)
接下来经过前面的校验后,我们进入sub_4091FE函数:
![a4462e21c1bca9105266ced3bb7b1be2.png](https://i-blog.csdnimg.cn/blog_migrate/89db9abcecb0a1b0e00deb87bd43f241.jpeg)
在该函数中,我们将会触发越界访问:
![346996eff778c556de90cf291e0427ae.png](https://i-blog.csdnimg.cn/blog_migrate/d99cafdc4d97ff85ba5d7d0d6a58c176.jpeg)
可以看出,触发漏洞的IOCTL code为0x82000028,在处理该请求时,大家可以尝试将传入的systembuf[1]+8作为索引,来读取从用户层地址映射的内核地址数据,而此处的值是用户层可以控制的,因此通过精心构造的参数可以导致产生读取越界。如果越界读的地址并没有经过初始化,则会触发page_fault_in_nonpaged_area异常导致kernel bug check,最终导致系统crash蓝屏。
![9c7672745fc63be9cdb0a0e6eb6c826f.gif](https://i-blog.csdnimg.cn/blog_migrate/45f49f3b667efc0befd1d741ec8d00dc.gif)
3. 漏洞调试
当我们搭建好双机调试环境后,就可以开始试着调试下整个漏洞的触发过程,首先在0x95a0函数偏移下断点:
![2a5114d7d207b255721ee191b1327199.png](https://i-blog.csdnimg.cn/blog_migrate/ab5d368f5718a6654dc729fe176f129e.jpeg)
接着运行poc程序,windbg中断,查看调用堆栈:
![3543d52cc9f8a334b6a3906b992c2038.png](https://i-blog.csdnimg.cn/blog_migrate/ef5df5dfa1883c20a62e52d22582d1a3.jpeg)
由此我们可以确认这是由poc程序发起的io请求。
接下来该程序会对IRP进行解析,我们能得到current_stack_location的数据,之后进一步获取io的请求code,进行对比并执行对应的处理。该函数的第二个参数即为的当前的IRP指针:
![c7a0d8cc2791130b0ce6286e12b4bd2e.png](https://i-blog.csdnimg.cn/blog_migrate/a8f7e1b088265f2c659909cbcc38529f.jpeg)
然后我们查看用户数据在内核内存上的映射,如下所示:
![e473eb637e33c321fc0439a7b16259e6.png](https://i-blog.csdnimg.cn/blog_migrate/d0c2fe585011525c2fdef51e88008e82.jpeg)
![6001c2539d12e85f1412a427804649cf.png](https://i-blog.csdnimg.cn/blog_migrate/af866a0252e46b0168ac2b6a1cdada7b.jpeg)
相应的内存属性也需要确认:
![50340f7e13cea72bab53aba7a17a7f28.png](https://i-blog.csdnimg.cn/blog_migrate/174dfe7f85e37c9828ac03f5df6b88d9.jpeg)
此时该内存块的首地址和尾地址分别为0xc3600000、0xd3600000。
下面是我们对该内存地址数据的判断:
![b3b20f09bd2b2bd65f4965a405b26183.png](https://i-blog.csdnimg.cn/blog_migrate/0c751e6b6c14499d4b67f87072f29975.jpeg)
运行时的数据如下:
![a8c411e8709500f73770620ca9e736b1.png](https://i-blog.csdnimg.cn/blog_migrate/6115cff666adea0bca0c96614078eea5.jpeg)
可以看到经过计算后访问的地址是0xd3600000,这是上个内存块的尾地址,但该地址尚未分配,所以会导致kernel bug check,最终导致内核崩溃。
![df332cab358ede07963024526b0064bd.png](https://i-blog.csdnimg.cn/blog_migrate/87e3d0804c1f39a0bd9da4262d9c1609.jpeg)
![61cc848ff3dd1b0b0505876c113eb6f4.png](https://i-blog.csdnimg.cn/blog_migrate/d3ecf97693ed0d5b4213c40ea5b27b60.jpeg)
漏洞修复建议
事实上,我们在访问内存之前,驱动对该处的参数就已经做过了检查,但是检查的并不是很严格:
![eaedc3208ebcd10ea813d030075736d4.png](https://i-blog.csdnimg.cn/blog_migrate/ea4b388ed9a9419f1f4f0974f119c7c3.jpeg)
在第三处判断中应该判断前两个参数的和是否大于等于输入长度,如果是则返回0,代表参数不正确。前两个参数之和是字符串的最大索引长度,因为字符串的索引是从0开始的,所以必然要小于字符串长度。
声明:
本文由极光无限原创,转载需注明来源。