吳亞銘,徐文斌,王 馭,楊天泉,梁鴻斌
隨著移動(dòng)互聯(lián)網(wǎng)技術(shù)的高速發(fā)展和廣泛應(yīng)用,信息安全引起了社會(huì)各界的高度關(guān)注?!八怪Z登”事件讓人們認(rèn)識(shí)到,網(wǎng)絡(luò)攻擊無處不在,信息安全形勢(shì)十分嚴(yán)峻。
網(wǎng)絡(luò)攻擊可以分為被動(dòng)攻擊和主動(dòng)攻擊。其中,被動(dòng)攻擊的特性是對(duì)傳輸進(jìn)行竊聽和監(jiān)測(cè),攻擊者的目的是獲得傳輸?shù)男畔ⅲ鐐鬏斝畔⒌膬?nèi)容、傳輸流量的分析等。主動(dòng)攻擊包括對(duì)數(shù)據(jù)流進(jìn)行修改或偽造數(shù)據(jù)流,可分為假冒、重放、消息修改和拒絕服務(wù)等四類。重放攻擊是指將通過竊聽等手段獲得的信息再次發(fā)送以產(chǎn)生非授權(quán)的效果[1]。
抗重放攻擊的基本原理是在每個(gè)協(xié)議數(shù)據(jù)幀中增加抗重放變量,并保證該變量在每個(gè)數(shù)據(jù)幀中的值不相同??怪胤抛兞靠梢允请S機(jī)數(shù)、時(shí)間戳和流水號(hào)等。當(dāng)抗重放變量采用隨機(jī)數(shù)時(shí),通信雙方需要記住某一時(shí)間段內(nèi)使用過的所有隨機(jī)數(shù),保存和查詢的開銷很大。當(dāng)抗重放變量采用時(shí)間戳?xí)r,通信雙方需要準(zhǔn)確進(jìn)行時(shí)間同步。同步越好,抗重放的效果越好。當(dāng)抗重放變量采用流水號(hào)時(shí),通信雙方不需要進(jìn)行時(shí)間同步,存儲(chǔ)和查詢的開銷也較小。
IPsec通過在被保護(hù)數(shù)據(jù)前增加一個(gè)IPsec包頭,并采用數(shù)據(jù)完整性校驗(yàn)/驗(yàn)證、加/解密、抗重放判斷等方式對(duì)通信數(shù)據(jù)進(jìn)行保護(hù)。IPsec的“驗(yàn)證頭(AH)”協(xié)議[2]和“封裝安全載荷(ESP)”協(xié)議[3],均采用流水號(hào)方式提供抗重放服務(wù)。數(shù)據(jù)包格式分別如圖1、圖2所示。
圖1 AH數(shù)據(jù)包格式
圖2 ESP數(shù)據(jù)包格式
創(chuàng)建安全關(guān)聯(lián)(SA)時(shí),通信雙方均將序列號(hào)(即流水號(hào))設(shè)置為0。每個(gè)IPsec包頭內(nèi)的序列號(hào)均是獨(dú)一無二且單調(diào)遞增的。每次發(fā)送方發(fā)送數(shù)據(jù)時(shí),序列號(hào)遞增,并寫入發(fā)送IPsec包頭。接收方收到后,使用如圖3所示的滑動(dòng)窗口,判斷新收到的數(shù)據(jù)是否為重放的數(shù)據(jù)報(bào)文,并在驗(yàn)證新收數(shù)據(jù)的合法性后,對(duì)該窗口進(jìn)行滑動(dòng)操作。
圖3 32位滑動(dòng)窗口(剛收到第N+33包,尚未驗(yàn)證、滑動(dòng)窗口)
由圖3可見,32位滑動(dòng)窗口由滑動(dòng)窗口寬度k、位圖(32 bit)和起始序列號(hào)N三個(gè)參數(shù)構(gòu)成。位圖的每個(gè)比特依次對(duì)應(yīng)一個(gè)數(shù)據(jù)包流的序列號(hào),用于記錄起始序列號(hào)為N的32個(gè)連續(xù)數(shù)據(jù)包是否已收到的狀態(tài),bit0對(duì)應(yīng)N,bit1對(duì)應(yīng)N+1,……,bit31對(duì)應(yīng)N+31?;瑒?dòng)窗口每個(gè)比特的取值表示該序列號(hào)對(duì)應(yīng)的數(shù)據(jù)包是否已收到,0表示未收到(圖中用陰影表示),1表示已收到。圖3中,序列號(hào)為N、N+26、N+28、N+30、N+32、N+34以及N+34之后的數(shù)據(jù)包均未收到;滑動(dòng)窗口內(nèi)的其他數(shù)據(jù)包、滑動(dòng)窗口之前的數(shù)據(jù)包均已收到;序列號(hào)為N+33的數(shù)據(jù)包剛剛收到,但滑動(dòng)窗口尚未執(zhí)行滑動(dòng)操作。
當(dāng)新收到一個(gè)數(shù)據(jù)包時(shí),接收方首先應(yīng)判定是否為重放數(shù)據(jù)包。若為重放包,則丟棄;否則,對(duì)數(shù)據(jù)包的合法性進(jìn)行驗(yàn)證(合法性驗(yàn)證包括解密、完整性驗(yàn)證等操作)。合法性驗(yàn)證失敗,則丟棄;否則,接收該數(shù)據(jù)包并進(jìn)行窗口滑動(dòng)操作。
VPN隔離網(wǎng)關(guān)是一種利用IPsec技術(shù)實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)加密傳輸并對(duì)可信網(wǎng)絡(luò)(即內(nèi)網(wǎng))和不可信網(wǎng)絡(luò)(即外網(wǎng))進(jìn)行安全隔離的設(shè)備,可有效防止非法數(shù)據(jù)進(jìn)入可信網(wǎng)絡(luò),避免可信網(wǎng)絡(luò)內(nèi)的主機(jī)被非法控制以及內(nèi)網(wǎng)的敏感數(shù)據(jù)泄露到外網(wǎng)。IPsec抗重放技術(shù)是一種VPN隔離網(wǎng)關(guān)抵抗重放攻擊的有效手段。
通常,VPN隔離網(wǎng)關(guān)采用如圖4所示的“雙ARM+FPGA”架構(gòu)。FPGA位于內(nèi)網(wǎng)主機(jī)和外網(wǎng)主機(jī)之間,對(duì)內(nèi)網(wǎng)和外網(wǎng)數(shù)據(jù)進(jìn)行“擺渡”、加解密處理和數(shù)據(jù)包合法性驗(yàn)證[4]。
圖4 VPN隔離網(wǎng)關(guān)
VPN隔離網(wǎng)關(guān)抗重放功能的實(shí)現(xiàn)方式與單處理器存在較大差異。在單處理器中實(shí)現(xiàn)IPsec時(shí),處理器只需按照“抗重放判斷、合法性驗(yàn)證、窗口滑動(dòng)”的流程執(zhí)行即可。但是,在“雙ARM+FPGA”的架構(gòu)中,為了保證數(shù)據(jù)的安全性,合法性驗(yàn)證不能在外網(wǎng)主機(jī)中實(shí)現(xiàn),而應(yīng)在FPGA中實(shí)現(xiàn)。因此,需要對(duì)抗重放流程進(jìn)行改進(jìn)。
VPN隔離網(wǎng)關(guān)的抗重放功能應(yīng)按圖5所示的流程實(shí)現(xiàn)。首先,由外網(wǎng)主機(jī)對(duì)新到的數(shù)據(jù)包進(jìn)行抗重放判斷,不是重放包則將數(shù)據(jù)包發(fā)送到FPGA,否則丟棄。FPGA收到數(shù)據(jù)包后進(jìn)行解密和合法性驗(yàn)證,合法則將明文數(shù)據(jù)包發(fā)送至內(nèi)網(wǎng)主機(jī),否則丟棄。FPGA每次完成合法性驗(yàn)證后應(yīng)將結(jié)果返回外網(wǎng)主機(jī),外網(wǎng)主機(jī)根據(jù)合法性驗(yàn)證結(jié)果決定是否進(jìn)行窗口滑動(dòng)。
圖5 VPN隔離網(wǎng)關(guān)的抗重放流程
FPGA將合法性驗(yàn)證的結(jié)果返回外網(wǎng)主機(jī),有軟件通知和硬件通知兩種方式。軟件通知方式是通過外設(shè)接口向外網(wǎng)主機(jī)發(fā)送通知(數(shù)據(jù)協(xié)議幀)。這種方式的反饋信息量較大,可能帶來一定的安全隱患,但適用于SA較多的場合。硬件通知方式是通過INT引腳向外網(wǎng)主機(jī)發(fā)送通知(高低電平)。這種方式的反饋信息量小,安全性較高,但由于每個(gè)SA需一個(gè)INT引腳,需要的硬件資源較多,僅適用于SA較少的場合。
數(shù)據(jù)包是否為重放包的判據(jù)如下:
(1)當(dāng)新到數(shù)據(jù)包的序列號(hào)小于N時(shí),則判定該數(shù)據(jù)包為重放包;
(2)當(dāng)新到數(shù)據(jù)包的序列號(hào)大于等于N且小于N+k時(shí),若該序列號(hào)對(duì)應(yīng)的位圖中的bit為1,則判定該數(shù)據(jù)包為重放包;否則,判定為非重放包;
(3)當(dāng)新到數(shù)據(jù)包的序列號(hào)大于等于N+k時(shí),則判定該數(shù)據(jù)包為非重放包。
設(shè)新到數(shù)據(jù)包為非重放包,且其序列號(hào)大于滑動(dòng)窗口右側(cè)對(duì)應(yīng)的序列號(hào)(即已收最大序列號(hào))。若通過了合法性驗(yàn)證,則需按照以下步驟進(jìn)行窗口滑動(dòng)操作:
(1)計(jì)算新到數(shù)據(jù)包序列號(hào)與已收最大序列號(hào)之間的步進(jìn)距離,設(shè)為d;
(2)若d大于序列號(hào)變化閾值,則拒絕滑動(dòng)并返回;
(3)滑動(dòng)窗口左側(cè)對(duì)應(yīng)序列號(hào)N向前滑動(dòng)d,即N=N+d;
(4)位圖左移d位,并將位圖的bit31置位。
當(dāng)窗口向前滑動(dòng)時(shí),若窗口左側(cè)對(duì)應(yīng)的數(shù)據(jù)包仍未收到,則會(huì)造成丟包。以圖3中收到第N+33包為例,滑動(dòng)窗口需向前步進(jìn)2,而第N包仍未收到,因此第N包將被永久性拒收。
若密鑰協(xié)商過程被破解而造成密鑰泄漏,則攻擊者可以通過先于發(fā)送方向接收方發(fā)送數(shù)據(jù)而接管通信過程,或者不斷給接收方發(fā)送序列號(hào)較大的數(shù)據(jù)包而加快抗重放窗口的滑動(dòng),并造成大量數(shù)據(jù)包的拒收。此外,發(fā)送端因程序錯(cuò)誤造成序列號(hào)異常(如突增),也會(huì)造成數(shù)據(jù)包的拒收。為了防止序列號(hào)突變,接收方設(shè)置序列號(hào)變化閾值。若序列號(hào)變化量超過該閾值,則拒絕滑動(dòng)窗口。因此,抗重放機(jī)制的可靠性需要用安全的密鑰保護(hù)機(jī)制和健壯可靠的程序來保證。
記錄序列號(hào)的使用情況的結(jié)構(gòu)體如下:
structxfrm_replay_state{
__u32 seq;//記錄當(dāng)前序列號(hào)的值
__u32 bitmap;//位圖,如果滑動(dòng)窗口長度小于32,則使用bitmap的低位。
};
統(tǒng)計(jì)抗重放結(jié)果的結(jié)構(gòu)體如下:
structxfrm_stats{
__u32 replay_window;//丟棄的包數(shù)
抗重放判斷的源代碼如下:
本文從工程實(shí)踐的角度對(duì)Linux的IPsec抗重放攻擊的原理進(jìn)行分析和研究,提出了IPsec抗重放技術(shù)在VPN隔離網(wǎng)關(guān)中的應(yīng)用方法,設(shè)計(jì)了抗重放流程和實(shí)施細(xì)節(jié),并針對(duì)序列號(hào)突變?cè)O(shè)計(jì)了相應(yīng)的應(yīng)對(duì)機(jī)制,同時(shí)實(shí)現(xiàn)了軟件代碼。
[1] William S,唐明.密碼編碼學(xué)與網(wǎng)絡(luò)安全——原理與實(shí)踐[M].第6版.北京:電子工業(yè)出版社,2003:131-147,216-233.William S,TANG Ming.Cryptography and Network Security-Principles and Practice[M].6th ed.Beijing:Publishing House of Electronics Industry,2003:131-147,216-233.
[2] IP Authentication Header[S].RFC4302-Dec,2005.
[3] IP Encapsulating Security Payload(ESP)[S].RFC4303-Dec,2005.
[4] 孫偉峰,張琳.一種增強(qiáng)型VPN安全隔離網(wǎng)關(guān)設(shè)計(jì)與實(shí)現(xiàn)[J].中國電子科學(xué)研究院學(xué)報(bào),2015(06):628-631,651.SUN Wei-feng,ZHANG Lin.Design and Implementation of an Enhanced VPN Security Isolation Gateway[J].Journal of China Electronics Academy,2015(06):628-631,651.