基于文件系統(tǒng)過濾驅(qū)動的安全增強(qiáng)型加密系統(tǒng)技術(shù)研究

保護(hù)信息安全最常用的技術(shù)手段是數(shù)據(jù)加密技術(shù),通常的加密系統(tǒng)加密解密程序運(yùn)行在操作系統(tǒng)的用戶態(tài),這種方式存在一定的不便,每次訪問文件,用戶必須手動進(jìn)行加密解密操作用戶的錯誤操作有時會破壞數(shù)據(jù)或者導(dǎo)致機(jī)密數(shù)據(jù)的泄露,另外當(dāng)用戶正常使用文件時,文件必須以明文形式存儲在磁盤上。解決上述問題的有效方法是在操作系統(tǒng)的內(nèi)核態(tài)對數(shù)據(jù)進(jìn)行透明加密解密處理,加密解密文件系統(tǒng)(如微軟的NTFS中的EFS,Encryp tion File System)的數(shù)據(jù)處理處在文件系統(tǒng)驅(qū)動層,文件系統(tǒng)擁有以文件或目錄的粒度訪問文件的能力,所以加密文件系統(tǒng)能夠?qū)用芊秶M(jìn)行靈活的控制,但是加密文件系統(tǒng)在設(shè)計與實(shí)現(xiàn)較為復(fù)雜。

本文闡述的方法基于Windows NT內(nèi)核操作系統(tǒng)的驅(qū)動框架,通過在文件系統(tǒng)驅(qū)動層與應(yīng)用層之間添加過濾驅(qū)動層,截獲傳輸?shù)臄?shù)據(jù)并進(jìn)行相應(yīng)的加密解密處理,處在操作系統(tǒng)內(nèi)核態(tài)的過濾驅(qū)動層可以方便地控制加密解密文件的粒度,同時減少用戶加密解密操作的參與,與加密文件系統(tǒng)的方式相比,基于過濾驅(qū)動層的加密系統(tǒng)設(shè)計開發(fā)相對簡單,功能擴(kuò)展靈活。最后通過使用智能卡作為加解密密鑰的存儲容器,進(jìn)一步增強(qiáng)整個系統(tǒng)的安全。

一、系統(tǒng)原理及框架結(jié)構(gòu)

WindowsNT內(nèi)核的操作系統(tǒng)(Windows 2000、WindowsXP、Windows 2003)的驅(qū)動模型WDM(Windows Driver Model)具有層次化的結(jié)構(gòu)在這種結(jié)構(gòu)中,每一層的驅(qū)動依次處理的請求包(IRP,I/O Request Package)。過濾驅(qū)動的原理是通過插入過濾驅(qū)動層截獲上層驅(qū)動發(fā)往下層驅(qū)動的IRP,對驅(qū)動之間傳輸?shù)臄?shù)據(jù)進(jìn)行相應(yīng)的操作文件系統(tǒng)過濾驅(qū)動處于文件系統(tǒng)驅(qū)動層之上,截獲從上層組件發(fā)送到文件系統(tǒng)驅(qū)動層的IRP,文件系統(tǒng)過濾驅(qū)動技術(shù)目前在實(shí)時病毒監(jiān)測,文件訪問監(jiān)控日志記錄等方面有著廣泛的應(yīng)用,基于過濾驅(qū)動的加密系統(tǒng)的原理結(jié)構(gòu)如圖1所示。

基于文件系統(tǒng)過濾驅(qū)動的安全增強(qiáng)型加密系統(tǒng)技術(shù)研究

在Window sNT內(nèi)核操作系統(tǒng)中,應(yīng)用層程序的一次數(shù)據(jù)讀請求的處理過程簡單描述如下:

1、應(yīng)用層程序調(diào)用系統(tǒng)內(nèi)核組件提供的函數(shù)接口向的管理器(I/O Manager)發(fā)送數(shù)據(jù)讀請求。

2、I/O管理器構(gòu)造數(shù)據(jù)讀請求對應(yīng)的IRP,然后將此IRP發(fā)送到文件系統(tǒng)驅(qū)動(File SystemD river)。

3、文件系統(tǒng)驅(qū)動中的數(shù)據(jù)讀分發(fā)例程接收到IRP后判斷所請求的數(shù)據(jù)是否可從緩存管理器(CacheM anager)獲得:

