(中國電子科技集團公司第三十研究所 四川 610041)
隨著網(wǎng)絡技術(shù)的發(fā)展,大部分的業(yè)務都在進行全IP 化,在工程中,基本上都要在網(wǎng)絡上傳輸業(yè)務數(shù)據(jù),如何保障網(wǎng)絡安全也顯得尤為重要。在影響網(wǎng)絡安全的因素中,重放攻擊是一個普遍、造成影響巨大的一種攻擊手段,本文探討了重放攻擊及其危害,介紹了幾種常用的抗重放攻擊方案,并對各方案進行了比較。
重放攻擊(Replay Attacks)又稱重播攻擊、回放攻擊,是指攻擊者發(fā)送一個目的主機已經(jīng)接收過的包,來達到欺騙系統(tǒng)的目的,主要用于身份認證過程,破壞認證的正確性。重放攻擊可以由發(fā)起者,也可以由攻擊者進行。
重放攻擊的危害主要有:
(1)破壞發(fā)送者和接收者之間認證的安全性;
(2)通過篡改數(shù)據(jù),導致發(fā)送者和接收者之間無法正常通信;
(3)占用接收者的資源,在強重放攻擊下,甚至會導致接收者癱瘓。
鑒于重放攻擊的嚴重危害,為了確保網(wǎng)絡通信的安全,需要采用抗重放方案抵抗重放攻擊。
抗重放方案的基本思想為:在網(wǎng)絡通信過程中,選擇一個“抗重放因子”,根據(jù)該“抗重放因子”判斷消息的新鮮性,以此識別消息是否為重放消息。常用的“抗重放因子”有時間戳、隨機數(shù)等。
在討論抗重放方案之前,有一個最重要的前提需要聲明:必須確保攻擊者無法修改“抗重放因子”,或者修改了“抗重放因子”也能夠被檢測出來,通過數(shù)字信封、完整性校驗等技術(shù)可以做到。下面介紹幾種在工程中常用的抗重放方案。
滑動窗口抗重放方案[4-5]使用滑動窗口,判斷“抗重放因子”是否有效,以確認消息是否已經(jīng)過期。在該方案中,“抗重放因子”為一個遞增的序列號,接收者應建立寬度為 W 的窗口。
初始化窗口時,窗口最左側(cè)的序列號為N,最右側(cè)的序列號為N+W-1,序列號N+1,N+2….N+W-2 均在窗口內(nèi),每收到一個消息,接收者按如下原則進行處理:
(1)如果消息的序列號在窗口內(nèi),則查詢對應序列號的標志位,如果標志位為1 表示該序列號之前接收過,為重放包,丟棄;如果標志位為0 表示從未收到過該消息,對該消息進行接收處理,并將標志位置為1;
(2)如果消息的序列號小于窗口最左側(cè)的序列號,則表示該消息不滿足新鮮性的要求,將消息丟棄;
(3)如果消息的序列號大于窗口最右側(cè)的序列號,則將窗口向右邊滑動,使得窗口的最右側(cè)序列號為該消息的序列號。
滑動窗口抗重放方案的優(yōu)點:在窗口之外的消息一定會被丟掉,并且實現(xiàn)簡單,沒有歧義,只要保證“抗重放因子”為一個遞增的序列號即可。一般來說窗口寬度W 為8,16,32,64,128 等比較小的數(shù)值,因此占用的存儲空間比較小。對無序到達的消息有一定的容忍度,比較適用于IP 網(wǎng)絡這種無序網(wǎng)絡。
滑動窗口抗重放方案的缺點:當窗口寬度值W 設置過大時,抗重放的效果不好;當窗口寬度值W 設置過小時,會導致丟包率過高,影響到正常通信。
“抗重放因子”池抗重放方案中,“抗重放因子”只要不重復即可(可以是隨機數(shù)、遞增序列號等)。在該方案中,將所有收到的序列號存儲在一個池子中,每收到一個消息,對池子進行檢索,判斷該消息中序列號是否已經(jīng)接收過。如果已經(jīng)接收過,認為該消息為重放消息,丟棄;否則,將該序列號保存在池子中。當池子滿了之后,再收到新的、池子中沒有的序列號時,用最新的序列號覆蓋池子中最早收到的序列號,循環(huán)往復。
“抗重返因子”池抗重放方案的優(yōu)點:不會因為抗重放而導致丟包。
“抗重返因子”池抗重放方案的缺點:
(1)當消息發(fā)送比較頻繁時,大量的序列號會極大消耗接收者的存儲空間;
(2)池子大小總有上限,如果攻擊者有足夠的耐心,不停進行試驗攻擊,總能探測到池子的大小。當池子滿了,舊的序列號被覆蓋后,攻擊者再將被覆蓋掉的序列號發(fā)送給接收者,接收者無法識別到這是一個重放消息。
時間戳抗重放指的是使用當前的時間作為“抗重放因子”,發(fā)送者將本地的時間TS、要發(fā)送的數(shù)據(jù)一起發(fā)送給接收者,接收者將收到的時間TS 與自己本地時間TR 進行比較,如果DeltT=TR-TS 在一個可接受的延時范圍內(nèi)(DeltT 時間戳抗重放方案的優(yōu)點:接收者不用存儲任何“抗重放因子”,不占用存儲空間;同時時間戳獲取方式簡單。 遞增抗重放方案的缺點: (1)需要提供嚴格的時鐘同步機制,否則會導致發(fā)送者和接收者的時間不一致,而導致誤判; (2)如果t 選擇過大,會導致有一些重放消息無法識別,t 選擇過小,會導致很嚴重的丟包。因此對t 的設置,需要很豐富的經(jīng)驗。 針對時間戳抗重放方案需要嚴格的時鐘同步機制的缺陷,有人做了改進[2],該改進方案不需要時鐘同步,具體過程如圖1: 圖1 具體過程 (1)發(fā)送者發(fā)起請求; (2)接收者將本地時間TR 發(fā)送給發(fā)送者; (3)發(fā)送者將T’=TR+t(t 為發(fā)送者從“發(fā)起請求”到“收到TR”的時延)、要發(fā)送的數(shù)據(jù)Data 一起發(fā)送給接收者; (4)接收者收到消息后,將T’和當前的本地時間TR’做比較,如果DeltT=TR’-T’在一個可接受的延時范圍內(nèi),那么就認為是合法消息,否則認為是重放包,將消息丟棄。 遞增抗重放方案中“抗重放因子”為一個遞增的序列號,該方案僅可用于一問一答式的通信中,當發(fā)送者收到本次發(fā)送消息的回復后,才會繼續(xù)發(fā)送下一個消息。初始化時,發(fā)送者發(fā)送的序列號一定大于0,接收者本地存儲的序列號置為0;當接收者收到消息后,判斷消息中序列號的值是否大于本地存儲的序列號(網(wǎng)絡上有丟包),如果是,則接收、處理消息并將本地存儲的序列號更新為當前接收到的序列號,否則認為是重放消息,丟棄。 遞增抗重放方案的優(yōu)點:接收者只存儲一個序列號,不占用存儲空間,并且判斷抗重放的邏輯簡單,計算簡單,時間短,維護也很簡單。同時由于序列號是遞增的,并且發(fā)送者收到某一個消息的回復后,才會繼續(xù)發(fā)送下一個消息,因此接收者能夠統(tǒng)計網(wǎng)絡上的丟包情況。 遞增抗重放方案的缺點:序列號不能進行翻轉(zhuǎn),因此只能適用于通信量比較少的情況。當序列號遞增到最大值時,該通道必須斷開,重新進行通道連接,序列號從頭重新開始遞增。 挑戰(zhàn)—應答身份認證抗重放方案中“抗重放因子”為一個隨機數(shù),該方案的交互過程如下: (1)發(fā)送者向接收者發(fā)起一個請求; (2)接收者收到請求后在本地產(chǎn)生一個隨機數(shù)R,接收者將隨機數(shù)R 發(fā)送給發(fā)送者; (3)發(fā)送者收到R 后,將要發(fā)送的數(shù)據(jù)Data 和R’(R’=R)一起發(fā)送給接收者; (4)接收者收到后,將R’和本地保存R 做比較,如果一致,則說明不是重放消息,同時產(chǎn)生新的隨機數(shù)R’’;如果不一致,說明是重放消息,因為隨機數(shù)已經(jīng)變?yōu)镽’’,R’必然與R’’不一致,直接丟棄。 挑戰(zhàn)—應答身份認證抗重放方案的優(yōu)點:接收者只存儲一個隨機數(shù),不占用存儲空間也不需要與發(fā)送者進行時鐘同步,并且判斷抗重放的邏輯簡單,計算簡單,時間短,維護也很簡單。 挑戰(zhàn)—應答身份認證抗重放方案的缺點:占用信道資源多,每次通信前均要進行一次挑戰(zhàn)—應答。 針對該方案的缺陷,有人提出了一些改進方案,本文介紹其中的一種改進方案[1],其核心方法是第一次發(fā)生了挑戰(zhàn)—應答之后,隨機數(shù)在雙方同時更新,不需要再進行挑戰(zhàn)—應答,過程如圖2 所示: 圖2 具體過程 各抗重放方案比較見表1。 表1 方案比較 在工程使用中必須注意以下事項,否則會導致抗重放方案失效: (1)“抗重放因子”在允許的范圍內(nèi)不能重復,否則會導致的消息被誤判為重放消息,進而丟棄,發(fā)生丟包,正常通信失敗。 (2)發(fā)送者在發(fā)出消息之前,需要對“抗重放因子”進行加密或者完整性校驗,防止“抗重放因子”在傳輸過程中被篡改而接受者卻無法得知“抗重放因子”被篡改; (3)接收者收到消息后,首先進行完整性校驗,確?!翱怪胤乓蜃印睕]有被篡改,再根據(jù)“抗重放因子”進行抗重放判斷。 通過對各常用的抗重放方案的比較可以得出:各抗重放方案均有自己的優(yōu)點及缺點,在工程使用中,可以根據(jù)應用場景的不同選擇適合的抗重放方案。4.4 遞增抗重放方案
4.5 挑戰(zhàn)—應答身份認證抗重放方案
5 各抗重放方案比較
6 在工程實現(xiàn)中需注意事項
7 總結(jié)