首页
社区
课程
招聘
[原创]Windows主机入侵检测与防御内核技术深入解析(11)
发表于: 2024-9-24 08:34 4618

[原创]Windows主机入侵检测与防御内核技术深入解析(11)

2024-9-24 08:34
4618

本系列文章为看雪星星人为看雪安全爱好者创作的原创免费作品。

欢迎评论、交流、转载,转载请保留看雪星星人署名并勿用于商业盈利。

本人水平有限,错漏在所难免,欢迎批评指正。

前文内容请见Windows主机入侵检测与防御内核技术深入解析(1)-(10)。

        漏洞分析提示的只是漏洞存在的理论可能,并不能确认漏洞真正存在。这种尚未被确认的漏洞只能称为潜在漏洞。只有编写出“利用”并实现攻击的漏洞,才能确认是真正存在的漏洞,可称为确实漏洞

        上文的利用是利用验证演示程序(即PoC)的简称,是名词而非动词,指一段演示代码,能演示利用漏洞进行的攻击。攻击必须是成功的。而渗透测试,实际上就是针对漏洞编写利用的过程。

        安全系统的开发团队工作的方式和渗透测试团队是不一样的,但编写漏洞利用依然有很大的用处。

        对潜在漏洞成功地编写漏洞利用可以确认漏洞存在。虽然未能成功地编写出漏洞利用并不彻底否认漏洞的存在,但能评估利用该漏洞进行攻击的难度。如果攻击难度非常高,那么修补该漏洞的优先级就可以相应地靠后。

        漏洞利用也是在漏洞修补之后进行验证的必要工具。如果没有漏洞利用,那么漏洞即便得到了所谓“修补”,也是完全无法验证的。那么和没有进行修补的区别在哪呢?

        如果开发团队不编写利用,那么利用就将由渗透测试人员甚至是恶意攻击者来实现,而项目付出的成本将会急剧飙升。

        5.2.1节的设计漏洞分析曾经提出了U盘插入漏洞。如果一个装满了可执行文件的U盘被插入到主机,由于这个过程并不涉及文件的写入,安全系统将无法发觉这些可执行文件的加入,从而默认它们都是原来就存在的可信的文件。

        这个利用很容易实现,甚至不需要编写代码。测试中操作者将U盘插入,然后鼠标双击U盘中存在的可执行文件即可。如果可执行文件被成功执行,即绕过了安全系统的防护。

        但和渗透测试人员不同,开发者编写利用的过程中需要不断思考“如果禁止这样做,那么是否还能绕过”的问题。这样才能逐步触及问题的本质。而开发人员是了解系统实现的原理的,因此比渗透人员做同样的工作成本要低得多。

      就如上这个问题,开发者应继续追问:“如果禁止插入U盘,是否还能利用这个漏洞呢?”

        除了插入U盘之外,还有其他操作能让文件不经过文件系统创建就“出现”在系统中。比如添加虚拟盘。如加载一个ISO文件,系统中将出现一个虚拟盘。但这些操作的共同特点是,系统中将出现新的盘符。

        系统存在漏洞并不是一件糟糕的事。糟糕的是漏洞存在却无人知道,或者有人知道却不知如何利用。当利用明确,那么修补的方式也同时明确了。如果该漏洞的本质是出现新的盘符未被考虑,那么修补有如下的选项:

n   禁止任何新盘符出现。这适合那些禁止插入任何可移动存储设备的环境。

n   允许出现新盘符,但是任何新盘符上的可执行模块都一律禁止执行。这种策略适合大多数普通办公的环境。