a)緩存管理器存在請求的數(shù)據(jù)

i文件系統(tǒng)驅(qū)動調(diào)用I/O管理器的函數(shù)接口告知此數(shù)據(jù)讀請求可通過Fast的請求獲得。

iiI/O管理器構(gòu)造Fast I/O請求的IRP再次發(fā)送給文件系統(tǒng)驅(qū)動。

iii文件系統(tǒng)驅(qū)動調(diào)用Fast I/O分發(fā)例程從緩存管理器中獲取數(shù)據(jù)返回給I/O管理器。

b)緩存管理器不存在請求的數(shù)據(jù)

i文件系統(tǒng)驅(qū)動IRP數(shù)據(jù)讀分發(fā)例程將IRP發(fā)送到底層磁盤驅(qū)動(Disk Driver)。

ii磁盤驅(qū)動程序從物理磁盤中獲取請求的數(shù)據(jù)返回給上層驅(qū)動。

4、I/O管理器最終將請求的數(shù)據(jù)返回給應(yīng)用程序

對于數(shù)據(jù)寫請求,文件系統(tǒng)驅(qū)動將數(shù)據(jù)先寫入緩存,然后在適當(dāng)?shù)臅r候緩存管理器會間接調(diào)用I/O管理器發(fā)送數(shù)據(jù)寫請求最終將緩存中的數(shù)據(jù)寫入到物理磁盤另外WindowsNT內(nèi)核操作系統(tǒng)為了提高讀數(shù)據(jù)性能,緩存管理器會適時的進(jìn)行數(shù)據(jù)預(yù)讀操作,緩存管理器間接的調(diào)用的管理器將數(shù)據(jù)預(yù)讀請求發(fā)送到文件系統(tǒng)驅(qū)動,文件系統(tǒng)驅(qū)動再將請求發(fā)送到磁盤驅(qū)動以獲取數(shù)據(jù)。

在I/O管理器與文件系統(tǒng)驅(qū)動層之間插入過濾驅(qū)動層,截獲的管理器發(fā)往文件系統(tǒng)驅(qū)動的讀寫IRP,對傳輸?shù)臄?shù)據(jù)進(jìn)行相應(yīng)的加解密處理,數(shù)據(jù)讀請求時對讀入的數(shù)據(jù)進(jìn)行解密;數(shù)據(jù)寫請求時對寫出的數(shù)據(jù)進(jìn)行加密添加過濾驅(qū)動層后數(shù)據(jù)寫請求處理流程如圖2所示通過這種方式保證磁盤中存儲的數(shù)據(jù)文件始終以密文形式存在,而應(yīng)用程序無需做額外的操作便可以正常地使用文件另外根據(jù)文件的全路徑名稱可以對指定目錄下或指定類型的文件進(jìn)行加解密處理。

基于文件系統(tǒng)過濾驅(qū)動的安全增強(qiáng)型加密系統(tǒng)技術(shù)研究

將加密解密操作中使用的密鑰存儲于智能卡內(nèi)部提高了密鑰的安全性,處在應(yīng)用層的服務(wù)進(jìn)程(Server Process)監(jiān)測智能卡的相關(guān)操作:當(dāng)用戶插入智能卡成功地通過智能卡PIN認(rèn)證后,服務(wù)進(jìn)程從智能卡內(nèi)讀出加解密密鑰,通過I/O管理器以IRP的形式將密鑰相關(guān)信息發(fā)送到文件系統(tǒng)過濾驅(qū)動層,文件系統(tǒng)過濾驅(qū)動層的相應(yīng)分發(fā)例程接收處理此IRP后,將接收到的密鑰存儲在內(nèi)存相應(yīng)的數(shù)據(jù)結(jié)構(gòu)中;當(dāng)用戶取出智能卡后,服務(wù)進(jìn)程通過的管理器將以IRP形式的通告發(fā)送到文件系統(tǒng)過濾驅(qū)動層,文件系統(tǒng)過濾驅(qū)動層接收到此IRP刪除存儲在內(nèi)存中密鑰這種方式保證了數(shù)據(jù)只可以被授權(quán)的用戶所使用。

二、核心技術(shù)要點(diǎn)

