Windows系统中基于文件过滤驱动的文件动态访问控制技术研究

时间:2022-06-22 07:33:32

Windows系统中基于文件过滤驱动的文件动态访问控制技术研究

摘要:该文对Windows系统下基于文件过滤驱动的文件动态访问控制技术进行了研究。并对其实现的关键技术进行了详细的分析。通过该技术可以有效的保护文件避免非授权的访问。从而更为有效的保护信息资源安全。

关键词:文件过滤驱动;截获;输入输出请求包;动态访问控制

中图分类号:TP316文献标识码:A文章编号:1009-3044(2012)09-2045-03

Research on the Technology of Dynamically Access Control Based on File Filter Driver in Windows System

LI Zhu-feng

(PLA University of Foreign Languages,Luoyang 471003,China)

Abstract: The research on dynamically access control based on file driver in Windows system was introduced in this article. and also the key technology was analyzed in detail. with this technology we can protect files from unauthorized accessing more effectively.Thus to protect the security of information resource.

Key words: file filter driver; intercept; IRP; dynamically access control

目前,随着技术的不断发展,基于计算机网络进行的攻击行为严重的威胁到了信息的安全,特别是非授权用户在入侵至目标主机之后通过各种技术手段提升自己的权限从而对目标主机内的敏感文件具备了相应的访问权限,导致了信息机密性被破坏。目前Windows操作系统自带的访问控制机制已经无法阻挡攻击者层出不穷的入侵和提权手段。随着黑客相关技术的发展,大量绕过UAC等机制的手段不断涌现,威胁到了一般的文件保护机制。按照NII对信息安全的定义,信息的机密性、完整性和真实性无法得到有效的保护,这些现状要求从事计算机及网络安全相关产业的人们提供更为有效的文件访问控制机制和相关的技术。

1 Windows文件过滤驱动模型

在Windows操作系统中,设备和驱动程序使用了如图1所示的堆栈层次结构。[1]

图1设备和驱动程序的分层结构

如图1所示,驱动程序是一个层次结构,I/O请求首先会被最上层的驱动程序处理,之后向下依次传递,每一层处理完成后是否向下传递取决于设备以及I/O请求所携带的内容。I/O管理器将用户的文件操作请求构成I/O请求包IRP(I/O Request Package)提交给文件系统驱动程序。之后驱动程序把这个操作转化为存储设备驱动能够理解的操作并调用存储设备。但是在这个过程中I/O管理器会检测目标设备对象上层是否有其他的构造生成的附加设备对象。如果这样的附加设备对象存在那么I/O管理器原本要发送给文件系统驱动的请求就会先提交给构建的附加设备。[1]这就为我们监控文件操作创造了机会。

这种方式的原理如图2所示。[2]

图2文件过滤驱动工作原理

2文件动态访问控制技术

本论文研究对主机核心文件的动态保护,保证被保护的数据只能被经过授权的合法进程访问。因此本论文采用动态的文件过滤驱动级文件操作监控技术。文件过滤驱动程序加载在文件Windows操作系统文件驱动程序上层,通过对IRP请求的捕捉并修改达到修改或完善文件驱动程序的目的。动态访问控制技术正是基于文件过滤驱动的特性,在文件操作请求的IRP请求包到达文件系统驱动之前截获到这些IRP请求,正如防火墙的动态包过滤技术一样,通过对IRP请求包的动态过滤来达到对用户文件操作行为的动态监控。同时,我们还要对FAST I/O文件访问方式进行处理,以期能够更加快速的访问缓存数据,从而缩短处理时间,增强用户体验。

驱动程序有一个名为DriverEntry的初始化入口点,这是驱动程序的一个例程。在驱动程序加载的时候内核首先调用这个例程。DriverEntry在驱动程序中的作用相当于一般C代码中的Main函数。

一般DriverEntry的函数原型如下:

NTSTATUS

DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING

RegistryPath)

{}

