儘管這種攻擊已經出現了十四年,但它的變種至今仍能看到。雖然能有效對抗SYN洪泛的技術已經存在,可是沒有對於TCP實現的一個標準的補救方法出現。你能夠在現在的操做系統和設備中找到保護應用層和網絡層的不一樣解決方案的不一樣實現。本篇論文詳細描述這種攻擊並展望和評估如今應用於終端主機和網絡設備的對抗SYN洪泛方法。緩存
1 基本的漏洞安全
SYN洪泛攻擊首次出如今1996年。當時Phrack雜誌中描述了這種攻擊並用代碼實現了它[1]。這些信息被迅速應用於攻擊一個網絡服務提供商(ISP)的郵件和Telnet服務,並形成了停機。CERT(Computer Emergency Response Team)不久就發佈了對於這種攻擊技術的初步評估與解決方案[2]。服務器
SYN洪泛攻擊的基礎是依靠TCP創建鏈接時三次握手的設計。第三個數據包驗證鏈接發起人在第一次請求中使用的源IP地址上具備接受數據包的能力,即其返回是可達的。圖1顯示了一次普通的TCP鏈接開始時交換數據包的過程。cookie
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協議,也但願這些補充協議可以早日部署。