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

5 各抗重放方案比較


6 在工程實現中需注意事項
7 總結