syn cookie

syn cookie

SYN Cookie是對TCP伺服器端的三次握手協定作一些修改,專門用來防範SYN Flood攻擊的一種手段。它的原理是,在TCP伺服器收到TCP SYN包並返回TCP SYN+ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。在收到TCP ACK包時,TCP伺服器在根據那個cookie值檢查這個TCP ACK包的合法性。如果合法,再分配專門的數據區進行處理未來的TCP連線。

基本介紹

  • 中文名:syn cookie
  • 類別:DoS攻擊方式的防範手段
  • 防範對象:SYN Flood
  • 防範原理:修改TCP伺服器端的三次握手協定
介紹,攻擊,原理,實現,缺陷,安全考量,歷史,

介紹

SYN Flood是一種非常危險而常見的DoS攻擊方式。到目前為止,能夠有效防範SYN Flood攻擊的手段並不多,SYN Cookie就是其中最著名的一種。

攻擊

SYN Flood攻擊是一種典型的拒絕服務型(Denial of Service)攻擊。所謂拒絕服務型攻擊就是通過進行攻擊,使受害主機或網路不能夠良好的提供服務,從而間接達到攻擊的目的。
SYN Flood攻擊利用的是IPv4中TCP協定的三次握手(Three-Way Handshake)過程進行的攻擊。TCP協定規定,一端向另一端發起TCP連線時,它需要首先傳送SYN 包到對方,對方收到後傳送一個SYN+ACK包回來,發起方再傳送 ACK包回去,這樣三次握手就結束了。我們把TCP連線的發起方叫作"TCP客戶機(TCP Client)",TCP連線的接收方叫作"TCP伺服器(TCP Server)"。值得注意的是在TCP伺服器收到TCP SYN request包時,在傳送TCP SYN+ACK包回TCP客戶機前,TCP伺服器要先分配好一個數據區專門服務於這個即將形成的TCP連線。一般把收到SYN包而還未收到ACK包時的連線狀態稱為半開連線(Half-open Connection)。
在最常見的SYN Flood攻擊中,攻擊者在短時間內傳送大量的TCP SYN包給受害者,這時攻擊者是TCP客戶機,受害者是TCP伺服器。根據上面的描述,受害者會為每個TCP SYN包分配一個特定的數據區,只要這些SYN包具有不同的源地址(這一點對於攻擊者來說是很容易偽造的)。這將給TCP伺服器系統造成很大的系統負擔,最終導致系統不能正常工作。

原理

SYN Cookie是對TCP伺服器端的三次握手協定作一些修改,專門用來防範SYN Flood攻擊的一種手段。它的原理是,在TCP伺服器收到TCP SYN包並返回TCP SYN+ACK包時,不分配一個專門的數據區,而是根據這個SYN包計算出一個cookie值。在收到TCP ACK包時,TCP伺服器在根據那個cookie值檢查這個TCP ACK包的合法性。如果合法,再分配專門的數據區進行處理未來的TCP連線。

實現

發起一個 TCP 連線時,客戶端將一個 TCP SYN 包傳送給伺服器。作為回響,伺服器將 TCP SYN + ACK 包返回給客戶端。此數據包中有一個序號,它被 TCP 用來重新組裝數據流。根據 TCP 規範,由端點傳送的第一個序號可以是由該端點決定的任何值。SYN Cookies 是根據以下規則構造的初始序號:
  • t為一個緩慢遞增的時間戳(通常為time()>>6,提供 64 秒的解析度);
  • m為伺服器會在 SYN 佇列條目中存儲的最大分段大小(Maximum segment size);
  • s為一個加密散列函式對伺服器和客戶端各自的 IP 地址和連線埠號以及t進行運算的結果。返回得到的數值s必須是一個24位值。
初始 TCP 序號,也就是所謂的SYN cookie,按照如下算法得到:
  • 頭五位:tmod32;
  • 中三位:m編碼後的數值;
  • 末24位:s本身;
註:由於m必須用 3 位進行編碼,伺服器在啟用了 SYN Cookie 時只能為m傳送八種不同的數值。
根據 TCP 規範,當客戶端發回 TCP ACK 包給伺服器以回響伺服器的 SYN + ACK 包時,客戶端必須使用由伺服器傳送的初始序號加1作為數據包中的確認號。伺服器接著從確認號中減去 1 以便還原向客戶端傳送的原始 SYN Cookie。
接下來伺服器進行以下檢查:
  • 配合現在時間t來檢查連線是否過期。
  • 重新計算s來確認這是不是一個有效的 SYN Cookie。
  • 從 3 位編碼中解碼m,以便之後用來重建 SYN 佇列條目。在此之後,連線照常進行。

缺陷

SYN Cookies 的使用不與任何協定定義衝突,照理來說它該和所有的 TCP 實現兼容。然而,當 SYN Cookies 使用的時候,會發生兩種值得注意的變化:首先,伺服器只能編碼八種 MSS 數值,因為只有 3 位二進制空間可用。其次,這個伺服器必須拒絕所有的TCP 選用項,例如大型視窗和時間戳,因為伺服器會在信息被用其他方式存儲時丟棄 SYN 佇列條目。
儘管這些限制將不可避免地導致一個不如最佳的體驗,它們的效果很少被客戶端注意到——這些改變只在被攻擊時值得注意。在這樣的情況下,犧牲 TCP 選項來保護連線一般被認為是合乎情理的。
Linux核心從 2.6.26 版本開始為 TCP 選用項加入了有限的支持,通過把它們編碼在時間戳內實現。
較新的TCP Cookie 傳輸(TCPCT)標準被設計用來克服 SYN Cookies 的這些問題,並且在各種方面改進這套機制。不像 SYN Cookies,TCPCT 是一個 TCP 拓展並且要求兩端點都支持 TCPCT。

安全考量

被設定為允許所有出站連線但對入站連線有限制(例如在 Web 伺服器上只允許 80 連線埠)的簡單防火牆一般是這樣實現的:只阻斷不必要連線埠的 SYN 請求。如果 SYN Cookies 被啟動了,應當小心以保證攻擊者不能使用偽造 ACK、嘗試隨機序列號的方式來繞過這樣的防火牆。因此 SYN cookies 應該按照每個連線埠單獨處理的方式來調節開關,這樣的話一個公共連線埠上的 SYN Cookies 並不會在一個私有連線埠上被認可。

歷史

Daniel J. Bernstein和Eric Schenk於 1996 年九月創造了這個技術。Jeff Weisberg在一個月後發布了最早的實現(在SunOS上),Eric Schenk隨後在 1997 年二月發布了他的Linux實現(目前的實現使用,例如net.ipv4.tcp_syncookies)。

相關詞條

熱門詞條

聯絡我們