方 飛, 李 兵
(內江師范學院物理學電子信息工程系,四川 內江 641112)
隨著網絡應用的廣泛,網絡攻擊行為日趨嚴重,防火墻也在網絡信息安全領域承擔著十分重要的角色。在Windows下實現數據載包有如下幾種方式[1-2]:①用戶態下的網絡數據包攔截方式有:Winsock Layered Service Provider、Windows包過濾接口;替換系統自帶的WINSOCK動態連接庫;②利用驅動程序攔截網絡數據包的方式有:TDI過濾驅動程序、NDIS中間層驅動程序、Win2k Filter-Hook Driver、NDIS Hook Driver、小端口驅動程序。每一種技術都有其局限性,在用戶態下進行數據包攔截最致命的缺點就是只能在Winsock層次上進行,而對于網絡協議棧中底層協議的數據包無法進行處理,對于一些木馬和病毒來說很容易避開這個層次的防火墻[3]。現今的防火墻不再單純的使用某一種技術來實現,從技術的角度講,IMD具有最強的功能,但是由于其安裝的復雜性,因此很少被用于個人防火墻,TDI已經網絡狀態控制的主要技術。
在Windows系統中,網絡協議棧的核心協議由TDI傳輸驅動程序(協議驅動程序)實現,傳輸驅動程序Tcpip.sys是Windows TCP/IP協議的內核模式實現,它通過創建三個設備對象DeviceTcp,DeviceUdp和DeviceIp來實現TCP/IP協議中的TCP, UDP, IP等核心協議,基于TCP/IP協議的應用程序的網絡數據操作都是通過訪問這幾個設備來進行的[4]。 TDI傳輸驅動程序通過創建設備對象來代表特定的協議,上層的TDI客戶能夠獲得一個代表協議的文件對象并且通過IRP與協議進行網絡通信,這些IRP在傳輸驅動程序的Dispatch例程中進行處理。在TDI層面上攔截網絡數據包可以通過一個驅動程序來 HOOK傳輸驅動程序中的Dispatch例程缺點是 HOOK技術并非微軟公開支持的技術[5]。另外在TDI層面上可以采用分層驅動程序技術進行網絡數據包的攔截,即將一個驅動程序掛接到TDI傳輸驅動程序之上,當TDI客戶向協議發出請求時,這個驅動程序先于傳輸驅動程序得到這個請求,當協議向 TDI客戶傳輸數據時,這個驅動程序先于TDI客戶得到數據,這樣就可以在驅動中對網絡數據包進行過濾,TDI過濾驅動程序掛接Tcpip.sys后的分層結構如圖1所示。

圖1 TDI驅動掛接前后示意圖
在TDI驅動程序設計時添加自己的驅動于tcpip.sys之上,在包處理過程中將過濾驅動模塊加入到TDI Interface處,攔載核心模式請求 IRP_MJ_INTERNEL_DEVICE_CONTROL下的除打開和關閉文件對象之外的各內部傳輸函數據處理操作TDI_XXX請求,獲取整個通信過程中的數據,根據定義的規則進行過濾,并對每一上網程序向用戶通告,從而有效的防止非法程序連接網絡,TDI實現的總體結構如圖2[5]。在驅動設計中,驅動程序如何時實現對上網程序的控制,應用層如何同驅動進行通信,內存的分配及釋放,當驅動需要資源無法得到滿足量,可能會造成系統的崩潰,這些都必須在驅動進行處理。
防火墻的一項重要功能就是當未知有應用程序時試圖連接網絡時,向用戶通知程序的相關信息。進程號唯一標識用戶的進程,通過TDI獲得當前試圖連接網絡的進程ID號,將該ID號通過通信模塊傳輸至界面程序,并在應用程序部分獲取進程的詳細信息顯示給用戶,在該等待用戶處理過程中必須使用驅動處理等待狀態,然后用戶將確認信息傳輸至驅動以進行以后的處理。TDI驅動中可以在許多事件中以獲得上網進程的ID號,在TDI_CREATE處理過程中會創建一個FILE_FULL_EA_INFORMATION類型的對象,當創建控制對象時就可以獲取進程ID號通告應用程序,主要是在TDI_CREATE時進行處理,因為此時處理可以防止連接的創建并節約資源,其處理流程如圖4所示,處理后的相應效果如圖3所示,在實際應用中,還應在在提示中還可以加入允許或禁止或其它選擇項。
要實現用戶對驅動的控制,其前提是應用層與驅動程序間的相互通信。在網卡接收/發送過程中,驅動程序緩存報文,并通過IO方式或者共享內存方式應用層有報文需要處理。在100 Mb/s速率下,以上兩種方式都可以滿足需要,較簡便的方式就是使用有緩沖的IO方式,應用層處理完畢相同的方式向驅動程序遞交結果[4]。在應用程序使用CreateFile的打開驅動程序MyTDI.sys時,驅動程序利用IoCreate SynchronizationEvent在BaseNamedObjects下創建一個有名的事件tdirequest,然后應用程序使用OpenEvent打開此有名事件即可。設計時應注意tdirequest創建時機,否則可以不創建成功,或造成事件只能讀(Waitxxxx),不能寫(SetEvent/ResetEvent)。驅動對應用層讀請求應立即返回,否則將失去用事件通知的意義,當應用程序發現有事件,應該在一個循環中讀取,直到讀取失敗,表明沒有數據可讀;否則會漏掉后續數據,而沒有及時讀取,事件通告處理流程如圖5所示,關鍵源代碼如下所示。