在Driver Development Kit(DDK)驱动对象(DRIVER_OBJECT)是一个非常重要的数据结构,任何驱动程序都必须针对一个驱动对象进行操作。在DriverEntry原型中的第一个参数DriverObject就是该驱动程序所对应的驱动对象,该驱动对象在系统加载驱动时分配;第三个参数RegisteryPath用于记录与驱动相关参数的注册表路径,也是由系统分配并通过参数传递给驱动程序[4]。

实现文件过滤驱动过程如下:

2.1生成控制设备

在生成控制设备之前要指定一个名称给控制设备。首先通过定义一个Unicode字符串UniString,然后通过RtlInitUnicodeString函数将L"\\FileSystem\\Filters\SFilter"这个值赋给UniString;其次就是生成控制设备CDO,这一过程采用IoCreateDevice这个函数来实现。该函数用于穿件常规的设备对象,函数原型如下:

NTSTATUS IoCreateDevice

(

IN PDRIVER_OBJECT DriverObject,

IN ULONG DeviceExtensionSize,

IN PUNICODE_STRING DeviceName OPTIONAL,

IN DEVICE_TYPE DeviceType,

IN ULONG DeviceCharacteristics,

OUT PDEVICE_OBJECT *DeviceObject

)

该函数第一、三参数分别设置为之前分发的驱动对象和UniString首地址,因为我们采用文件过滤驱动,因此第四个参数设置为系统已经宏定义的FILE_DEVICE_DISK_FILE_SYSTEM。IoCreateDevice函数除了返回一个运行状态status之外,还将生成的设备保存在最后一个参数中,因此,在调用该函数之前要首先定义一个全局的PDEVICE_OBJECT指针用于储存生成的设备。

在之后我们获得一个驱动对象的时候就可以通过将此驱动对象绑定的设备对象设备与这个全局指针中的设备相比对,方便的查看是否是我们生成的设备。

2.2分发处理例程

我们已经生成了控制设备,那么之后要做的就是为该控制设备分发处理例程。在驱动对象这个数据结构中有一个成员MajorFunction,这个成员是一个指针数组,用来指示该驱动对象针对不同的IRP请求进行处理的函数。我们不可能对拦截下来的每一种IRP请求都构建我们自己的处理函数,因为这样不仅需要庞大的工作量,而且对于文件操作过滤来说并没有实际的意义。因此我们可以将所有的MajorFuction成员分发一个默认的例程,这个例程只是简单的下发IRP而已。接下来我们应该对确实需要关注的IRP请求类型分发具体的处理例程,如:IRP_MJ_READ和IRP_MJ_WRITE,以此来完成对文件读写操作的动态监控。需要注意的是在编写处理例程时要遵守例程的固定格式,这里不再赘述。

文件系统的文件操作请求不仅仅是IRP请求,还包括由Cache Manager引发的FastIo。如图2所示,我们的文件过滤驱动在文件系统驱动和应用程序之间,因此如果需要监控所有的文件操作就必须自己编写FastIo的处理函数并分发给驱动对象,将FastIo的处理函数名赋值给驱动对象数据结构中的FastIoDispatch就可以了。

2.3绑定设备栈

设备栈是一组设备对象。应用程序发出请求之后,这些请求会被翻译成IRP请求包,之后发送给设备栈栈顶的设备。

如果我们想在原有的设备接收到IRP请求包之前截获这些请求就应该在设备栈的顶端添加绑定一个我们自己生成的设备。这项工作可以通过IoAttachDeviceToDeviceStack来实现。

但是,还有一种情况是我们必须要考虑到的,那就是动态设备,比如U盘的插拔会引起一个卷动态的诞生。为了兼顾这种情况我们要时刻关注动态的设备注册变化。所幸的是IoRegisterFsRegistrationChange()这个函数能够做到这一点。

至于这个函数应该如何使用以及相关回调函数的编写,这里不再赘述。

