李珠峰
摘要:該文對(duì)Windows系統(tǒng)下基于文件過(guò)濾驅(qū)動(dòng)的文件動(dòng)態(tài)訪問(wèn)控制技術(shù)進(jìn)行了研究。并對(duì)其實(shí)現(xiàn)的關(guān)鍵技術(shù)進(jìn)行了詳細(xì)的分析。通過(guò)該技術(shù)可以有效的保護(hù)文件避免非授權(quán)的訪問(wèn)。從而更為有效的保護(hù)信息資源安全。
關(guān)鍵詞:文件過(guò)濾驅(qū)動(dòng);截獲;輸入輸出請(qǐng)求包;動(dòng)態(tài)訪問(wèn)控制
中圖分類號(hào):TP316文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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
目前,隨著技術(shù)的不斷發(fā)展,基于計(jì)算機(jī)網(wǎng)絡(luò)進(jìn)行的攻擊行為嚴(yán)重的威脅到了信息的安全,特別是非授權(quán)用戶在入侵至目標(biāo)主機(jī)之后通過(guò)各種技術(shù)手段提升自己的權(quán)限從而對(duì)目標(biāo)主機(jī)內(nèi)的敏感文件具備了相應(yīng)的訪問(wèn)權(quán)限,導(dǎo)致了信息機(jī)密性被破壞。目前Windows操作系統(tǒng)自帶的訪問(wèn)控制機(jī)制已經(jīng)無(wú)法阻擋攻擊者層出不窮的入侵和提權(quán)手段。隨著黑客相關(guān)技術(shù)的發(fā)展,大量繞過(guò)UAC等機(jī)制的手段不斷涌現(xiàn),威脅到了一般的文件保護(hù)機(jī)制。按照NII對(duì)信息安全的定義,信息的機(jī)密性、完整性和真實(shí)性無(wú)法得到有效的保護(hù),這些現(xiàn)狀要求從事計(jì)算機(jī)及網(wǎng)絡(luò)安全相關(guān)產(chǎn)業(yè)的人們提供更為有效的文件訪問(wèn)控制機(jī)制和相關(guān)的技術(shù)。
1 Windows文件過(guò)濾驅(qū)動(dòng)模型
在Windows操作系統(tǒng)中,設(shè)備和驅(qū)動(dòng)程序使用了如圖1所示的堆棧層次結(jié)構(gòu)。[1]
圖1設(shè)備和驅(qū)動(dòng)程序的分層結(jié)構(gòu)
如圖1所示,驅(qū)動(dòng)程序是一個(gè)層次結(jié)構(gòu),I/O請(qǐng)求首先會(huì)被最上層的驅(qū)動(dòng)程序處理,之后向下依次傳遞,每一層處理完成后是否向下傳遞取決于設(shè)備以及I/O請(qǐng)求所攜帶的內(nèi)容。I/O管理器將用戶的文件操作請(qǐng)求構(gòu)成I/O請(qǐng)求包IRP(I/O Request Package)提交給文件系統(tǒng)驅(qū)動(dòng)程序。之后驅(qū)動(dòng)程序把這個(gè)操作轉(zhuǎn)化為存儲(chǔ)設(shè)備驅(qū)動(dòng)能夠理解的操作并調(diào)用存儲(chǔ)設(shè)備。但是在這個(gè)過(guò)程中I/O管理器會(huì)檢測(cè)目標(biāo)設(shè)備對(duì)象上層是否有其他的構(gòu)造生成的附加設(shè)備對(duì)象。如果這樣的附加設(shè)備對(duì)象存在那么I/O管理器原本要發(fā)送給文件系統(tǒng)驅(qū)動(dòng)的請(qǐng)求就會(huì)先提交給構(gòu)建的附加設(shè)備。[1]這就為我們監(jiān)控文件操作創(chuàng)造了機(jī)會(huì)。
這種方式的原理如圖2所示。[2]
圖2文件過(guò)濾驅(qū)動(dòng)工作原理
2文件動(dòng)態(tài)訪問(wèn)控制技術(shù)
本論文研究對(duì)主機(jī)核心文件的動(dòng)態(tài)保護(hù),保證被保護(hù)的數(shù)據(jù)只能被經(jīng)過(guò)授權(quán)的合法進(jìn)程訪問(wèn)。因此本論文采用動(dòng)態(tài)的文件過(guò)濾驅(qū)動(dòng)級(jí)文件操作監(jiān)控技術(shù)。文件過(guò)濾驅(qū)動(dòng)程序加載在文件Windows操作系統(tǒng)文件驅(qū)動(dòng)程序上層,通過(guò)對(duì)IRP請(qǐng)求的捕捉并修改達(dá)到修改或完善文件驅(qū)動(dòng)程序的目的。動(dòng)態(tài)訪問(wèn)控制技術(shù)正是基于文件過(guò)濾驅(qū)動(dòng)的特性,在文件操作請(qǐng)求的IRP請(qǐng)求包到達(dá)文件系統(tǒng)驅(qū)動(dòng)之前截獲到這些IRP請(qǐng)求,正如防火墻的動(dòng)態(tài)包過(guò)濾技術(shù)一樣,通過(guò)對(duì)IRP請(qǐng)求包的動(dòng)態(tài)過(guò)濾來(lái)達(dá)到對(duì)用戶文件操作行為的動(dòng)態(tài)監(jiān)控。同時(shí),我們還要對(duì)FAST I/O文件訪問(wèn)方式進(jìn)行處理,以期能夠更加快速的訪問(wèn)緩存數(shù)據(jù),從而縮短處理時(shí)間,增強(qiáng)用戶體驗(yàn)。
驅(qū)動(dòng)程序有一個(gè)名為DriverEntry的初始化入口點(diǎn),這是驅(qū)動(dòng)程序的一個(gè)例程。在驅(qū)動(dòng)程序加載的時(shí)候內(nèi)核首先調(diào)用這個(gè)例程。DriverEntry在驅(qū)動(dòng)程序中的作用相當(dāng)于一般C代碼中的Main函數(shù)。
一般DriverEntry的函數(shù)原型如下:
NTSTATUS
DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING
RegistryPath)
{}
在Driver Development Kit(DDK)驅(qū)動(dòng)對(duì)象(DRIVER_OBJECT)是一個(gè)非常重要的數(shù)據(jù)結(jié)構(gòu),任何驅(qū)動(dòng)程序都必須針對(duì)一個(gè)驅(qū)動(dòng)對(duì)象進(jìn)行操作。在DriverEntry原型中的第一個(gè)參數(shù)DriverObject就是該驅(qū)動(dòng)程序所對(duì)應(yīng)的驅(qū)動(dòng)對(duì)象,該驅(qū)動(dòng)對(duì)象在系統(tǒng)加載驅(qū)動(dòng)時(shí)分配;第三個(gè)參數(shù)RegisteryPath用于記錄與驅(qū)動(dòng)相關(guān)參數(shù)的注冊(cè)表路徑,也是由系統(tǒng)分配并通過(guò)參數(shù)傳遞給驅(qū)動(dòng)程序[4]。
實(shí)現(xiàn)文件過(guò)濾驅(qū)動(dòng)過(guò)程如下:
2.1生成控制設(shè)備
在生成控制設(shè)備之前要指定一個(gè)名稱給控制設(shè)備。首先通過(guò)定義一個(gè)Unicode字符串UniString,然后通過(guò)RtlInitUnicodeString函數(shù)將L"\FileSystem\FiltersSFilter"這個(gè)值賦給UniString;其次就是生成控制設(shè)備CDO,這一過(guò)程采用IoCreateDevice這個(gè)函數(shù)來(lái)實(shí)現(xiàn)。該函數(shù)用于穿件常規(guī)的設(shè)備對(duì)象,函數(shù)原型如下:
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
)
該函數(shù)第一、三參數(shù)分別設(shè)置為之前分發(fā)的驅(qū)動(dòng)對(duì)象和UniString首地址,因?yàn)槲覀儾捎梦募^(guò)濾驅(qū)動(dòng),因此第四個(gè)參數(shù)設(shè)置為系統(tǒng)已經(jīng)宏定義的FILE_DEVICE_DISK_FILE_SYSTEM。IoCreateDevice函數(shù)除了返回一個(gè)運(yùn)行狀態(tài)status之外,還將生成的設(shè)備保存在最后一個(gè)參數(shù)中,因此,在調(diào)用該函數(shù)之前要首先定義一個(gè)全局的PDEVICE_OBJECT指針用于儲(chǔ)存生成的設(shè)備。
在之后我們獲得一個(gè)驅(qū)動(dòng)對(duì)象的時(shí)候就可以通過(guò)將此驅(qū)動(dòng)對(duì)象綁定的設(shè)備對(duì)象設(shè)備與這個(gè)全局指針中的設(shè)備相比對(duì),方便的查看是否是我們生成的設(shè)備。
2.2分發(fā)處理例程
我們已經(jīng)生成了控制設(shè)備,那么之后要做的就是為該控制設(shè)備分發(fā)處理例程。在驅(qū)動(dòng)對(duì)象這個(gè)數(shù)據(jù)結(jié)構(gòu)中有一個(gè)成員MajorFunction,這個(gè)成員是一個(gè)指針數(shù)組,用來(lái)指示該驅(qū)動(dòng)對(duì)象針對(duì)不同的IRP請(qǐng)求進(jìn)行處理的函數(shù)。我們不可能對(duì)攔截下來(lái)的每一種IRP請(qǐng)求都構(gòu)建我們自己的處理函數(shù),因?yàn)檫@樣不僅需要龐大的工作量,而且對(duì)于文件操作過(guò)濾來(lái)說(shuō)并沒(méi)有實(shí)際的意義。因此我們可以將所有的MajorFuction成員分發(fā)一個(gè)默認(rèn)的例程,這個(gè)例程只是簡(jiǎn)單的下發(fā)IRP而已。接下來(lái)我們應(yīng)該對(duì)確實(shí)需要關(guān)注的IRP請(qǐng)求類型分發(fā)具體的處理例程,如:IRP_MJ_READ和IRP_MJ_WRITE,以此來(lái)完成對(duì)文件讀寫操作的動(dòng)態(tài)監(jiān)控。需要注意的是在編寫處理例程時(shí)要遵守例程的固定格式,這里不再贅述。
文件系統(tǒng)的文件操作請(qǐng)求不僅僅是IRP請(qǐng)求,還包括由Cache Manager引發(fā)的FastIo。如圖2所示,我們的文件過(guò)濾驅(qū)動(dòng)在文件系統(tǒng)驅(qū)動(dòng)和應(yīng)用程序之間,因此如果需要監(jiān)控所有的文件操作就必須自己編寫FastIo的處理函數(shù)并分發(fā)給驅(qū)動(dòng)對(duì)象,將FastIo的處理函數(shù)名賦值給驅(qū)動(dòng)對(duì)象數(shù)據(jù)結(jié)構(gòu)中的FastIoDispatch就可以了。
2.3綁定設(shè)備棧
設(shè)備棧是一組設(shè)備對(duì)象。應(yīng)用程序發(fā)出請(qǐng)求之后,這些請(qǐng)求會(huì)被翻譯成IRP請(qǐng)求包,之后發(fā)送給設(shè)備棧棧頂?shù)脑O(shè)備。
如果我們想在原有的設(shè)備接收到IRP請(qǐng)求包之前截獲這些請(qǐng)求就應(yīng)該在設(shè)備棧的頂端添加綁定一個(gè)我們自己生成的設(shè)備。這項(xiàng)工作可以通過(guò)IoAttachDeviceToDeviceStack來(lái)實(shí)現(xiàn)。
但是,還有一種情況是我們必須要考慮到的,那就是動(dòng)態(tài)設(shè)備,比如U盤的插拔會(huì)引起一個(gè)卷動(dòng)態(tài)的誕生。為了兼顧這種情況我們要時(shí)刻關(guān)注動(dòng)態(tài)的設(shè)備注冊(cè)變化。所幸的是IoRegisterFsRegistrationChange()這個(gè)函數(shù)能夠做到這一點(diǎn)。
至于這個(gè)函數(shù)應(yīng)該如何使用以及相關(guān)回調(diào)函數(shù)的編寫,這里不再贅述。
如果掃描出有動(dòng)態(tài)卷加載,那么有兩種方式可以完成設(shè)備的綁定。一種是利用SfEnumerateFileSystemVolumes枚舉所有已裝載的卷設(shè)備,找到對(duì)應(yīng)的動(dòng)態(tài)卷設(shè)備之后進(jìn)行綁定;另外一種是利用SfFsControl函數(shù)處理IRP_MJ_FILE_SYSTEM_CONTROL這個(gè)IRP請(qǐng)求,SfFsControl()是一個(gè)回調(diào)函數(shù)。當(dāng)有卷被Mount或者dismount時(shí)SfFsControl()就會(huì)被調(diào)用。此時(shí),根據(jù)參數(shù)中IRPSp->MinorFunction的值分別做處理,有三種情況的調(diào)用,這里不再贅述。
值得說(shuō)明的是針對(duì)FSCTL_DISMOUNT_VOLUME這種情況不需要進(jìn)行解除綁定和銷毀的動(dòng)作。
2.4構(gòu)建IRP完成函數(shù)
我們可以通過(guò)VPB(Volume parameter block)這樣一個(gè)數(shù)據(jù)結(jié)構(gòu)將實(shí)際的設(shè)備對(duì)象和文件系統(tǒng)中虛擬的卷設(shè)備對(duì)象的映射關(guān)系保存下來(lái),從而完成真正的設(shè)備操作。
卷的mount過(guò)程實(shí)際上也是通過(guò)一個(gè)IRP請(qǐng)求來(lái)觸發(fā)的,在系統(tǒng)文件驅(qū)動(dòng)處理完這個(gè)mount請(qǐng)求之后就返回與之對(duì)應(yīng)的卷設(shè)備對(duì)象。我們自構(gòu)建的文件過(guò)濾驅(qū)動(dòng)在文件驅(qū)動(dòng)之上,它比文件驅(qū)動(dòng)更早的獲得了這個(gè)請(qǐng)求,此時(shí)這個(gè)請(qǐng)求還沒(méi)有被完成,所以還無(wú)法得到卷設(shè)備對(duì)象,因此我們需要先保存以防止文件系統(tǒng)驅(qū)動(dòng)對(duì)VPB有所更改。
為了得到卷設(shè)備,我們可以給IRP分配一個(gè)完成回調(diào)函數(shù),這個(gè)函數(shù)的任務(wù)是保存當(dāng)前的IO_STACK_LOCATION,然后并不做任何處理的將請(qǐng)求下發(fā)給下層的系統(tǒng)文件驅(qū)動(dòng)。當(dāng)這個(gè)IRP請(qǐng)求被文件系統(tǒng)處理完成這個(gè)構(gòu)建的完成回調(diào)函數(shù)就會(huì)被調(diào)用,從而使我們得到了卷設(shè)備。
這里需要注意的是對(duì)臨界區(qū)要采用同步,常見的事件同步技術(shù)就可以滿足需求。
2.5捕獲文件操作
如前所述,我們已經(jīng)完成了在系統(tǒng)文件驅(qū)動(dòng)上層構(gòu)建自己的文件過(guò)濾驅(qū)動(dòng)的工作。此時(shí)我們就可以在文件系統(tǒng)接收到IRP請(qǐng)求之前捕捉到應(yīng)用程序的文件操作。
接下來(lái)的工作就比較簡(jiǎn)單了,以IRP_MJ_READ這樣的文件讀操作為例,我們的過(guò)濾驅(qū)動(dòng)接到了這樣的請(qǐng)求之后會(huì)調(diào)用我們自己編寫的過(guò)濾回調(diào)函數(shù),那么我們就可以隨心所欲的在這個(gè)回調(diào)函數(shù)中對(duì)文件讀操作進(jìn)行修改等動(dòng)作,我們的目的是控制文件被合法用戶訪問(wèn),那么在回調(diào)函數(shù)中可以比對(duì)操作對(duì)象文件的訪問(wèn)授權(quán)列表,與發(fā)送IRP的源進(jìn)行比對(duì)來(lái)決定下發(fā)還是攔截這個(gè)IRP請(qǐng)求包。
3結(jié)束語(yǔ)
我們討論了Windows系統(tǒng)下基于文件過(guò)濾驅(qū)動(dòng)的訪問(wèn)控制原理與技術(shù),并在此基礎(chǔ)上給出了動(dòng)態(tài)文件保護(hù)的概念和相關(guān)技術(shù)。這在很大程度上可以保護(hù)文件避免非授權(quán)實(shí)體訪問(wèn),從而在一定程度上提升了信息資源的安全性。但是隨著技術(shù)的發(fā)展,攻防雙方的手段此消彼長(zhǎng),如果攻擊者在我們?cè)O(shè)計(jì)的驅(qū)動(dòng)之上提前鉤取到IRP那么也會(huì)繞過(guò)我們的防護(hù)對(duì)資源安全構(gòu)成威脅。在下一步的研究中應(yīng)當(dāng)著重的討論如何保護(hù)系統(tǒng)本身的文件驅(qū)動(dòng)棧,確保該驅(qū)動(dòng)棧的安全性。可以說(shuō)這場(chǎng)博弈才剛剛開始。
參考文獻(xiàn):
[1]Russinovich M E,Solomon D A.深入解析Windows操作系統(tǒng)[M].4版.北京:電子工業(yè)出版社,2007.
[2]劉亮,周安民,沈東.基于文件過(guò)濾驅(qū)動(dòng)的文件保護(hù)技術(shù)研究[J].四川大學(xué)學(xué)報(bào):自然科學(xué)版,2009(3):589-593.
[3]李民,方勇,劉林超,等.文件過(guò)濾驅(qū)動(dòng)及應(yīng)用[J].信息與電子工程,2005,3(4):290-292.
[4]焦延飛.基于內(nèi)網(wǎng)安全的文件訪問(wèn)控制研究[D].西安:西安電子科技大學(xué),2008.
[5]陳晨.基于TPM的安全有盤系統(tǒng)的關(guān)鍵技術(shù)設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京郵電大學(xué),2010.
[6]劉勝利,王文冰,費(fèi)金龍,等.基于可信網(wǎng)絡(luò)連接的局域網(wǎng)數(shù)據(jù)保密系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].信息工程大學(xué)學(xué)報(bào),2010(1):83-87.