圖2 TDI處理基本流程

圖3 QQ上網時用戶端通告信息

圖5 應用層和驅動程序的通信
NTSTATUS filter_init (void)化命名事件
{ NTSTATUS status;
if (g_queue.event_handle == NULL)
{ UNICODE_STRING str;
OBJECT_ATTRIBUTES oa;
RtlInitUnicodeString(&str,
L"\BaseNamedObjects\tdirequest");
InitializeObjectAttributes(&oa, &str, 0, NULL, NULL);
status
ZwCreateEvent(&g_queue.event_handle,
EVENT_ALL_ACCESS,&oa, ynchronizationEvent, FALSE);
if (status != STATUS_SUCCESS) {
return status; }}
if (g_queue.event == NULL) {
status = ObReferenceObjectByHandle(
g_queue.event_handle, EVENT_ALL_ACCESS, NULL,
KernelMode, &g_queue.event, NULL);
if (status != STATUS_SUCCESS) {
return status;}
}
return STATUS_SUCCESS;
}
在應用程序部分加上該行代碼 g_event = OpenEvent(SYNCHRONIZE, FALSE, "tdirequest");就可以打開命名事件并共同操作該事件。
驅動程序在執行時由于創建文件對象或加入過濾規則都需要動態分配內存空間,由于網絡驅動的代碼常常在較高的IRQL等級執行而不允許頁錯誤,因而通常不能使用可分頁內存。非分頁內存在整個系統中是一個有限的資源,其數量依賴于系統使用的類型和系統可用的物理內存,NT提 供 ExAllocatePool、ExAllocatePoolWithQuota 、ExAllocate PoolWithTag及ExAllocatePoolWithQuotaTa例程給內核驅動來分配內存[2-3],調用這些函數來請求內存時,必須要指定請求的內存的類型是NonPagedPool(請求分配一個不可分頁的內存)還是PagedPool(請求分配一個可分頁的內存)。在設計中使用了ExAllocatePool從非分頁的池中來實現對內存空間的動態分配,為了保證在分配空間,其它進行對內存塊的請求,使用了一個自旋鎖以保護對內存塊列表的修改。由于非分頁內存在整個系統中是一個有限的資源,因此當空間不需要時必須釋放存儲空間,實現部分源代碼如下:
//分配內存空間
KeAcquireSpinLock(&guard, &irql);
data = (struct prefix *) ExAllocatePool(
NonPagedPool,sizeof(struct prefix)+size+sizeof(struct postfix));
KeReleaseSpinLock(&guard, irql);
//釋放內存單元
KeAcquireSpinLock(&guard, &irql);
memset(data->data, 0xc9, data->size);// 用 0xc9 填充ExFreePool(data);
KeReleaseSpinLock(&guard, irql)。
TDI過濾驅動程序已經作為網絡狀態控制的主要技術在防火墻中得到廣泛應用,由于TDI不能獲取未經過傳輸層的數據包(如 ICMP包),因而還需同其它過濾技術相結合。在TDI設計中,除了需要考慮通信及內存分配的問題外,還需要考慮當錯誤的有效處理,因為驅動程序出錯往往引起系統的崩潰,而在過濾規則鏈的查詢中還應該提高效率,在設計使用了HASH表的方法。在設計中可以對處于 PASSIVE_ LEVEL的主動事件進行交互處理,并由用戶決定是否進行過濾等操作,但對一些類似 TDI_EVENT_CONNECT的被動事件,其工作于 DISPATCH_LEVEL,不能設置等待,否則會藍屏。在TDI中還可以進行內容過濾,但是其效率必須的改進是以后應該研究的內容。
[1] 杜江,王天平,羅文龍.基于主機的網絡防火墻技術及其實現方法[J].重慶郵電學院學報:自然科學版,2002,14(03):26-29.
[2] 楊立身,張萍,陳艷格.基于IPv4/v6下的IPSec與防火墻協同問題研究[J].通信技術,2008,41(06):119-121.
[3] 劉益洪,陳林.基于防火墻的網絡安全技術分析[J].通信技術,2008,41(06):136-138.
[4] 周子平,杜月云.企業級防火墻的技術與選擇[J].通信技術,2009,42(04):117-119.
[5] 高澤勝,陶宏才.基于 NDIS_HOOK技術的個人防火墻的研究與實現[J].成都信息工程學院學報,2004(09):327-329.