趙春平 劉文麗
江南計算技術研究所 江蘇 214083
在SSLVPN中,實現網絡訪問的通用做法是采用虛擬網卡。Openvpn是這種技術的開源實現,它通過實現一個虛擬網卡將 IP或鏈路層數據傳輸到應用層,在應用層通過 SSL隧道通信,以達到安全目的。
本文提出了一種基于Windows NDIS來實現SSLVPN網絡訪問功能的一種方法,與虛擬網卡SSLVPN不同的是,本方法不需要虛擬IP地址,也不需生成虛擬網卡,它使用真實的物理IP地址進行通信。
本方法借鑒了虛擬網卡方式SSLVPN的思想:實現一個SSLVPN,開發人員需要通過各種手段來截獲通信數據,然后將通信數據在SSL隧道中傳輸。Windows平臺下,虛擬網卡工作方式的SSLVPN從根本上講是將Windows內核態協議棧中的網絡數據通過IO控制傳遞到用戶態的SSL隧道中進行傳輸,它的實現手段是操作系統路由和虛擬網卡。本文介紹的方法通過IO控制將Windows的NDIS層數據傳遞到用戶態進行安全傳輸。
NDIS(Network Driver Interface Specification)是微軟實現的網絡驅動接口規范。它包括NDIS協議驅動,NDIS小端口驅動和NDIS中間層驅動,各種驅動遵循規范進行交互。
通過NDIS中間層可以進行網絡數據的截獲,NDIS中間層截獲的數據為數據鏈路層數據。
微軟的WDK中提供了passThru實現范例,它是一個透明的NDIS中間層驅動。開發人員可以修改passThru范例來達到自己的目的。
在SSLVPN的網絡功能中,客戶端可以在協議棧的各個層次(需操作系統支持)劫持網絡數據,并在用戶態的SSL通道中發送。網絡層截獲從理論上講應該有三種方法:TDI截獲、NDIS截獲以及虛擬網卡方式的截獲。目前市場上的SSLVPN實現一般都采用虛擬網卡來截獲數據,因此有必要來研究基于NDIS截獲的實現方式。
SSL(Security Socket Layer)協議是廣泛使用的安全通信協議。SSL客戶端和SSL服務端在socket層協商秘密信息,并在此基礎上進行安全通信。
本方法通過NDIS中間層驅動來劫持和插入網絡數據:在發送數據時,通過NDIS驅動和IO操作,將網絡數據傳遞到操作系統用戶態,并在SSL隧道中傳輸;從SSL隧道中接收的網絡數據,通過NDIS驅動和IO操作插入到操作系統內核協議棧,如圖1所示。

圖1 實現原理
數據的發送過程如下:
(1)客戶端發送數據時,網絡數據被NDIS中間層截獲,存入緩沖區;
(2)客戶端用戶態進程通過ReadFile函數讀取NDIS中間層截獲的網絡數據;
(3)客戶端用戶態進程通過 SSL隧道發送網絡數據給SSLVPN服務端;
(4)SSLVPN服務端將網絡數據發送到內部網絡。
數據的接收過程如下:
(1)客戶端從SSL隧道接收網絡數據;
(2)客戶端用戶態進程通過WriteFIle函數將網絡數據寫入到NDIS驅動;
(3)NDIS驅動將網絡數據插入到協議棧,提交給上層。
為了避免出現環路通信,使 SSL隧道能夠正常工作,NDIS中間層必須放過SSL隧道的網絡通信。NDIS截獲的數據是鏈路層數據,因此,此種方法能實現SSLVPN的網絡訪問功能。
下面給出了主要模塊的大致實現方法:
(1)NDIS驅動
NDIS驅動以微軟WDK中提供的Passthru范例為基礎,增加讀寫文件操作以及緩存發出的網絡數據。在讀文件操作中,需要NDIS驅動緩存MPSendPackets中的發送數據,如何緩存以及如何讀取,可以參考openvpn的實現方式。在寫文件操作中,我們需要構造一個數據包提交給上層協議棧,可以調用 NdisMEthIndicateReceive函數。下面給出了 Ndis驅動最核心的改動代碼。
在Ndis發生數據包之前,需要對發出的包進行判定,如果是需要處理的包,則將包進入環形緩沖區。改動如下:

為了用戶態進程能夠讀取環形緩沖區中的數據以及將受到的數據寫入Ndis驅動,需要在passthru.c的PtDispatch中增加讀寫支持,如下:



(2)SSL協議
SSL協議使用openssl來實現。或者也可以使用openvpn的源碼,替換其中的虛擬網卡驅動為NIDS驅動,僅做部分修改即可。
本方法適用于基于NDIS的截獲以及基于虛擬網卡的截獲方案。用戶態進程通過一次 IO操作僅僅只讀取和寫入了一個數據包。IO操作比較耗時,因此在用戶態進程讀寫的時候,如果盡可能的讀寫多個數據包,將會極大的提高性能。本方法同樣適用于開源的openvpn(開源的openvpn的虛擬網卡驅動中,每次僅讀寫一個數據包)。
通過NDIS中間層驅動實現SSLVPN時,所使用的均為實際的物理地址,一個物理地址即能做到密文通信同時也進行明文通信。
通過NDIS中間層驅動、IO控制以及響應的傳輸層安全通信手段(比如SSL協議),還能夠實現任意兩點之間的保密通信。NDIS的截獲可以只針對特定目標,完全不影響其他的正常通信。
[1]rfc2246,The TLS Protocol Version 1.0.2009.
[2]WDKDocs_12112009.chm, windows wdk.2009.