0 引言
計算機和計算機網(wǎng)絡(luò)已經(jīng)成為當(dāng)前企業(yè),、政府和其它各種組織的重要信息載體和傳輸渠道。但是,,人們在享受計算機以及計算機網(wǎng)絡(luò)所帶來的方便性的同時,,信息安全也成為目前受到廣泛關(guān)注的問題。美國聯(lián)邦調(diào)查局(FBI)和計算機安全機構(gòu) (CSl)等權(quán)威機構(gòu)的研究證明:超過80%的信息安全隱患是來自組織內(nèi)部,。內(nèi)部的安全狀況較差,,不僅會給攻擊者以可乘之機,還會使已構(gòu)建的安全設(shè)施形同虛設(shè),,為內(nèi)部安全違規(guī)事件的發(fā)生打開方便之門,。目前廣泛采用的安全設(shè)備和安全措施,均側(cè)重于對付外部的攻擊,、侵犯和威脅,,而無法阻止內(nèi)部不懷好意的員工盜取涉密信息并將其拷貝或傳播出去。因此,,數(shù)據(jù)資源的保密以及非法外泄的防范已成為當(dāng)前迫在眉睫的安全需求,。而利用USB存儲設(shè)備的單向控制技術(shù)可對接人計算機的存儲介質(zhì)進行控制,以防止信息被有意或者無意地從移動存儲設(shè)備泄漏出去,。由于用戶可以根據(jù)需要設(shè)定存儲設(shè)備的使用權(quán)限(比如只讀或者讀寫等),,因此,該方法既保留了移動設(shè)備的方便性,,又堵截了移動存儲設(shè)備可能帶來的安全隱患,。
1 單向控制的設(shè)計與實現(xiàn)
本文采用對磁盤驅(qū)動器進行過濾的方法來實現(xiàn)USB存儲設(shè)備的單向控制。該技術(shù)以DDK中的filter為原形,。采用標(biāo)準(zhǔn)的WDM過濾,,可攔截所有對USB存儲設(shè)備的寫操作,從而實現(xiàn)U盤的單向控制,。其中過濾器驅(qū)動程序是可選擇的驅(qū)動程序,,它可以給設(shè)備增加值或修改設(shè)備行為,而且,,該過濾器驅(qū)動程序能服務(wù)于一個或多個設(shè)備,。由于頂層的過濾器驅(qū)動程序主要是為某一設(shè)備提供增值特征,而低層過濾器驅(qū)動程序則主要修改設(shè)備的硬件行為,。所以,,本文選擇使用低層設(shè)備過濾器驅(qū)動程序,來監(jiān)視和修改磁盤驅(qū)動器的I/0請求,。
1.1 驅(qū)動程序的基本結(jié)構(gòu)
一個WDM驅(qū)動程序的基本結(jié)構(gòu)包括一組必要的,,通過系統(tǒng)定義的標(biāo)準(zhǔn)驅(qū)動程序函數(shù),,同時還有一些可選的標(biāo)準(zhǔn)函數(shù)與內(nèi)部函數(shù)(取決于驅(qū)動程序的類型和下層設(shè)備)。對于所有的驅(qū)動程序,,不管它們在附屬驅(qū)動程序鏈中所處的是那一層,,都必須有一組基本的標(biāo)準(zhǔn)函數(shù)來處理IRP。一個驅(qū)動程序是否必須執(zhí)行附加標(biāo)準(zhǔn)函數(shù),,取決于該驅(qū)動程序的類型和下層設(shè)備是控制一個物理設(shè)備的驅(qū)動程序,,還是在一個物理設(shè)備驅(qū)動程序之上的驅(qū)動程序,同時也取決于下層物理設(shè)備的屬性,??刂莆锢碓O(shè)備的最低層驅(qū)動程序比較高層驅(qū)動程序擁有更多所要求的函數(shù),較高層的驅(qū)動程序一般將IRP傳送給較低層的驅(qū)動程序來處理,。
下面所列是本驅(qū)動程序所需要的標(biāo)準(zhǔn)驅(qū)動程序函數(shù):
(1)DIiveEntry
該函數(shù)可用于初始化驅(qū)動程序并設(shè)置其他標(biāo)準(zhǔn)函數(shù)的人口點,。當(dāng)驅(qū)動程序的DriverEntry函數(shù)被調(diào)用,它將直接在驅(qū)動程序?qū)ο笾性O(shè)置Dispatch和Unload的入口點,,方法如下:
在驅(qū)動程序?qū)ο髢?nèi)的DriverExtension中設(shè)置它的AddDevice函數(shù)的人口點方法如下:
DriverObject->DriverExtension一>AddDevice=DDAddDevice,;
驅(qū)動程序能定義若干Dispatch人口點,但是它只能在其驅(qū)動程序?qū)ο笾卸x一個AddDevice人口點和一個Unload人口點,。
(2) AddDevice
AddDevice函數(shù)主要用于創(chuàng)建設(shè)備對象,,地址在DriverObject->DriverExtension->AddDevice。
(3)Dispatch
該函數(shù)至少應(yīng)一個Dispatch人口點,。因為要用一個或多個主要功能來編碼處理IRP,,以得到請求PnP、電源和I/O操作的IRP,。
(4)Unload
如果驅(qū)動程序能動態(tài)地被裝載和/或者替換,,還需要一個Unload人口點,以釋放系統(tǒng)資源(諸如驅(qū)動程序已分配的系統(tǒng)對象或者內(nèi)存等),。
1.2驅(qū)動程序的實現(xiàn)
實現(xiàn)驅(qū)動程序時,,首先要為設(shè)備定義GUID。驅(qū)動程序使用設(shè)備名和GUID(globallv unique identifiers)來標(biāo)識不同的物理,、邏輯或虛擬設(shè)備,。PnP驅(qū)動程序可注冊并激活一個與GUID連接的設(shè)備接口,應(yīng)用程序和其他系統(tǒng)組件則可通過接口對設(shè)備進行I/O請求和控制,,WDM用于過濾驅(qū)動禁止給它們的設(shè)備對象命名,所以,,要為設(shè)備定義GUID,。
其次是應(yīng)為驅(qū)動程序函數(shù)選擇名字。由于每個驅(qū)動程序中都要包含標(biāo)準(zhǔn)的驅(qū)動程序函數(shù),,因此,,應(yīng)使用一套區(qū)別于其他驅(qū)動程序的函數(shù)命名機制,,由于使程序更容易開發(fā)、調(diào)試和測試,。
此外,,還要編寫一個為AddDevice、DispatchPnP,、DispatchPower和DispatchCreate函數(shù)設(shè)置入口點的 DriverEntry函數(shù),,同時要編寫一個完成內(nèi)容的AddDevice函數(shù)。這四個內(nèi)容,。第一是調(diào)用IoCreateDevice以創(chuàng)建一個獨立設(shè)備對象:第二是調(diào)用IoAttachDeviceToDeviceStack,。以把它自己加入設(shè)備棧,同時填寫PDEVICE_EXTENSION,;第三是調(diào)用IoRegisterDeviceInterface,,并為它的設(shè)備暴露一個接口,暴露的接口可為訪問該設(shè)備的應(yīng)用程序提供途徑:第四調(diào)用 IoSetDevi.ceInterfaceState,,以激活它先前注冊的接口,。
至此,過濾設(shè)備就可以在DeviceTree中看到了,。
最后,,應(yīng)為IRP_MJ_PNP請求編寫一個基本DispatchPnP函數(shù)。該DispatchPnP函數(shù)必須準(zhǔn)備處理具體的PnP IRP,,然后為IRP_MJ_POWER編寫一個基本DispatchPower函數(shù),,再為IRP_MJ_CREATE請求編寫一個基本Dispatch Create函數(shù),同時攔截相應(yīng)的IRP請求,,接著再為I/O控制請求編寫一個基本DispatchDevCtrl函數(shù),,以與應(yīng)用程序進行通訊和處理具體的控制請求。
2單向控制關(guān)鍵技術(shù)分析
2.1 SCSI命令的分析
對應(yīng)于不同的過濾功能,,其需要攔截的IRP也不相同,。要對U盤進行單向控制。就需要攔截所有的寫操作,,使U盤成為只讀的,。但是,寫U盤的時候,,發(fā)送的并不是通常的IRP_MJ_WRITE請求,,而是要分析相應(yīng)的SCSI命令,對SCSI命令的取得和操作大致有兩種,。
第一種是得到當(dāng)前的SCSI命令,,其格式為:
2.2單向控制的實現(xiàn)
系統(tǒng)進行寫操作時,通常都是先寫在緩存區(qū),,然后經(jīng)過一定的延時后,,才會寫到真正的磁盤中,。所以,當(dāng)攔截到SCSI命令中的SCSIOP WRITE后,,雖然系統(tǒng)不會真正的寫東西到U盤上,,但卻要過很久才會提示延時寫錯誤。所以,,本文采用了另外一種方法,,即用軟件實現(xiàn)“帶寫保護功能”的U 盤,其效果與硬件實現(xiàn)的寫保護方式一樣,,從而實現(xiàn)了U盤的只讀,。其軟件實現(xiàn)方法如下:
2.3 區(qū)分硬盤和U盤驅(qū)動器
作為磁盤驅(qū)動器的低層設(shè)備過濾器驅(qū)動程序。在區(qū)分硬盤和U盤驅(qū)動器時,,Device_Ob_iect->DeviceType的值并不能真正區(qū)分硬盤和U盤驅(qū)動器,。這個值對于U盤而言,第一次插入時是0x2d,,但是,,一旦被虛擬化成磁盤分區(qū)后,它將變成07,。這和本地硬盤沒有任何區(qū)別,。因此,如果采用IoGetDeviceProperty來獲得當(dāng)前物理設(shè)備對象的總線類型的GUID,,就往往會導(dǎo)致操作系統(tǒng)出現(xiàn)藍(lán)屏(系統(tǒng)死機),。因為函數(shù)調(diào)用要求在passive-level執(zhí)行。而不是dispatch— level,。其代碼如下:
但是,,由于符號鏈接的名稱和光盤驅(qū)動器的設(shè)備類型將保持不變。所以,,可以通過修改設(shè)備擴展的內(nèi)部結(jié)構(gòu),,并增加DeviceType項,然后根據(jù)符號鏈接的名稱和設(shè)備類型來設(shè)置:deviceExtension->DeviceType
該方法對光盤和硬盤以及USB都有很好的支持,。其代碼如下:
3 結(jié)束語
本文在分析了磁盤讀寫技術(shù)的基礎(chǔ)上,,采用對磁盤驅(qū)動器進行過濾的方法,給出了基于過濾驅(qū)動的USB存儲設(shè)備的單向控制方法,。這種技術(shù)的實現(xiàn)能有效解決涉密信息的外泄,,是內(nèi)網(wǎng)安全的一種重要輔助手段。