1、驅(qū)動層獲取文件名

在驅(qū)動層獲取文件名稱有助于系統(tǒng)靈活地對指定目錄下、指定類型的文件進(jìn)行加解密在windows NT內(nèi)核的操作系統(tǒng)中,每當(dāng)一個文件被打開時,I/O管理器會創(chuàng)建一個數(shù)據(jù)類型為FLEOBJECT結(jié)構(gòu)體變量來標(biāo)識此文件流FLEOBJECT結(jié)構(gòu)體的定義簡略如下代碼所示對同一個文件進(jìn)行多次打開操作會導(dǎo)致多個FLEOBJECT變量被創(chuàng)建。

typedef struct-FLEOBJECT{

struct-FLEOBJ ECT*Rela tedFileo bject;

PVO D FsContext;

UNICODE-STRNG FileName;

....

}FL EOBJECT;

操作系統(tǒng)創(chuàng)建一個類型為文件控制塊(FCB,F(xiàn)ileCon trolBlock)的數(shù)據(jù)結(jié)構(gòu)作為每個文件在內(nèi)存中的唯一標(biāo)識FLEOBJECT數(shù)據(jù)結(jié)構(gòu)中的FsCon text指針指向此文件控制塊FLEOBJECT數(shù)據(jù)結(jié)構(gòu)中的FileName代表文件流對應(yīng)文件的名稱,但是FileName僅僅在對文件進(jìn)行創(chuàng)建或者被打開操作時才有效另外根據(jù)文件的創(chuàng)建或打開是絕對路徑還是相對路徑操作,F(xiàn)ileName存儲的內(nèi)容有所不同。

在WDM中文件的創(chuàng)建或打開操作對應(yīng)的IRP類型為IRPMJ-CREATE在IRPMJ-CREA TE對應(yīng)的分發(fā)例程中根據(jù)FLEOBJECT, FileName構(gòu)造出文件的全路徑文件名稱,然后將此全路徑文件名稱與文件控制塊的指針FLEOBJECT.FsCon text作為一個數(shù)據(jù)結(jié)構(gòu)單元添加到一個全局鏈表結(jié)構(gòu)中.當(dāng)在其他的驅(qū)動分發(fā)例程需要獲取某文件對象對應(yīng)文件的名稱時,通過FLEOBJECT.FsCon text指向的文件控制塊在上述全局鏈表中查找到對應(yīng)的文件名稱當(dāng)文件被最終關(guān)閉時(從屬于同一文件的文件對象變量的個數(shù)為零),將全局鏈表結(jié)構(gòu)中此文件對應(yīng)的節(jié)點(diǎn)刪除。

構(gòu)造文件的全路徑名稱主要分為絕對路徑與相對路徑兩種情況具體的操作流程如下代碼所示:

if Fileo bject-> RelatedFileo bject= = NULLtrH.begn

FuIIPathN am e: = Fileo bject-> FileN ame;

end else

begin

varnew Irp: IRP * ;

relatedFileo bject: = Fileo bject-> RelatedFileo bject;

new Irp: = BuildN am eQ uery RP (irp , relatedFileo bject);

Send JRPToLow erD river(new Irp) ;

W aitIRPCompletion () ;

FuIIPathN am e: = GetR esultF rom IRP (new hp) ;

FuIIPathN am e: = FuIIPathN am e+ Fileo bject-> FileName;

end

2、數(shù)據(jù)讀寫的加密解密機(jī)制

Windows NT內(nèi)核的操作系統(tǒng)中,程序通過虛擬地址訪問數(shù)據(jù)虛擬地址以固定大小的頁面為單位與物理內(nèi)存地址相映射,將數(shù)據(jù)讀入到內(nèi)存或者將內(nèi)存中數(shù)據(jù)寫入到物理磁盤上需要進(jìn)行頁面數(shù)據(jù)的讀寫(PA GN G的)。應(yīng)用程序的正常運(yùn)行要求內(nèi)存中存儲的數(shù)據(jù)必須始終以未加密的形式存在在處理數(shù)據(jù)讀寫IRP時,僅針對標(biāo)記(IRP-> Flags)為JRP-NO -CACHE JRP-PAGNG-D的IRP請求進(jìn)行處理JRP-NO -CACHE標(biāo)記表示數(shù)據(jù)不可以被緩存處理(從緩存中讀取或?qū)懭氲骄彺嬷校?,IRP-PA GN G-D標(biāo)記表示此IRP為頁面數(shù)據(jù)讀寫:

