網絡安全:與 TCP 連接管理相關的網絡攻擊

目錄

攻擊方法1:SYN 泛洪

攻擊方法2:影響路徑最大傳輸單元

攻擊方法3:破壞現有的TCP連接

攻擊方法4:欺騙攻擊


攻擊方法1:SYN 泛洪

SYN 泛洪是一種 TCP 拒絕服務攻擊在這種攻擊中一個或多個惡意的客戶端產生一系列 TCP 連接嘗試( SYN 報文段)並將它們發送給一臺服務器它們通常採用 "僞造" 的源 IP 地址。服務器會爲每一條 TCP 連接分配一定數量的連接資源。由於連接尚未完全建立服務器爲了維護大量的半打開連接會在耗盡自身內存後拒絕爲後續的合法連接請求服務。

因爲區分合法的連接嘗試與 SYN 泛洪並不是一件容易的事情所以抵禦上述攻擊存在一定的難度。一種針對此問題的機制被稱作SYN cookies [RFC4987]SYN cookies 的主要思想是當一個 SYN 到達時這條連接存儲的大部分信息都會被編碼並保存在SYN + ACK 報文段(第二次握手)的序列號字段。採用 SYN cookies 的目標主機不需要爲進的連接請求分配任何存儲資源——只有當 SYN + ACK 報文段本身被確認後(並且已返回初始序列號)纔會分配真正的內存。在這種情況下所有重要的連接參數都能夠重新獲得同時連接也能夠被設置爲 ESTABLISHED 狀態。

在執行 SYN cookies 過程中需要服務器仔細地選擇 TCP 初始序列號。本質上服務器必須將任何必要的狀態編碼並存於 SYN + ACK 報文段的序列號字段。這樣一個合法的客戶端會將其值作爲報文段的 AC號字段返回給服務器。很多方法都能夠完成這項工作下面將具體介紹 Linux 系統所採用的技術

服務器在接收到一個 SYN 後會採用下面的方法設置初始序列號的數值首 5 位是 模 32 的結果其中 t 是一個 32 位的計數器每隔 64 秒增 1接着 3 位是對服務器最大段大小的編碼值剩餘的 24 位保存了 4 元組與 值的散列值。該數值是根據服務器選定的散列加密算法計算得到的。

在採用 SYN cookies 方法時服務器總是以一個 SYN + ACK 報文段作爲響應(符合任何典型的 TCP 連接建立過程)。在接收到 ACK 後如果根據其中的 值可以計算出與加密的散列值相同的結果那麼服務器纔會爲該 SYN 重新構建隊列。這種方法至少有兩個缺陷。首先由於需要對最大段大小進行編碼這種方法禁止使用任意大小的報文段。其次由於計數器會迴繞連接建立過程會因週期非常長(長於64秒)而無法正常工作。基於上述原因這一功能並未作爲默認設置。

 

攻擊方法2:影響路徑最大傳輸單元

另一種攻擊方法與路徑最大傳輸單元發現過程相關。在這種攻擊中攻擊者僞造一個 ICMP PTB 消息(需要進行分片但設置了不分片位)。該消息包含了一個非常小的 MTU 值(例如68字節)。這樣就迫使受害的 TCP 嘗試採用非常小的數據包來填充數據從而大大降低了它的性能。

最強力的攻擊方法是簡單地禁用主機的路徑最大傳輸單元發現功能。當接收到的 ICMP PTB 消息的下一跳最大傳輸單元小於 576字節時其他選項會禁用路徑最大傳輸單元發現功能。Linux 一個系統的選項,例如:ifconfig ppp0 mtu 288。該選項會保持最小的數據包大小(爲了 TCP 的大數據包)。如果該選項被固定爲某一數值那麼較大的數據包則不能將 IPv4 的 DF 位置位。這種方雖然比完全禁用路徑最大傳輸單元發現功能更具攻擊性

 

TCP的路徑最大傳輸單元發現

路徑最大傳輸單元(MTU)是指經過兩臺主機之間路徑的所有網絡報文段中最大傳輸單元的最小值。知道路徑最大傳輸單元后能夠有助於一些協議(比如 TCP )避免分片。有興趣的可以看看基於 ICMP 消息的路徑最大傳輸單元發現(PMTUD)過程,但由於應用程序已經指定了尺寸(即非傳輸層協議) UDP 協議一般不會採用上述發現過程獲得的數據報大小TCP 在支持字節流抽象的實現過程中能夠決定使用多大的報文段因此它很大程度上控制了最後生成的IP數據包。

TCP 常規的路徑最大傳輸單元發現過程如下:在一個連接建立時TCP 使用對外接口的最大傳輸單元的最小值或者根據通信對方聲明的最大段大小來選擇發送方的最大段大小(SMSS)。路徑最大傳輸單元發現不允許 TCP 發送方有超過另一方所聲明的最大段大小的行爲。如果對方沒有指明最大段大小的數值,發送方將假設採用默認的 536 字節但是這種情況比較少見。如果爲每一個目的地保存對應的路徑最大傳輸單元那麼就能方便地對段大小進行選擇。值得注意的是一條連接的兩個方向的路徑最大傳輸單元是不同的。

