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