typedef struct-RP{

PM DL M dlA ddress;

ULON G FlagS;

}IRP,*PIRP;

IRP結(jié)構(gòu)的簡略定義如上代碼所示其中M dIA ddress指向類型MDL(Memory Descrp to rList)的數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)用于標(biāo)識驅(qū)動層之間傳輸數(shù)據(jù)的內(nèi)存緩沖區(qū);Flags用于標(biāo)識lRP的類型。

1)數(shù)據(jù)讀操作

數(shù)據(jù)讀操作的IRP類型為RPMJ-READ.RPMJ-READ的分發(fā)例程處理步驟如下所述:

procedure readFilterRoutine (irp:PIRP) ;

var buffer: VOID * ;

begin

if Wvl yFlags(up -> Flags) : = falsa then

begin

Send RPToL ow erD river(irp) ; return;

end

buffer: = GetA ddressF romMDL (irp -> M dIA ddress) ;

Send IRPToL ow erD river(irp) ;

WaitIR PCompletbn();

D ataD ecrytion (buffer);

end

其中IM yFlags()用于判斷IRP-> Flags是否為RP-NO -CACHEJRP-PA GN G—D類型的IRP請求,GetA ddressF romM DL()用于將從M DL結(jié)構(gòu)中獲取緩沖區(qū)的內(nèi)存地址在進(jìn)行數(shù)據(jù)解密操作時,由于存儲數(shù)據(jù)的緩沖區(qū)對應(yīng)的內(nèi)存頁面未加入到應(yīng)用程序所屬進(jìn)程的工作集中,所以解密操作不會與應(yīng)用程序的數(shù)據(jù)操作產(chǎn)生沖突。

2)數(shù)據(jù)寫操作

數(shù)據(jù)寫操作的IRP類型為JRPMJW RITEJRPM J.WR ffE分發(fā)例程的處理步驟如下所述:

pr ooedurew riterF ilter (irp:P IRP);

var buffer, newB uffer: VO D+:begin

if LsM yFlags(irp-> Flags):=falsa then

begin

Send JR PToL ow erD river(irp) ; return;

end

buffer = Ge tA dd ressF romM DL (irp -> M dIAddress) ;

newB uffer= M em o ryA llocate ( sizeof (buffer));

M emoryCopy (newBuffer, buffer) ;

D ataEncryp tion (newBuffer) ;

irp-> M dIA dd ress: = Ge tM DL F romA ddress (newBuffer) ;

Send IR PToL ow eD river (irp) ;

WaitIRPCompletion () ;

up-> M dlA dd ress: = GerM DL F romA ddress(buffer) ;

數(shù)據(jù)寫操作時,待寫緩沖區(qū)所對應(yīng)的頁面仍處于應(yīng)用程序所屬進(jìn)程的工作集中,通過對新分配內(nèi)存中數(shù)據(jù)進(jìn)行加密操作,避免了數(shù)據(jù)在加密時應(yīng)用程序同時訪問數(shù)據(jù)導(dǎo)致數(shù)據(jù)的不一致在底層驅(qū)動處理完IRP后必須恢復(fù)irp一>MdA ddress的值以避免上層組件因irp->M dIA ddress值發(fā)生改變而產(chǎn)生異常。

3、數(shù)據(jù)的加密解密方式

對于一個文件內(nèi)容的讀寫,通常需要多個IRP來完成,每個IRP負(fù)責(zé)讀寫文件的部分?jǐn)?shù)據(jù)在對每個IRP中傳輸?shù)臄?shù)據(jù)進(jìn)行加密或解密處理時不可以更改處理數(shù)據(jù)的長度,流加密算法可克服這個限制,但是流加密算法與分組加密算法相比安全強(qiáng)度較低為了使用分組加密算法,可以采用計數(shù)器(CTR)加密模式計數(shù)器加密模式具有簡單、高效、隨機(jī)性訪問等優(yōu)點(diǎn)。計數(shù)器加密模式的數(shù)據(jù)加密過程如圖3所示,數(shù)據(jù)的解密過程將Plain text與Cphertext的位置交換即可。

