蔣 華 樊金坡 張 罡 胡榮磊
(北京電子科技學院 北京 100070)
隨著信息化的發(fā)展,商用密碼已經成為保障網(wǎng)絡安全的重要一環(huán),在包交換網(wǎng)絡中,商密數(shù)據(jù)包承載著協(xié)商安全關聯(lián)、密態(tài)數(shù)據(jù)傳輸、會話保持和狀態(tài)查詢等任務。網(wǎng)絡協(xié)議是通信雙方為進行數(shù)據(jù)交換建立的標準體系,通過網(wǎng)絡協(xié)議解析,可以了解網(wǎng)絡數(shù)據(jù)包在產生和傳輸過程中的行為[1]。
目前網(wǎng)絡協(xié)議解析方面的研究多集中在私有協(xié)議設計與解析上[2-4],對私有協(xié)議的解析通??梢苑譃椴寮秃蛢惹缎蛢煞N方式[5]。為了滿足保障關鍵信息基礎設施安全的需求,網(wǎng)絡安全協(xié)議被不斷改進,密鑰協(xié)商、密碼算法的使用與標準協(xié)議相比產生變化,導致網(wǎng)絡流量的解析與網(wǎng)絡活動的識別較為不便。
本文介紹了網(wǎng)絡協(xié)議解析的基本流程與一般方法,研究了網(wǎng)絡協(xié)議的語法設計與字段處理,對Wireshark進行二次開發(fā),在內嵌型開發(fā)方式下,完成了對使用商密算法的安全協(xié)議全生命周期的解析支持。以使用商密算法的ISAKMP[6]和ESP[7]協(xié)議為例,驗證了數(shù)據(jù)包解析的有效性和正確性。為商密數(shù)據(jù)包的解析與內容檢測提供了借鑒,同時為后續(xù)安全測評、用戶行為統(tǒng)計等應用打下了基礎。
網(wǎng)絡安全協(xié)議運用密碼算法和協(xié)議邏輯實現(xiàn)加密和認證功能,用于解決計算機網(wǎng)絡面臨的安全威脅問題,常見的網(wǎng)絡安全協(xié)議有SSL、TLS、IPSec和SET等。根據(jù)實際應用需求,文獻[8-9]對相關協(xié)議的技術規(guī)范給出了特定要求。本文使用商密IPSec VPN作為數(shù)據(jù)源。
IPSec是在IETF(The Internet Engineering Task Force)的贊助下開發(fā)的一組協(xié)議,旨在通過IP分組交換網(wǎng)絡提供安全服務[10],也是目前易于擴展的、完整的網(wǎng)絡安全方案。IPSec有兩種工作模式:傳輸模式和隧道模式。在傳輸模式下,相互通信的設備IP地址必須在其間的網(wǎng)絡上可路由,這種模式不具備NAT穿越功能。在實際應用中,隧道模式更為常見。下面對隧道模式下商密IPSec的兩種數(shù)據(jù)封裝方式進行分析,AH協(xié)議與ESP協(xié)議的數(shù)據(jù)封裝分別如圖1(a)和(b)所示。
圖1 商密IPSec數(shù)據(jù)封裝方式
在隧道模式下,需要產生一個新IP頭部,IPSec頭(AH頭或ESP頭)被插入到新IP頭與原IP頭之間。在AH協(xié)議中,IPSec頭包含一個帶密鑰的hash散列,用于提供數(shù)據(jù)包的完整性保護和抗重放攻擊,其密碼算法使用SM3;在ESP協(xié)議中,ESP報頭包括安全參數(shù)索引、序列號信息,ESP報尾標識了下一個報頭與擴展位信息,認證報尾中則寫入了數(shù)據(jù)包的hash校驗值。與AH協(xié)議相比,ESP協(xié)議的安全性更高,除了提供完整性保護和數(shù)據(jù)源認證外,還具有加密功能,其密碼算法使用SM3與SM4。
IPSec協(xié)議使用IKE協(xié)議[11]建立安全聯(lián)盟SA并完成密鑰交換的過程。在IKEv2的消息交換過程中,除了IKE_SA_INIT交換,其余的交換都為密態(tài)消息,SK{}中的數(shù)據(jù)受到加密和完整性保護。密鑰材料的生成為后續(xù)的商密數(shù)據(jù)包的機密與完整性校驗提供了支持。IKEv2的消息交換過程如圖2所示。
圖2 IKEv2的消息交換過程圖
IKE_SA的共享密鑰以如下方式進行計算:從IKE_SA_INIT交換中交換的nonce值和DH共享密鑰計算出稱為SKEYSEED的數(shù)。SKEYSEED的生成算法如下:SKEYSEED=prf(Ni|Nr,g^ir)。SKETSEED用于生成七個其他的密鑰。各密鑰以如下順序和方式生成:
{SK_d|SK_ai|SK_ar|SK_ei|SK_er|SK_pi|SK_pr}=prf+(SKEYSEED,Ni|Nr|SPIi|SPIr)
在本文選用的商密VPN中,prf+就是HMAC-SM3,所以:
SK_d=HMAC-SM3(SKEYSEED,Ni|Nr|SPIi|SPIr|0x01)
SK_ai=HMAC-SM3(SKEYSEED,SK_d|Ni|Nr|SPIi|SPIr|0x02)
SK_ar=HMAC-SM3(SKEYSEED,SK_ai|Ni|Nr|SPIi|SPIr|0x03)
SK_ei|SK_er=HMAC-SM3(SKEYSEED,SK_ar|Ni|Nr|SPIi|SPIr|0x04)
SK_pi=HMAC-SM3(SKEYSEED,SK_ei|SK_er|Ni|Nr|SPIi|SPIr|0x05)
SK_pr=HMAC-SM3(SKEYSEED,SK_pi|Ni|Nr|SPIi|SPIr|0x06)
其中:SK_d用于為IKE_SA的CHILD_SA生成新的密鑰;SK_ai和SK_ar為完整性保護算法的密鑰;SK_ei和SK_e為加密所有后續(xù)交換的密鑰;SK_pi和SK_pr用于生成AUTH載荷。
在安全聯(lián)網(wǎng)終端與服務器之間通過Gmswan建立安全隧道。Gmswan基于開源項目strongSwan設計,對strongSwan中的加密算法進行了替換,其中對稱算法通過修改aes_crypter.c文件替換為商密SM4算法,摘要算法通過修改mac_signer.c文件替換為商密SM3算法,非對稱算法通過修改openssl_ec_private_key.c文件替換為SM2算法。此外將密鑰協(xié)商算法DH替換為SM2,將隨機數(shù)生成算法prf+替換為HMAC-SM3。Gmswan通過ipsec.conf來配置安全管理的協(xié)商參數(shù),在完成商密安全隧道的建立之后,使用Wireshark對安全聯(lián)網(wǎng)終端與服務器之間的數(shù)據(jù)包進行捕獲。
流經網(wǎng)卡的數(shù)據(jù)被捕獲引擎獲取后,會將數(shù)據(jù)包存儲到本地,供解析器分析。在Wireshark中,其數(shù)據(jù)包捕獲引擎使用Dumpcap,獲取的數(shù)據(jù)包文件存在Wiretap中。捕獲的內容會按層級被解析為幀、段和消息載荷數(shù)據(jù)。Wireshark采用模塊化設計結構,在其六大功能[5]模塊中,Epan負責協(xié)議的具體解析。商密協(xié)議解析的一般流程如圖3所示。
圖3 商密數(shù)據(jù)包解析流程圖
協(xié)議解析一般按照OSI七層模型進行,從鏈路層的幀開始,進行層層剝離。在加載協(xié)議解析器時,通過通信協(xié)議端口號或包頭獲取特征值的方式,進行過協(xié)議解析器的選擇匹配。當本層協(xié)議報頭解析完成,數(shù)據(jù)部分會被送往上層協(xié)議解析器解析,直至整個消息被解析完全。在顯示方式上,Wireshark使用偏移量進行其樹形結構的維護。
本文使用內嵌型開發(fā)方式完成Wireshark對商密算法的支持。與編寫插件的方式相比,內嵌型方式對源碼進行靜態(tài)編譯,無論是程序的執(zhí)行速度還是調用功能代碼方面都更具優(yōu)勢。在內嵌型開發(fā)方式下,對Wireshark協(xié)議解析功能的擴展主要是對EpanDissector中的文件進行修改,與IPSec有關的源碼主要是isakmp.c和ipsec.c,分別對應IKE的過程和ESP與AH的封包。
進行二次開發(fā)之前,需要下載Wireshark的源碼,安裝配置相應的庫。下面介紹在Windows平臺上搭建Wireshark開發(fā)環(huán)境的過程[5]。
1)安裝Chocolate:用于Windows平臺的包管理。
2)安裝Microsoft C compiler and SDK:本文采用的是Visual Studio 2015。
3)安裝QT:Wireshark的主要應用程序使用QT的窗口工具。
4)安裝Cygwin:Cygwin包含了大量GNU和開源工具,在安裝過程中,除了默認選項外,還需要將Devel/bison、Devel/flex、Devel/git、Devel/patch、Interpreters/perl和Text/docbook-xml45這些選項選中。
5)安裝Python:為Cygwin的包在Win 32下順利執(zhí)行提供支持。
6)安裝Git:用于下載及管理wireshark源碼。
7)安裝CMake:用于生成系統(tǒng)的構建文件。
8)安裝Asciidoctor, Xsltproc, DocBook:用于生成文檔和用戶指南。
完成上述工具的安裝后,使用git clone下載Wireshark源碼,即可對代碼進行重構。
Wireshark中默認支持ecdsa-sha256算法,該算法的摘要長度為256位。SM3算法的摘要長度同樣是256位,在設計商密VPN時,數(shù)據(jù)的完整性使用SM3保護,因此在進行商密數(shù)據(jù)包解析時,需要將受完整性保護的字段找到,使用SM3算法對其進行摘要,再與完整性校驗和數(shù)據(jù)ICD(Integrity Checksum Data)進行比對。Wireshark使用libcrypt庫進行密碼算法的調用,其摘要函數(shù)接口為gcry_md_read(),將其替換為SM3算法的函數(shù)接口即可。在算法替換之后,原有的國際算法(如SHA1、SHA2)無法調用,但這與設計商密算法數(shù)據(jù)包解析的初衷并不沖突,軟件解析功能也不會因此受到影響。
在商密VPN設計時,使用SM4對分組算法AES進行了替換。AES與SM4的分組長度均為128位,其密鑰長度也相同,均為16字節(jié)。這簡化了算法替換的過程。對AES的替換主要是兩處函數(shù)接口,分別為解密函數(shù)gcry_cipher_decrypt()和傳入密鑰函數(shù)gcry_cipher_setkey()。由于不同協(xié)議對消息機密性保護的字段不同,向SM4解密函數(shù)接口中傳入的數(shù)據(jù)長度有所區(qū)別。如IKEv2中消息解密函數(shù)sm4_crypt()傳入的數(shù)據(jù)長度為encr_data_len,而ESP中消息解密函數(shù)sm4_crypt()傳入的數(shù)據(jù)長度為decrypted_len_alloc+esp_iv_len,因此需要在設計時,對原有解析規(guī)則進行深入分析。
在完成載荷的解密后,使用dissect_payloads()函數(shù)對有效載荷進行解析,通過proto_item_append_text()將解析字段發(fā)送至GUI,完成解析數(shù)據(jù)的顯示。
完成對源碼的擴展后,在編譯器的命令行終端VS2015 x86 Native Tools Command Prompt中設置環(huán)境變量以滿足編譯過程中對庫的調用,創(chuàng)建構建目錄并生成構建文件,使用msbuild/m/p:Configuration=Rel-WithDebInfo Wireshark.sln對Wireshark進行構建。在編譯完成后,命令行終端輸出如圖4所示。
圖4 編譯Wireshark的輸出
測試環(huán)境拓樸圖如圖5所示,在局域網(wǎng)環(huán)境下部署了IPSec VPN系統(tǒng),測試環(huán)境遵循服務器-客戶端模式。PC1與Web服務器通過VPN建立的加密隧道進行數(shù)據(jù)流的交互。PC2的網(wǎng)卡設置為混雜模式[12],允許網(wǎng)卡獲取所有流經網(wǎng)絡線路的數(shù)據(jù)包,運行在其上的Wireshark,基于伯克利數(shù)據(jù)包過濾器語法[13]對經過服務器網(wǎng)卡的網(wǎng)絡數(shù)據(jù)包進行抓取,并進行協(xié)議解析。Wireshark測試環(huán)境網(wǎng)絡配置如表1所示。
圖5 測試環(huán)境拓撲圖
表1 Wireshark測試環(huán)境網(wǎng)絡配置
通過抓取數(shù)據(jù)包并添加過濾規(guī)則(isakmp or esp),可以看到IKE過程的4條信息與ESP消息。Wireshark發(fā)行版在輸入交換密鑰并選擇加解密算法與完整性校驗算法后能夠對IPSec協(xié)議簇中的密態(tài)消息進行解析,但由于Wireshark發(fā)行版中不含商密系列算法,因此無法正確解析商密數(shù)據(jù)包,對數(shù)據(jù)包完整性校驗與密態(tài)載荷解析均異常,Expert Info中判定出現(xiàn)嚴重錯誤。
Wireshark發(fā)行版解析時的完整性校驗警告如下:
[Expert Info(Warning/Checksum):IKEv2 Integrity Checksum Data is incorrect]
[IKEv2 Intergrity Checksum Data is incorrect]
[Severity level:Warning]
[Group:Checksum]
Wireshark發(fā)行版解析時判定數(shù)據(jù)包格式錯誤:
[Expert Info(Error/Malformed):MalformedPacket(Exception occurred)]
[Malformed Packet(Exception occurred)]
[Severity level:Error]
[Group: Malformed]
使用基于Wireshark的商密數(shù)據(jù)包解析工具解析商密數(shù)據(jù)包,在菜單欄的編輯/首選項/Protocols中,完成密鑰材料的添加。圖6為解密后商密數(shù)據(jù)包解析工具中的明文數(shù)據(jù),圖7為商密VPN系統(tǒng)日志server.log中的解密消息。經過與Wireshark中Decrypted Data對比,可以看出,本文解析工具對商密數(shù)據(jù)的解密完全正確。
圖6 Wireshark中的解密數(shù)據(jù)
圖7 商密VPN服務器端日志信息
Wireshark顯示了數(shù)據(jù)包信息并為各字段添加標簽,按照協(xié)議標準將各消息載荷解析為帶有標簽的、可理解的文本之后,就完成了對商密數(shù)據(jù)包的完全解析。圖8為將商密ESP數(shù)據(jù)包解密后,Wireshark中顯示實際使用的通信協(xié)議。圖9為在有效維護Wireshark獨特的樹形結構的基礎上,解析后商密數(shù)據(jù)包中內容,其中各字段按照協(xié)議標準規(guī)定的明確格式進行排列。
圖8 使用二次開發(fā)的Wireshark解析商密數(shù)據(jù)包
圖9 解析后商密數(shù)據(jù)包中內容
隨著移動通信和下一代網(wǎng)絡等技術的發(fā)展,保障網(wǎng)絡信息傳輸?shù)陌踩耘c可靠性成為研究熱點。在政務、金融、教育、醫(yī)療等諸多領域,越來越多的安全產品及應用不斷涌現(xiàn)。對產品安全性與功能正確性的驗證需要一個良好的數(shù)據(jù)解析工具,而Wireshark以其開源和易擴展的特點滿足了這一需求。本文對Wireshark的體系結構及開發(fā)方式進行了分析與研究,給出了一種可擴展的商密數(shù)據(jù)解析方法與流程,并以一款符合商密《IPSec VPN技術規(guī)范》的VPN網(wǎng)關作為數(shù)據(jù)源,進行了實例的解析與驗證。結果表明,基于Wireshark的商密數(shù)據(jù)包解析工具能夠對商密數(shù)據(jù)進行正確有效的解析,為后續(xù)設備安全性檢測與數(shù)據(jù)內容匹配提供了借鑒。