一旦爲發送方的最大段大小選定了初始值 TCP 通過這條連接發送的所有 IPv4 數據報都會對 DF 位字段進行設置TCP/IP 沒有 DF 位字段因此只需要假設所有的數據報都已經設置了該字段而不必進行實際操作。如果接收到 PTB 消息 TCP 就會減少段的大小然後用修改過的段大小進行重傳。如果在 PTB 消息中已包含了下一跳推薦的最大傳輸單元段大小的數值可以設置爲下一跳最大傳輸單元的數值減去 IPv4 (或IPv6 )與 TCP 頭部的大小。如果下一跳最大傳輸單元的數值不存在(例如一個之前的 ICMP 錯誤被返回時會缺乏這一信息)發現者可能需要嘗試多個數值(例如採用二分搜索法選擇一個可用的數值)。這也會影響到 TCP 的擁塞控制管理。對於分組層路徑最大傳輸單元發現而言除了 PTB 的消息不被使用以外其他情況基本類似。相反執行路徑最大傳輸單元發現的協議必須能夠快速地檢測消息丟棄並調整自已的數據報大小。

由於路由是動態變化的在減少段大小的數值一段時間後需要嘗試一個更大的數值(接近初始的發送方最大段大小)。根據 [RFCl191] 與 [RFC1981] 的指導意見,該時間間隔大約爲 10 分鐘。

在互聯網環境中由於防火牆阻塞 PTB 消息 [RFC2923] 路徑最大傳輸單元發現過程會存在一些問題。在種操作問題黑洞問題的情況雖有所好轉(在[LSlO]中80%被調查的系統都能夠正確地處理 PTB 消息)但仍懸而未決。在 TCP 實現依靠傳輸 ICMP 消息來調整它的段大小的情況下如果 TCP 從未接收到任何 ICMP 消息那麼在路徑最大傳輸單元發現過程中就會造成黑洞問題。這種情況可能由多方面的原因造成其中包括了防火牆或 NAT 配置爲禁止轉發 ICMP 消息。其後果在於一旦 TCP 使用了更大的數據包將不能被正確處理。由於只是不能轉發大數據包所以診斷出這一問題是十分困難的。那些較小的數據包(比如用於建立連接的 SYN 與 SYN +ACK 數據包)是能夠成功處理的。一些 TCP 實現具有 "黑洞探測" 功能。當一個報文段在反覆重傳數次後將會嘗試發送一個較小的報文段

 

攻擊方法3:破壞現有的TCP連接

另一種類型的攻擊涉及破壞現有的 TCP 連接甚至可能將其劫持(hijacking)。這一類攻擊通常包含的第一步是使兩個之前正在通信的 TCP 節點 "失去同步" 。這樣它們將使用不正確的序列號。它們是序列號攻擊的典型例子 [RFC1948] 。至少有兩種方法能實現上述攻擊:在連接建立過程中引發不正確的狀態傳輸在 ESTABLISHED 狀態下產生額外的數據。一旦兩端不能再進行通信(但卻認爲它們間擁有一個打開的連接)攻擊者就能夠在連接中注新的流量而且這些注的流量會被 TCP 認爲是正確的。

 

攻擊方法4:欺騙攻擊

有一類攻擊被稱作欺騙攻擊。這類攻擊所涉及的 TCP 報文段是由攻擊者精心定製的,目的在於破壞或改變現有 TCP 連接的行爲。在 [RFC4953] 中大量討論了此類攻擊及它們的防治技術。攻擊者可以生成一個僞造的重置報文段並將其發送給一個 TCP 通信節點。假定與連接相關的 4 元組以及校驗和都是正確的序列號也處在正確的範圍。這樣就會造成連接的任意一端失敗。隨着互聯網變得更快爲了維持性能被認爲 "處於窗口" 的序列號範圍也在不斷地擴大上述攻擊也受到越來越多的關注。欺騙攻擊還存在於其他類型的報文段(SYN甚至 ACK )中(有時會與泛洪攻擊結合使用)引發大量的問題。相關的防禦技術包括認證每一個報文段(例如使用 TCP-A選項) 要求重置報文段擁有一個特殊的序列號以代替處於某一範圍的序列號要求時間戳選項具有特定的數值使用其他形式的 cookie 文件讓非關鍵的數據依賴於更加準確的連接信息或一個祕密數值。

欺騙攻擊雖然不是 TCP 協議的一部分但是能夠影響 TCP 的運行。例如 ICMP 協議能夠被用於修改路徑最大傳輸單元的發現行爲。它也能夠被用於指出一個端口號或一臺主機已失效,從而終止一個 TCP 連接。 [RFC5927] 介紹了大量的此類攻擊並且還提出了一些防禦 ICMP 欺騙消息、提高魯棒性的方法。這些建議不僅侷限於驗證 ICMP 消息而且還涉及其可能包含的 TCP 報文段。例如包含的報文段應該擁有正確的 4 元組與序列號

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章