基于文件系統(tǒng)過濾驅(qū)動的安全增強(qiáng)型加密系統(tǒng)技術(shù)研究

采用計數(shù)器模式的分組加密算法對數(shù)據(jù)進(jìn)行加密解密,將每個分組中Counter加密后的結(jié)果Coun ter*進(jìn)行預(yù)存儲,加密數(shù)據(jù)時取出相應(yīng)的部分與明文直接進(jìn)行異或操作例如采用分組大小為128位的AES加密算法,可以構(gòu)造總大小為256KB的Counter*,對于文件小于256KB部分的數(shù)據(jù)直接與對應(yīng)的Counter*部分進(jìn)行異或操作對于文件大于256KB部分的數(shù)據(jù),動態(tài)地計算對應(yīng)的Coun ter*。通過這種方式有效地提高了一般大小(小于256KB)的文件的加密解密速度。

4、驅(qū)動層與應(yīng)用層的交互

本系統(tǒng)中服務(wù)進(jìn)程與文件系統(tǒng)過濾驅(qū)動層的通訊基于WDM中I/o ControICodes( DCTLs)機(jī)制DCT4b的基本原理如下所述:

處于用戶態(tài)的應(yīng)用程序調(diào)用DeviceIoControl函數(shù),Device JoControl函數(shù)的調(diào)用導(dǎo)致I/O管理器發(fā)送類型為RP-MJDEVICE-CONTROL的IRP到底層驅(qū)動,底層驅(qū)動RPMJDEV JCE-CONTROL分發(fā)例程處理此RP。在本系統(tǒng)中服務(wù)進(jìn)程向文件系統(tǒng)過濾驅(qū)動程序發(fā)送兩種DCTL,一種用于傳輸從智能卡中獲取的文件加解密密鑰,一種用于通知文件系統(tǒng)過濾驅(qū)動智能卡已取出文件系統(tǒng)過濾驅(qū)動在處理這兩種DCTL時,分別進(jìn)行密鑰相關(guān)數(shù)據(jù)結(jié)構(gòu)的構(gòu)造與刪除。

5、特殊類型文件的處理

大部分的文件都可以通過在RPMJ-READ時進(jìn)行解密,JRPMJWRrrE時進(jìn)行加密的方式進(jìn)行處理但對于一些特殊類型的文件如Micro softWord操作的文件(后綴名為doc)無法使用上述方法為了保證文件的可靠性,Micro soft Word在打開文件后會生成一個后綴名為tmp的臨時文件,在文件關(guān)閉之前對文件的修改全部保存到此文件中當(dāng)文件被關(guān)閉時,Micro softWord再將此臨時文件重命名為后綴名為doc的文件名這就導(dǎo)致在處理RPMJ-WRITE時只能接收到后綴名為trnp文件的寫操作,從而無法判斷是否要對文件進(jìn)行加密操作解決的方法是截獲文件的重命名操作(在類型為JRPMJ-SET-N FORMAT DN的分發(fā)例程中處理),然后記錄此文件重命名后的文件名,當(dāng)此文件最終被關(guān)閉時,在RPMJ-CLOSE的分發(fā)例程中設(shè)置一個工作線程工作線程被調(diào)用時首先將原文件加密到一個臨時文件,再將原文件刪除,最后將臨時文件重命名為原文件名。

基于文件系統(tǒng)過濾驅(qū)動技術(shù)的加密系統(tǒng)在實(shí)際的開發(fā)中,還要考慮很多其他問題如IRP的重入,過濾驅(qū)動的掛載與卸載等另外通過擴(kuò)展使系統(tǒng)支持多種加密算法以及實(shí)現(xiàn)應(yīng)用層的函數(shù)接口,可以使得應(yīng)用層軟件靈活方便地與系統(tǒng)進(jìn)行集成,有助于系統(tǒng)的實(shí)際的應(yīng)用。

小知識之過濾驅(qū)動

就是掛載在其他驅(qū)動上,對某設(shè)備的irp進(jìn)行攔截過濾,可以對設(shè)備進(jìn)行功能擴(kuò)展,或是數(shù)據(jù)加密等,很靈活。