n   允许出现新盘符。同时新盘插入时,自动扫描盘上所有可执行文件并加入可疑链表中。这种适应性最好,但是开发成本高、且容易带来更多潜在漏洞,不是经济且可靠的选择。

        在考虑到“新增盘符”是一个漏洞的情况下,分析者也应同时考虑“新增路径”是否存在漏洞?因为新增盘符的本质是增加了新的路径的可能。但不一定需要增加盘符,也可能新增可执行文件的路径。比如说,通过文件重定向、创建软链接等形式,可以让一个可执行文件以不同的路径来执行。

        看起来对原本存在的文件新增路径并不会带来任何问题,但是可疑文件也可能新增路径。

        尝试编写这样的利用:一个文件被复制进入系统,从而它的路径进入了可疑库。但是,攻击者设法为它创建了一个链接,从而诞生了一个新的路径。然后不知情的用户点击了新的路径。安全系统拦截到了模块执行,但比对显示其路径并不在可疑库中,因此被放过,从而绕过了系统!

        这其中的关键是,能否创建一个链接产生新的路径,让微过滤驱动获得的路径并非原始的,而是新的路径?如果要修补漏洞,那么在微过滤驱动中如何获得文件的原始路径?这正需要编写利用去证实或者证否,请读者自己完成。

 

        5.2.2节的技术漏洞分析指出,文件映射读写将会绕过仅仅对非分页文件些写进行处理的微过滤驱动程序的拦截。这从理论上可行,利用编写也比较简单。网上很容易找到利用内存映射方式读写文件的例子。

        内存映射读写带来的问题是:这种读写方式并不会直接触发文件读写操作。在这里请回顾图3-2。在用户态使用API函数WriteFile来写入文件的时候,微过滤驱动能拦截到非分页的普通请求(IRP),因而能得到处理机会。

        但通过内存映射读写文件的时候,被写入的是内存而不是文件,因此不会发生这种请求。同时内存写入之后,图3-2中的文件缓存将被改写。程序读取文件的时候会从文件缓存中读取,因此文件的内容本质已经被改变。

        文件缓存和硬盘上的真实文件可以不一致,这无关紧要。在需要同步的时候,Windows内核通过分页请求将最新的文件缓存内容写入磁盘。这时微过滤驱动是可以拦截到磁盘写入请求的。

      但遗憾的是请回顾代码3-1中的1处,其中存在一个恰好跳过分页请求的标记FLTFL_OPERATION_REGISTRATION_SKIP_PAGING_IO。因此,本书示例的安全系统将拦截不到这种请求。

        这个利用的编写应该比较简单,因此本书并没有给出实际的代码,建议读者自己尝试编写。但要注意的是,这个例子的编写成功并不意味着漏洞能真正被利用。这和5.4.1节中的盘符与路径漏洞不同。

        对于盘符漏洞,用户只要捡起一个可疑的U盘插入系统,然后双击执行,就破坏了安全系统的防护。而在本节的内存映射读写文件的利用编写出来的可执行文件本身是新产生的可疑文件,会直接被模块防御阻止,因而无法攻击成功。开发者会以此种攻击无法实现作为理由而拒绝修复漏洞。

        因此在提供利用时,我们有必要说明真正实现攻击的途径。虽然直接编写一个可执行文件来实现攻击是不可行,但我们完全可以设想现实场景中可能的真正攻击。

        假定有某个合法的下载工具,比如浏览器,或者FTP客户端等等,它在保存文件到本地的时候用的是内存映射方式(这种可能性存在的概率是极大的)。

        不知情的用户用该工具从网上下载一个恶意文件保存到本地时,模块防御因为拦截不到写入操作而无法将它加入可疑库。当用户再无意地执行它的时候,防御措施就被彻底绕过了。

        经过这样的评估,开发者会意识到此处的漏洞是极为严重的。因为内存映射读写文件在各类工具软件中广泛存在,该漏洞足以让加强主机防御系统的一切努力都付之东流。如果不修复它,其他所有的工作都是白费。


[峰会]看雪.第八届安全开发者峰会10月23日上海龙之梦大酒店举办!

最后于 2024-9-24 08:38 被星星人编辑 ,原因:
收藏
免费 5
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//