课时2:模块执行的防御

模块执行防御(3-6章)

目的:防止内网用户主动或被动执行非法模块

所用技术:微过滤驱动

难点:

如何界定非法和合法

考虑各种例外情况:如紧急测试、系统自更新

系统性能:不可让用户有明显感知 

漏洞:文件系统的各种不常见行为 避免重入等技术问题


主要编码开发过程

GitHub上下载微软的微过滤驱动示例passThrough

   https://github.com/microsoft/Windows-driver-samples/tree/main/filesys/miniFilter/passThrough

 增加请求回调,在回调中进行安全性:

  •   Create:给文件添加读权限,避免无法读取导致无法判断是否PE文件

  •   Write:判断是否PE文件被写,或者文件写入后是否变成了PE文件

  •   SetInformation:过滤文件改名、文件删除。判断是否PE文件被改名或删除。

  • 对于任何变动或者新生的PE文件的全路径,均加入到可疑名单中。被删除的文件则移除。

  •   ACQUIRE_FOR_SECTION_SYNCHRONIZATION:过滤PE模块的加载任何可疑模块禁止加载,除非被管理者加入白库。


Create过滤(3.1.4节)

目的:

  给文件对象增加读权限,避免无法读取而导致

要点:

  修改data->Iopb->Parameters.Create.SecurityContext->DesiredAccess即可修改权限。

优点:

  处理简单。

缺点:

  扩大了权限,属于漏洞的一种。可以用创建独有FileObject来解决,但是编码麻烦。


Write过滤(3.2节)

目的:监控到PE文件的修改和创建,对任何新PE文件加入可疑库

要点:

  •   向下读取(用FltReadFile)避免系统重入

  •   FltDecodeParameters获取要写入的内容

  •   用原内容确认写入前是否是PE文件

  •   用原内容合并要写入的内容判断写入后是否PE文件

  •   FltDoCompletionProcessingWhenSafe确保后回调中断级在安全的中断级中判断文件并将可疑文件加入可疑库(或从库中移除)

SetInformation请求过滤(3.3节)

目的:监控到PE文件的改名和删除,同时更新可疑库

改名要点:

  注意改名等于卷内移动,但不等于跨卷移动

  data->Iopb->Parameters.SetFileInformation.FileInformationClass如果为FileRenameInformation即为改名

  改名前路径在后回调处理获取不便,因此前回调处理,然后用上下文传递到后回调

  改名后的路径可以在后回调中直接用FltGetFileNameInformation获取

删除要点:

  删除有两种:打开时指定关闭时删除和设置删除

  在考虑“事务”的情况下,删除非常复杂,详见本书第6


演示效果

漏洞的分类

设计漏洞:

  •   设计本身就具有的漏洞:无论选择何种技术来实现,只要概要设计不变就不会消失的漏洞。此类漏洞应该在设计时经过充分的调研、引入多方共同讨论和审核来避免。

  •   如果后期才发现,可能造成要推翻重来的巨大损失。

  • 技术漏洞:

  •   选择的技术方案本身就具有的漏洞。无论如何去修改实现的代码都无法弥补。和设计漏洞一样,需要在选择技术方案的时候经过充分的调研和讨论、审核来避免。

  •   如果实现结束才发现,可能要重选技术方案,重新实现,带来巨大损失。

  • 实现漏洞:

  •   编码和配置中出现的漏洞。这是最广泛存在和难以消灭的漏洞。但往往是可以以有限成本来弥补的。



模块执行漏洞讨论



设计漏洞:

  没有考虑新增磁盘的情况(容易修补)

技术漏洞

  暂无

实现漏洞

  没有考虑内存映射文件

  没有考虑硬链接等路径变化情况

  没有考虑NTFS的事务操作

  处理中有很多判断条件,每处都是潜在漏洞