【Linux】TCP SYN泛洪攻擊
儘管這種攻擊已經出現了十四年,但它的變種至今仍能看到。雖然能有效對抗SYN洪泛的技術已經存在,但是沒有對於TCP實現的一個標準的補救方法出現。你可以在如今的作業系統和裝置中找到保護應用層和網路層的不同解決方案的不同實現。本篇論文詳細描述這種攻擊並展望和評估現在應用於終端主機和網路裝置的對抗SYN洪泛方法。
1 基本的漏洞
SYN洪泛攻擊首次出現在1996年。當時Phrack雜誌中描述了這種攻擊並用程式碼實現了它[1]。這些資訊被迅速應用於攻擊一個網路服務提供商(ISP)的郵件和Telnet服務,並造成了停機。CERT(Computer Emergency Response Team)不久就釋出了對於這種攻擊技術的初步評估與解決方案[2]。
SYN洪泛攻擊的基礎是依靠TCP建立連線時三次握手的設計。第三個資料包驗證連線發起人在第一次請求中使用的源IP地址上具有接受資料包的能力,即其返回是可達的。圖1顯示了一次普通的TCP連線開始時交換資料包的過程。
TCB(TCP 傳輸控制塊)是一種包含一個連線所有資訊的傳輸協議資料結構(實際上在許多作業系統中它是用於處理進站(inbound)連線請求的一個佇列,該佇列儲存那些處於半開放(half-open)狀態的TCP連線專案,和已建立完整連線但仍未由應用程式通過accept()呼叫提取的專案)。一個單一的TCB所佔記憶體大小取決於連線中所用的TCP選項和其他一些功能的實現。通常一個TCB至少280位元組,在某些作業系統中已經超過了1300位元組。TCP的SYN-RECEIVED狀態用於指出這個連線僅僅是半開連線,請求是否合法仍被質疑。這裡值得注意的一個重要方面就是TCB分配空間的大小取決於接收的SYN包——在連線被完全建立或者說連線發起人的返回可達性被證實之前。
這就導致了一個明顯潛在的DoS攻擊,到達的SYN包將被分配過多的TCB而導致主機的核心記憶體被耗盡。為了避免這種記憶體耗盡,作業系統通常給監聽介面關聯了一個"backlog"佇列引數,它同時維護連線的TCB上限數量和SYN-RECEIVED狀態。儘管這種方案使主機的可用記憶體免遭攻擊,但是backlog佇列本身就帶來了一個(小的)受攻擊源。當backlog中沒有空間時,就不可能再響應新的連線請求,除非TCB能被回收或者從SYN-RECIEVE狀態中移除。
試圖傳送足夠多的SYN包而耗盡backlog是TCP SYN洪泛的目的。攻擊者在SYN包中加入源IP地址,這樣就不會導致主機將已分配的TCB從SYN-RECEVIED狀態佇列中移除(因為主機將響應SYN-ACK)。因為TCP是可靠的,目的主機在斷開半開連線並在SYN-RECIEVED佇列中移除TCB之前將等待相當長的時間。在此期間,伺服器將不能響應其他應用程式合法的新TCP連線請求。圖2顯示了簡單的TCP SYN洪泛攻擊的過程。
圖3顯示了目前網路中檢測到的一些SYN攻擊變種。
2 直接攻擊
如果攻擊者用他們自己的沒有經過偽裝的IP地址快速地傳送SYN資料包,這就是所謂的直接攻擊。這種攻擊非常容易實現,因為它並不涉及攻擊者作業系統使用者層以下的欺騙或修改資料包。例如,他可以簡單地傳送很多的TCP連線請求來實現這種攻擊。然而,這種攻擊要想奏效攻擊者還必須阻止他的系統響應SYN-ACK包,因為任何ACK、RST或ICMP(Internet Control Message Protocol)包都將讓伺服器跳過SYN-RECEIVED狀態(進入下一個狀態)而移除TCB(因為連線已經建立成功或被回收了)。攻擊者可以通過設定防火牆規則來實現,讓防火牆阻止一切要到達伺服器的資料包(SYN除外),或者讓防火牆阻止一切進來的包來使SYN-ACK包在到達本地TCP處理程式之前就被丟棄了。
一旦被檢測到,這種攻擊非常容易抵禦,用一個簡單的防火牆規則阻止帶有攻擊者IP地址的資料包就可以了。這種方法在如今的防火牆軟體中通常都是自動執行的。
3 欺騙式攻擊
SYN洪泛攻擊的另一種方式是IP地址欺騙。它比直接攻擊方式更復雜一點,攻擊者還必須能夠用有效的IP和TCP報文頭去替換和重新生成原始IP報文。如今,有很多程式碼庫能夠幫助攻擊者替換和重新生成原始IP報文。
對於欺騙式攻擊,首先需要考慮的就是選擇地址。要使攻擊成功,位於偽裝IP地址上的主機必須不能響應任何傳送給它們的SYN-ACK包。攻擊者可以用的一個非常簡單的方法,就是僅需偽裝一個源IP地址,而這個IP地址將不能響應SYN-ACK包,或許因為這個IP地址上根本就沒有主機,或許因為對主機的地址或網路屬性進行了某些配置。另一種選擇是偽裝許多源地址,攻擊者會假想其中的一些偽裝地址上的主機將不會響應SYN-ACK包。要實現這種方法就需要迴圈使用伺服器希望連線的源IP地址列表上的地址,或者對一個子網內主機做相同的修改。
如果一個源地址被重複地偽裝,這個地址將很快被檢測出來並被過濾掉。在大多數情況下運用許多不同源地址偽裝將使防禦變得更加困難。在這種情況下最好的防禦方法就是儘可能地阻塞源地址相近的欺騙資料包。
假設攻擊者是在一個“互聯”的網路中(例如一個自治系統(Autonomous System)),由其ISP限制攻擊者所在網路流量的輸入輸出過濾將能夠制止這種欺騙攻擊——如果這種方法能被機構部署到正確位置的話。這種流量輸入輸出過濾的防禦方式將限制一些合法的通訊,比如移動IP三角路由運作模式,因此不可能被普遍部署。IP安全協議(IPsec)同樣也提供了一種抵禦欺騙包的優秀方式,但是這協議因為部署限制還不能被使用。由於對於伺服器方通常不可能要求連結發起人的ISP去實施地址過濾或者要求其使用IP安全協議,因此抵禦這種用多地址偽裝的欺騙攻擊還需要更加複雜的解決方案,將在後文討論到。
4 分散式攻擊
對於單個運用欺騙式攻擊的攻擊者真正的限制因素是如果這些偽裝資料包能夠以某種方式被回溯到其真正的地址,攻擊者將被簡單地擊敗。儘管回溯過程需要一些時間和ISP之間的配合,但它並不是不可能的。但是攻擊者運用在網路中主機數量上的優勢而發動的分散式SYN洪泛攻擊將更加難以被阻止。如圖3所示,這些主機群可以用直接攻擊,也可以更進一步讓每臺主機都運用欺騙攻擊。
如今,分散式攻擊才是真正可行的,因為罪犯擁有數以千計的主機供他來進行拒絕服務(DoS)攻擊。由於這些大量的主機能夠不斷地增加或減少,而且能夠改變他們的IP地址和其連線,因此要阻止這類攻擊目前還是一個挑戰。
5 攻擊的一些引數
SYN洪泛攻擊能夠比一般的僅僅是向目標網路傳送大量資料包的蠻力DoS攻擊用更少的資料包進行攻擊。但是這需要對伺服器的作業系統有一定了解,比如它分配了多少的backlog佇列空間,在超時並丟棄TCB前它會將TCB在SYN-RECIEVED狀態裡保持多久。例如,攻擊者可以傳送剛好是backlog佇列大小的一定數量的SYN包,並且其週期剛好是TCB被回收的時間,這樣就可以讓伺服器永遠不可用。
最近的一些系統基本都是預設backlog大小為1024位元組,但是網路上的很多伺服器都將其配置為128位元組或更少。通常重傳SYN-ACK的時間閾值時5秒,是通常成功接收時間的兩倍,預設超時時間是3秒,在第一個SYN-ACK發出到其TCB被回收的時間是189秒。
6 網路終端的對策
6.1增加TCP backlog佇列
由於其基本攻擊原理是依賴於終端主機連線套接字的backlog溢位,因此一個顯然的基於終端主機的解決方案是增加backlog佇列大小,而且這種方法已經廣泛的運用於大多數伺服器了。增加backlog佇列通常是通過修改應用的listen()函式呼叫和一個作業系統核心引數SOMAXCONN——它用於設定一個應用程式能夠接收的backlog上限值。這種方法本身並不能被完全認為是抵禦SYN洪泛的有效方法,即使在一些能夠有效支援超大backlog佇列分配的作業系統中,因為攻擊者能夠任意生成比其作業系統支援的backlog還大得多的資料報。
6.2減少SYN-RECEIVED的時間
另一個基於終端主機的解決方法是縮短一個TCB從進入SYN-RECEIVED狀態到因未進入下一個狀態而被回收之間的時間。但這個方案的一個明顯缺點是攻擊可以利用因擁塞而丟包的ACK-SYN或者握手完成的ACK包,這樣合法連線的TCB就會由於主機忙於重傳這些包(因為SYN-RECEIVED時間減少)而被回收。此外,在管理員減少SYN-RECEIVED狀態時間多少和攻擊者的發包率之間僅僅是一個線性關係而已。基於上述原因,此方案並不建議採用。
6.3 SYN快取
另外兩種方案是基於SYN快取和SYN cookies(見6.4)的,簡化因接收SYN而生成TCB時初始化的狀態,推遲全狀態的例項化[4]。在採用SYN快取的主機中,一個帶有被限制大小的HASH表空間被用於存放那些將被分配給TCB的資料的一個子集。如果當握手完成的ACK接收到了,這些資料將被複制到一個完整的TCB中,否則超出存活時間的HASH值將會在需要時被回收。在Lemon的FreeBSD中,對於一個半開連線的SYN快取是160位元組,而一個完整的TCB是736位元組,並且支援15359個SYN快取空間。
SYN快取的資料結構對於那些試圖讓HASH表空間溢位的攻擊者是健壯的。因為在其HASH值裡面包含了對方的埠號和一些密碼位元。由於堆疊相對於連結串列是一種更加高效的資料結構,因此堆疊被用於SYN快取以提高速度。在Lemon的測試中,處於活躍攻擊下的主機用SYN快取能夠建立連線且僅僅比正常時間延緩了15%的時間。
6.4 SYN Cookies
對比SYN快取的方法,SYN Cookies技術做到了接收到一個SYN時完全不需要分配空間。因為構成連線狀態的最基本資料都被編碼壓縮排SYN-ACK的序列號位元位裡了。對於一個合法連線,伺服器將收到一個帶有序列號(其實序列號已經加1)的ACK報文段,然後基本的TCB資料將被重新生成,一個完整的TCB通過解壓確認資料將被安全的例項化。這種解壓即使在重度攻擊下仍然能夠成功,因為在主機端根本沒有任何儲存負載,只有計算編碼資料到ACK序列號中的負載。其不足之處就是,不是所有的TCB資料都能新增到32位的序列號段中,所以一些高效能要求的TCP選項將不能被編碼。其另一個問題是這樣的SYN-ACK報文段將不能被轉發(因為轉發需要完整的狀態資料)。
Andre Oppermann最近的一些研究是運用TCP時間戳選項結合序列號欄位編碼更多的狀態資訊,儲存那些高效能選項的應用,比如TCP視窗大小,TCP選擇性確認選項(TCP Selective Acknowledgment Options )以及TCP MD5摘要對SYN cookies的支援。這使SYN Cookies向前邁進了一步,他消除了之前SYN cooikes實現不能支援這些功能的缺陷。
TCP SYN cookies 的規範格式並不涉及互操作性問題,因為它們僅在本地被處理,對於生成和驗證的規範和過程在不同實現中會稍有不同。
6.4.1 SYN cookies的生成
為了在使用SYN cookies時計算出SYN-ACK序列號(就是SYN cookies),主機首先要結合一些本機的密碼位元,一個包括IP地址和TCP埠號的資料結構,SYN初始序列號,和一些標識密碼位元的索引資料。在所有上述位元組之上生成一個MD5摘要,然後一些位元位從hash值裡被截斷以便將其放入到SYN-ACK序列號中。由於序列號的大小大約是全部hash值的四分之一,因此這種截斷是必要的,但是通常驗證的時候至少要用3位元組大小的hash位元位,這意味著在不知道密碼位元位的情況下仍然有將近2^24種可能性去猜測驗證cookies。為了將hash值傳送出去,cookies的一些位元位將使SYN包含的MSS(最大報文段長度)的上限值變小,並影響在hash值中標識本機密碼位的索引位。
6.4.2 SYN cookies的驗證
為了驗證SYN cookies,首先要將收到的ACK報文段中的確認號減1以便重新生成SYN cookies。對於這些已被截斷過的hash位驗證值的計算是基於雙方IP地址,埠號,序列號減1和與cookie中索引號對應的密碼池中的值。如果被計算出來的這些值與cookie中的值相同,此時TCB才初始化並開始建立連線。被編碼的MSS上界被用來設定一個不超過最初值的合理大小的MSS值。MSS通常由3個位元位來實現,這三個位元位對應8個由一般鏈路的MTU(最大傳輸單元)和乙太網頭部計算出的MSS值。
6.5混合方式
混合方式將上述的兩種或更多防禦方法聯合起來使用。例如,一些終端機作業系統同時實現了一個超大backlog佇列和SYN cookies,但是僅僅當backlog的大小超過一定閾值時SYN cookies才被使用,這樣就能在不涉及SYN cookies缺點的情況下正常使用,也允許在遭受攻擊時轉移到SYN-cookies防禦。
7 基於網路的對策
7.1過濾
網路層最基本的防禦是RFC 2827[3]裡描述的過濾應用。採用輸入源過濾,ISP拒絕將一個源IP地址不屬於其來源子網的包進行更遠的路由。輸入源過濾能夠有效地阻止用IP偽裝的SYN洪泛攻擊。然而這種方法在目前是沒用的,因為其很難大規模部署。而且輸入源過濾同樣不能抵禦分散式攻擊。
7.2防火牆與代理
一個有防火牆或者代理的裝置在網路中就能夠通過兩種方法緩衝SYN洪泛攻擊,一種是對連線發起人偽裝SYN-ACK包,另一種是對伺服器偽裝ACK包[5]。
如果連線發起人是合法的,防火牆/代理就會收到ACK,然後在它自己和伺服器之間建立連線並偽裝連線發起人的地址。防火牆/代理將連線雙方分割開。這種分割能夠抵禦SYN洪泛攻擊,因為伺服器方根本沒接受收過攻擊者的SYN。只要防火牆/代理實現了一些基於TCP的防禦策略,比如SYN cookies或SYN 快取,他就能夠保護所有在其後面的伺服器免於SYN洪泛攻擊。
另一種是響應SYN-ACK的偽裝ACK包通過防火牆/代理到達伺服器。這種偽裝防止伺服器的TCB一直停留在SYN-RECEIVED狀態,因此保證了backlog佇列中的空餘空間。防火牆/代理將會停留等待一段時間,如果連線發起人正確的ACK沒有被檢測到,它將會通過偽裝的TCP RET報文使伺服器釋放TCB。對合法的連線,資料包流能夠在沒有防火牆/代理的影響下繼續進行。這種方法相比於上面偽裝SYN-ACK的方法更具吸引力,因為當合法連線建立以後防火牆/代理不需要直接參與到連線中去。
8 活動監視器
活動監視器是一種能夠檢測並干預發往伺服器的流量的裝置,跟像防火牆一樣,它並不是網路路由中必須的裝置。一種典型的監視器會像7中的ACK偽裝的防火牆/代理一樣,擁有一個附加的能力,就是如果它發現SYN包來源於它知道的攻擊者源地址就會立刻傳送偽裝RST包給伺服器。活動監視器因其便宜容易部署(相比於基於防火牆和輸入源過濾的方案)而具有實用性,而且仍然能夠保護整個伺服器網路而不需要每臺伺服器作業系統都實現一個基於終端的解決方案。
9 SYN洪泛與相關一些攻擊的比較
除了SYN洪泛,通過在TCP已建立的連線中偽裝源IP地址和連線引數的一些其他攻擊也是可能的。如果攻擊者能夠推測到雙方的IP地址,TCP埠號和合法的序列號,就能通過重置或修改惡意資料而破壞連線。除了偽裝TCP報文段,偽裝ICMP資料包同樣也能終止一個TCP連線。
不管是這些攻擊還是SYN洪泛,其目標都是受害者的TCP應用程式,而且能夠用比蠻力洪泛資料包方法小的多的代價來中斷受害者的服務。然而,SYN洪泛與其他TCP欺騙攻擊相比有很大的不同。SYN洪泛攻擊新連線的服務而不影響已建立的連線,然而其他欺騙攻擊卻是打斷已建立的連線不能從開始阻止新的連線。SYN攻擊僅僅通過修改初始握手程式就能被制止,然而其他的欺騙攻擊需要整個連線生命週期中檢查每一段資料。SYN洪泛和其他TCP欺騙攻擊之間的共同之處是他們都是取決於攻擊者傳送偽裝源地址IP資料包的能力,而防禦它們的相同方法都是部署更多的地址過濾或使用IP安全協議(IPsec)。
10 總結
在我看來,一些SYN快取技術的變體應該作為固化功能將其植入到伺服器作業系統中去,而且這些變體可以適當的情況下結合其他解決方案(基於地址的過濾,ACK偽裝防火牆,IP安全協議等等)一起部署。目前也有許多專家正在致力於研究健壯性更強的TCP協議,也希望這些補充協議能夠早日部署。