如果扫描出有动态卷加载,那么有两种方式可以完成设备的绑定。一种是利用SfEnumerateFileSystemVolumes枚举所有已装载的卷设备,找到对应的动态卷设备之后进行绑定;另外一种是利用SfFsControl函数处理IRP_MJ_FILE_SYSTEM_CONTROL这个IRP请求,SfFsControl()是一个回调函数。当有卷被Mount或者dismount时SfFsControl()就会被调用。此时,根据参数中IRPSp->MinorFunction的值分别做处理,有三种情况的调用,这里不再赘述。

值得说明的是针对FSCTL_DISMOUNT_VOLUME这种情况不需要进行解除绑定和销毁的动作。

2.4构建IRP完成函数

我们可以通过VPB(Volume parameter block)这样一个数据结构将实际的设备对象和文件系统中虚拟的卷设备对象的映射关系保存下来,从而完成真正的设备操作。

卷的mount过程实际上也是通过一个IRP请求来触发的,在系统文件驱动处理完这个mount请求之后就返回与之对应的卷设备对象。我们自构建的文件过滤驱动在文件驱动之上,它比文件驱动更早的获得了这个请求,此时这个请求还没有被完成,所以还无法得到卷设备对象,因此我们需要先保存以防止文件系统驱动对VPB有所更改。

为了得到卷设备,我们可以给IRP分配一个完成回调函数,这个函数的任务是保存当前的IO_STACK_LOCATION,然后并不做任何处理的将请求下发给下层的系统文件驱动。当这个IRP请求被文件系统处理完成这个构建的完成回调函数就会被调用,从而使我们得到了卷设备。

这里需要注意的是对临界区要采用同步,常见的事件同步技术就可以满足需求。

2.5捕获文件操作

如前所述,我们已经完成了在系统文件驱动上层构建自己的文件过滤驱动的工作。此时我们就可以在文件系统接收到IRP请求之前捕捉到应用程序的文件操作。

接下来的工作就比较简单了,以IRP_MJ_READ这样的文件读操作为例,我们的过滤驱动接到了这样的请求之后会调用我们自己编写的过滤回调函数,那么我们就可以随心所欲的在这个回调函数中对文件读操作进行修改等动作,我们的目的是控制文件被合法用户访问,那么在回调函数中可以比对操作对象文件的访问授权列表,与发送IRP的源进行比对来决定下发还是拦截这个IRP请求包。

3结束语

我们讨论了Windows系统下基于文件过滤驱动的访问控制原理与技术,并在此基础上给出了动态文件保护的概念和相关技术。这在很大程度上可以保护文件避免非授权实体访问,从而在一定程度上提升了信息资源的安全性。但是随着技术的发展,攻防双方的手段此消彼长,如果攻击者在我们设计的驱动之上提前钩取到IRP那么也会绕过我们的防护对资源安全构成威胁。在下一步的研究中应当着重的讨论如何保护系统本身的文件驱动栈,确保该驱动栈的安全性。可以说这场博弈才刚刚开始。

参考文献:

[1]Russinovich M E,Solomon D A.深入解析Windows操作系统[M].4版.北京:电子工业出版社,2007.

[2]刘亮,周安民,沈东.基于文件过滤驱动的文件保护技术研究[J].四川大学学报:自然科学版,2009(3):589-593.

[3]李民,方勇,刘林超,等.文件过滤驱动及应用[J].信息与电子工程,2005,3(4):290-292.

[4]焦延飞.基于内网安全的文件访问控制研究[D].西安:西安电子科技大学,2008.

[5]陈晨.基于TPM的安全有盘系统的关键技术设计与实现[D].北京:北京邮电大学,2010.

[6]刘胜利,王文冰,费金龙,等.基于可信网络连接的局域网数据保密系统设计与实现[J].信息工程大学学报,2010(1):83-87.

上一篇:基于WEB的经费预算管理系统研究与实现 下一篇:无线局域网的安全问题及对策研究