摘要:通過深入分析鄰居發現協議運行機制,指出了鏈路可信這個默認前提是導致ND(neighbor discovery)存在安全缺陷的根本原因;隨后具體分析了基于ND安全缺陷各種DoS攻擊方法,并對ND的安全防護進行了闡述,為進一步研究安全ND奠定了基礎。
關鍵詞:網絡安全; IPv6; 鄰居發現; 拒絕服務攻擊
中圖分類號:TP393.08文獻標志碼:A
文章編號:1001-3695(2007)08-0140-04
在IPv6[1]中,基于ICMPv6的鄰居發現協議ND[2] 用來解決同一鏈路上節點間的交互問題。它取代了IPv4[3]中使用的地址解析協議(ARP)、控制報文協議(ICMP)中的路由器發現部分及重定向協議的所有功能,并能夠獲取鏈路MTU、hop limit等網絡參數。IPv6的鄰節點發現過程,就是用一系列的ND報文和步驟來確定鄰節點間的關系,進行網絡配置的過程。
鄰居發現協議雖然使網絡配置過程更加自動化,減輕了管理員的負擔,但由于鏈路可信是鄰居發現協議ND正常運行的默認前提條件,即假定所有節點都只按照協議標準發送正常的ND數據包,這就給鄰居發現協議埋下安全隱患。IPv4中的ARP協議正是由于其默認子網內節點可信而導致其易受到Spoofing、DoS等攻擊,而且在IPv6中節點除需要利用ND進行地址解析之外,還需利用其進行網絡配置(如獲取地址前綴、MTU等網絡參數和進行路由器發現等),當網絡中存在惡意節點時,該網絡就可能遭受惡意節點利用ND認證缺陷的欺騙性DoS攻擊,而且受IPv6地址空間擴大的影響攻擊者還有可能利用ND從鏈路外發起資源消耗型DoS攻擊。
本文簡要分析了ND的運行機制,指出其存在被利用來進行DoS攻擊的安全缺陷,從鏈路內攻擊和鏈路外攻擊兩個方面具體闡述了針對ND安全缺陷的DoS攻擊方法,并討論了檢測文中所述DoS攻擊的方法,分析了利用IPSec對ND協議進行安全防護時存在的問題。
1ND安全缺陷分析
鄰居發現協議ND在設計時對其安全性進行了一定考慮,為確保收到的鄰節點發現報文發自本地鏈路上的節點,發送方將其發出的所有鄰節點發現報文中的跳限制字段的值均置為255。當接收方收到一個鄰節點發現報文時,它會首先檢查IPv6報頭中的跳限制字段。如果此字段的值不等于255,就丟棄該報文。驗證鄰節點發現報文中的跳限制字段的值是否等于255這一方法,防止了由鏈路外的節點發起的基于鄰節點發現的網絡攻擊,但255的跳數限制并不能解決鏈路內存在惡意節點時的安全問題。
為使相鄰節點間的交互更為高效,節點在通信過程中緩存了鄰節點的相關信息和網絡的相關參數:Neighbor cache記錄了鄰居節點的IPMAC映射關系,該節點是否為路由器及其可達狀態;Destination cache記錄了對應于目的IP的下一跳IP地址及PMTU;Prefix List記錄了本地地址前綴及其相應時間參數;Default router list記錄了鏈路上的路由器信息。節點在與鄰節點通信時,就是通過查詢上述緩存來進行具體的下一跳確定、地址解析、鄰居不可達檢測NUD和地址重復檢測DAD等。緩存中的信息對節點間的交互具有重要作用,若緩存中信息的合法性、有效性無法得到保證,則節點間通信的持續性、安全性也就無法得到保證。
緩存中信息的建立與維護是通過一系列的ND報文的交互來實現的,而ND協議默認本地鏈路這個網絡環境是可信的,即節點無法對來自本鏈路的ND報文進行有效性、合法性的確認,只能默認接收該報文并據此對緩存進行更新,因此鏈路中的惡意節點可以利用節點間的信任,發送偽造的ND報文,從而竄改目標節點的相應緩存,致使目標節點無法與其他節點進行正常通信;或發布錯誤的網絡配置參數,對其進行欺騙攻擊,進而造成整個網絡通信效率低下甚至癱瘓。
IPv6中節點在進行地址解析時,需要在neighbor cache中創建一個待解析鄰居節點的緩存表項,并將其狀態設置為incomplete(鄰居緩存中的記錄可能處于五種狀態:incomplete、stale、reachable、delay和probe)。由于IPv6中最小子網的地址空間為264,即一個節點的同一鏈路上可以有多達264個鄰居節點。從理論上來說,節點可能會在短時間內需要對264個IP地址發送多播NS進行地址解析。在這種情況下,節點的neighbor cache將被迅速耗盡,而且大量的多播NS報文還將造成網絡擁塞。若攻擊者能夠使目標節點在短時間內對大量不同的IP地址進行地址解析,則可能造成對目標節點和目標網絡的DoS攻擊。
2基于ND的DoS攻擊方法分析
2.1鏈路內DoS攻擊
ND作為鏈路內節點間相互通信的基礎協議,255的hop limit限制確保了ND報文只能由同一鏈路內的節點發出,因此基于ND協議的DoS攻擊大部分只能由同一鏈路內的惡意節點發起。惡意節點可利用ND協議缺乏認證機制,對鏈路內節點進行各種方式的DoS攻擊,如發送錯誤的ND報文偽造節點的IPMAC映射關系,發布錯誤的網絡配置參數,或重定向節點的路由。
2.1.1重復地址檢測DoS
當一個網絡接口開始啟用時,將首先根據接口的48位MAC地址生成64位的interface ID(若考慮到網絡通信時的身份隱秘問題,此時的Interface ID將根據RFC 3041[4]隨機生成)。將此interface ID加上鏈路本地地址前綴FE80::/64,網絡接口得到一個臨時鏈路本地地址。在將這個鏈路本地地址綁定到網絡接口之前,為了防止與其他節點地址沖突,節點需對此臨時地址進行重復地址檢測DAD,即系統向該IP地址的請求節點多播地址(節點同時也會向該多播地址發送多播監聽報告multicast listener report) (solicited node multicast address) FF02::1:FFXX::XXXX發送一個多播鄰居請求報文,其數據幀的目的MAC地址為對應于請求節點多播地址的以太網多播地址33:33:FF:XX:XX:XX[5]。若節點收到一個來自待檢測IP地址的鄰居通告消息報文,則說明本鏈路有其他節點在使用此地址,本節點只能再隨機生成interface ID或由管理員進行手工配置。
鏈路內的惡意攻擊節點可以監聽本鏈路的DAD報文,提取出每一個DAD報文中的待檢測地址,并以此地址偽造一個NA數據包進行回復。這樣被攻擊節點會認為此地址已被使用,從而只能再生成一個新的地址,并進行DAD。攻擊節點一直針對DAD數據包進行回復,所以將導致被攻擊節點始終無法獲得IP地址,從而切斷了被攻擊節點與外界的聯系。
由于攻擊節點無須利用任何欺騙手段就直接能接收到整個鏈路內的所有DAD報文(即使在交換網絡環境下,交換機是根據數據包的源MAC地址來進行端口綁定,目的MAC為以太網多播地址33:33:FF:XX:XX:XX的DAD報文將被轉發到各個端口)。若攻擊者對整個鏈路內的DAD報文進行回復,則將造成整個鏈路通信的癱瘓。在實驗中,重復地址檢測DoS攻擊能有效阻斷被攻擊節點的通信。
2.1.2地址映射欺騙DoS
IPv6及節點間交互的ND報文中,鄰節點請求報文NS、鄰節點通告報文NA、路由器請求報文RS和路由器通告報文RA中均帶有鏈路層地址的選項字段。根據RFC 2461,當節點收到NS/NA/RS/RA報文時,在一定條件下會根據其中的鏈路層地址選項字段進行更新。節點在收到發向自己的NS、RS或RA報文時,若ND緩存中沒有對應該報文源IP的記錄時,將創建IPMAC記錄并將其狀態設為stale,即暫不可用、有待檢驗;若ND緩存中有記錄,則根據新的src linklayer addr選項中的MAC地址更新記錄,也將其狀態設為stale;對于收到的NA報文節點的具體處理依賴于其ND緩存中對應記錄所處的狀態,例如當緩存中不存在對應的NA報文中IP地址,節點將拋棄此數據包,不作緩存更新。
鏈路內的惡意節點可以發送偽造的RS/RA/NS/NA數據包,對目標節點的緩存進行竄改,將鄰居節點或默認路由器的MAC地址映射到不存在的一個MAC地址,這樣就會造成目標節點無法與鄰居節點或默認路由器通信。由于目標節點會發送NS對緩存中的鄰居節點進行鄰居不可達檢測NUD,若在一定超時間隔后,無法收到來自目標節點的NA報文內,則將刪除緩存中的偽造記錄,重新進行地址解析。為了進行持續的DoS攻擊,攻擊節點需要回應目標節點向偽造MAC地址所發送NUD數據包。考慮到操作系統在實現IPv6協議棧時可能有所差別,試驗中對各操作系統發送虛假RS/RA/NS/NA報文進行了測試,其地址映射欺騙的結果如表1所示。表中的更新表示系統在收到虛假報文后對緩存立即進行更新,對應NA的有條件更新指系統收到NA報文后,當緩存中存在對應記錄時才進行更新。
鏈路內的主機根據RA報文中的參數進行網絡設置,當攻擊者偽造RA中的各項參數,則鏈路內節點的網絡配置將受到不同程度的影響。
1)MTU欺騙RA報文中的MTU參數指明了鏈路層的最大傳輸單元,鏈路內的主機根據此MTU來決定是否將數據包進行分片發送。若本鏈路實際MTU為5 000,而攻擊者發送MTU為1 280的RA報文(RFC 2460中規定了IPv6中MTU最小為1 280 Byte),則鏈路內主機在發送大于1 280的數據幀時就必須進行分片,從而使網絡帶寬無法得到有效利用,同時數據包的分片與重組也造成主機計算資源的消耗。
2)前綴信息欺騙RA報文的前綴信息選項表示了本鏈路的地址前綴及有關地址自動配置的信息。其中:onLink標志說明了該前綴是否屬于本鏈路的地址前綴;autonomous標志說明該前綴是否能用于主機的無狀態地址自動配置過程。因此,攻擊者可以冒充本地路由器發送虛假RA,報文中填入另一網段的地址前綴,并設置相應的onLink和autonomous標志。若onLink標志置為1,則鏈路內被攻擊主機會在其prefix list中創建一條對應于該另一網段地址前綴的記錄。在被攻擊主機與另一網段內的節點通信時,由于該網段內節點的IP地址匹配被攻擊主機prefix list中緩存的表項,被攻擊主機將認為另一網段內的節點和主機自身處于同一鏈路內,從而被攻擊主機將直接在本鏈路內對該IP地址進行地址解析,而不通過路由器轉發,這樣就能造成被攻擊主機無法與該網段內的任何節點進行通信。若autonomous標志置為1,則鏈路內被攻擊主機將利用這個屬于另一網段的地址前綴進行無狀態地址自動配置,從而生成一個屬于另一網段的IP地址。這樣當鏈路內被攻擊主機以此IP地址為源地址與外界通信時,外界回應的數據包將被路由器根據此另一網段的IP地址直接路由到另一網段,導致被攻擊主機收不到任何回應報文。
3)跳數欺騙跳數限制hop limit字段的值表示了本鏈路內的主機在發送報文時所應設置的默認跳數,限制報文在到達目的地之前所能經過的最大鏈路數,操作系統一般會設置一個默認值,如Windows默認為128,Linux默認為64。若攻擊者發送數值很小的hop limit,如將RA中的hop limit設置為1,則在鏈路內被攻擊主機根據此數值更新其hop limit后,被攻擊主機發送的任何數據包到達第一個路由器后則均將被丟棄,從而無法與外界通信。
4)路由器生存期欺騙RA中的router lifetime字段表示發布此RA的路由器作為鏈路內節點默認路由器的生存期。當此字段數值為0時鏈路內主機則將該路由器在default rou ̄ter list中的相應記錄刪除,不再用其作為默認路由器。根據RFC,當節點的default router list為空,即節點沒有默認路由器記錄時,在與任何IP地址通信時,節點只能在本鏈路進行地址解析。因此攻擊者可以利用這一點,偽裝成鏈路內默認路由器發送RA,并將其中的router lifetime設為0,從而實現對本鏈路內主機的DoS攻擊。
2.1.4Redirect DoS
對于路由器來說,當轉發一個數據包時若發現其目的IP地址對應的節點屬于本鏈路或者附近有一個路由器能提供到目的IP地址的更好路由時,此轉發路由器將向數據包的源地址發送一個重定向(redirect)報文,通知源節點到目的地有一個更好的下一跳地址。攻擊者可偽裝成本地路由器,向目標節點發送重定向報文,將其下一跳路由定向到一個不存在的地址,從而造成目標節點的通信中斷。
2.2鏈路外DoS攻擊(IP flooding DoS)
ND報文中,255的hop limit限制確保了ND報文只能由同一鏈路內的節點發出,因此鏈路外的攻擊者不能直接發送ND報文發起對本鏈路內節點的DoS攻擊,但攻擊者可以利用節點neighbor cache過小和IPv6地址空間過大的矛盾,通過讓目標鏈路中的路由器在短時間內對大量IP地址進行地址解析,耗盡路由器的緩存,使大量無用的多播NS報文占用目標鏈路的帶寬,達到在鏈路外發起遠程DoS攻擊的目的。
對于具有264地址空間的IPv6最小子網來說,遠程攻擊者可以根據該目標子網的64位地址前綴,結合隨機或順序生成的后64位主機ID,組成屬于目標網絡的IP地址,在短時間內向目標網絡內的各個生成地址發送數據包。當這些數據包經過最后一跳的默認路由器時,默認路由器就必須對這些生成的地址進行地址解析。由于子網的地址空間為264,生成的大量地址均將不存在,如圖1所示。即使對于擁有232個節點的子網,生成的IP地址也有大于99%的可能性是不存在目標子網內的。這樣最后一跳的路由器就必須等待每一個地址解析請求的超時,因而在短時間內目標路由器的緩存就可能被耗盡,使路由器無法為正常數據包進行地址解析請求服務。且目標路由器發送的大量多播NS報文也將占據鏈路內的有效帶寬,形成對這個子網的DoS攻擊。這種攻擊方法在原理上類似于SYN flooding,攻擊的效果將由路由器地址解析的超時時間、緩存管理機制等因素決定。
3ND安全防護
從安全的角度看,鄰居發現協議的問題就在于其運行機制的默認前提是鏈路內節點可信,即子網中的每個節點均按照協議標準運作。但是,由于IPv6將被廣泛地部署在不同的網絡環境中,并非均是ND協議運行所默認的可信網絡環境,ND協議就容易受到鏈路內惡意節點發起的DoS攻擊,而且255的hop limit限制并不能阻止攻擊者從鏈路外發起利用ND的對鏈路內路由器和整個子網的DoS攻擊。
要針對ND進行安全防護,首先可以針對基于ND的各種攻擊方式進行檢測。例如對于重復地址檢測DoS,由于IPv6地址空間巨大,由MAC地址或隨機生成的IP地址沖突的幾率極小,若節點連續幾次發現地址沖突,則可認為受到重復地址檢測DoS;對于發送NS/NA/RS/RA進行地址映射欺騙的DoS攻擊,節點可以對收到的ND報文進行有選擇性接收,當發現緩存中的MAC地址與ND報文中的MAC地址不匹配時,并不立即進行更新,而是對目標節點進行鄰居不可達檢測,若等待一段時間后收到兩個NA報文,同一IP地址被映射到兩個不同的MAC地址,則可認為鏈路中存在攻擊節點;對于網絡配置參數DoS,節點可以預先設置一些鏈路內的默認參數,如MTU、默認路由器等,這些參數并不根據收到的RA報文進行更新,而且本鏈路的合法路由器也不會對這些參數通過發送RA進行設置。當收到設置這些參數的RA時,節點即可認為自己受到了欺騙攻擊,鏈路內存在惡意節點。
為了避免基于ND安全缺陷的攻擊,比較有效的辦法是對ND報文進行認證,甄別合法報文。在RFC 2461中提及使用IPSec對ND協議數據包進行認證,保證其可信性和完整性,但利用IPSec時仍然受到密鑰管理的困擾:一個節點需要一個IP地址來運行IKE,而IKE用來建立IPSec中的安全關聯SA,但在進行地址配置獲得一個IP地址時需要已建立的安全關聯SA。目前只能通過管理員在節點上手動設置密鑰,建立安全關聯SA。當網絡中存在大量節點時,節點間需要建立很多安全關聯,這給管理員帶來了很大的負擔。目前,IETF的Securing Neighbor Discovery工作組正在研究此問題的解決方法,即secure neighbor discovery[10]。但是對ND報文進行認證防護并不能避免遠程攻擊者發起的IP flooding DoS攻擊,要防御IP flooding DoS,目前比較好的辦法是通過合理的緩存管理機制,限制單位時間內進行地址解析的次數,或采取有狀態的地址配置機制,在本鏈路內對每個獲得地址的節點進行登記,當最后一跳路由器收到發向不存在IP地址的數據包時就能直接丟棄該數據包,從而在一定程度上避免DoS攻擊。但這種方法將喪失無狀態地址自動配置的靈活性,而且并不適合用于節點頻繁移動的無線網絡環境。因此,如何避免基于ND的遠程DoS攻擊有待進一步研究。
參考文獻:
[1]DEERING S, HINDEN R. IETF RFC 2460, Internet protocol, version 6 (IPv6) specification[S]. 1998.
[2]NARTEN T, NORDMARK E, SIMPSON W. IETF RFC 2461, Neighbor discovery for IP version 6[S]. 1998.
[3]Information Sciences Institute University of Southern California. IETF RFC 791,Darpa Internet program protocol specification[S]. 1981.
[4]NARTEN T, DRAVES R. IETF RFC 3041, Privacy extensions for stateless address autoconfiguration in IPv6[S]. 2001.
[5]CRAWFORD M. IETF RFC 2464, Transmission of IPv6 packets over Ethernet networks[S]. 1998.
[6]CRAWFORD M, NARTEN T, THOMAS S. IETF RFC 2470, Transmission of IPv6 packets over token ring networks[S]. 1998.
[7]CONTA A, DEERING S. IETF RFC 2463, Internet control message protocol for IPv6[S]. 1998.
[8]NIKANDER P, KEMPF J, NORDMARK E. IETF RFC 3756, IPv6 neighbor discovery (ND) trust models and threats[S]. 2004.
[9]THOMSON S, NARTEN T. IETF RFC 2462, IPv6 stateless address autoconfiguration[S]. 1998.
[10]ARKKO J, KEMPF J, ZILL B, et al. IETF RFC 3971, Secure neighbor discovery[S]. 2005.
注:“本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文”