天天看點

如何避免IPv6“友鄰發現”威脅?

如果企業正着手準備部署IPv6,那麼一定要了解“友鄰發現(ND)”及其漏洞。

IPv6友鄰發現是IPv6協定套件的一個核心部件。它可用于IPv6解析和IPv6無狀态位址自動配置。本文主要介紹各種基于友鄰發現(ND)的攻擊,以及闡述IT管理者如何使用一個開源IPv6工具套件來評估所有可能受此類問題影響的安全裝置的有效性。

IPv6友鄰發現(ND)是IPv6協定套件的一個關鍵元件,它部署在IPv6節點,包含許多的功能:

· IPv6位址解析

· 無狀态位址自動配置

· 重複位址檢測

· 友鄰中斷檢測

IPv6位址解析包括将一個友鄰節點的IPv6位址映射到相應的鍊路層位址上。在IPv4中,執行相同功能的是位址解析協定(Address Resolution Protocol, ARP)。無狀态位址自動配置(Stateless address autoconfiguration, SLAAC)包括發現鄰近路由器和擷取用于建立IPv6連接配接的網絡配置資訊。重複位址檢測(Duplicate address detection, DAD)是一個在部署一個IPv6網絡通信位址之前用于檢測重複IPv6位址的功能。最後,友鄰中斷檢測(NUD)可用于評估一條通向相鄰節點路徑的可達性。在遇到節點中斷時,可以部署一條替代路徑。

友鄰發現使用網際網路控制消息協定v6消息控制它的所有功能;它不同于ARP,後者直接運作在底層的鍊路層協定之上。雖然這種設計方式看起來“更整潔一些”(因為ND不會綁定到任何一種鍊路層技術上),但是這裡也包含一些重要影響。例如,任何用于監控ND流量或防禦ND攻擊的裝置或技術都必須應對IPv6資料包的多樣性及其複雜性。又例如,IPv6碎片和IPv6擴充頭資訊就被證明可能會影響任何ND安全性、監控裝置或技術。

當IPv6資料包發送到本地鍊路時,一個相鄰節點的IPv6位址(可以是最終目标或中間路由器)需要映射到相應的鍊路層位址。

想要搞壞位址解析功能的最簡單方法是部署nDisc6 IPv6診斷工具的ndisc6工具(開源)。ndisc6工具可以破壞兩個功能:解析得到的IPv6位址和用于執行位址解析的網絡接口。例如,它可能将IPv6位址fc00:1::1解析為下面的鍊路層位址:

如何避免IPv6“友鄰發現”威脅?

圖1:解析一個IPv6位址

一個IPv6實作在一個名為友鄰發現緩存(與之對應的是IPv4的ARP緩存)中儲存着IPv6位址到鍊路層位址的映射清單。在手工評估一個節點是否下載下傳了錯誤位址映射(可能由攻擊造成的錯誤)的過程中,檢查友鄰緩存是非常有用的。所有IPv6實作都提供了用于檢測友鄰緩存的方法或工具。例如,在GNU/Linux系統中,使用“ip”指令就可以檢查友鄰緩存:

如何避免IPv6“友鄰發現”威脅?

圖2:檢查友鄰發現緩存

結果中每一行包含一個IPv6位址、友鄰所在的網絡接口、相應的鍊路層位址、表示位址是否指向一個路由器的關鍵字(router)和這個記錄的狀态(例如,友鄰是否可達、映射資訊是否失效等)。

在BSD系列作業系統中,則可以使用ndp檢查友鄰緩存的内容:

如何避免IPv6“友鄰發現”威脅?

圖3:在BSD系統中檢查友鄰緩存

注意,雖然上面的結果與Linux有一些不同,但是兩者的資訊是基本一緻的。

如果有攻擊者能夠在友鄰緩存中加入一些非法映射,那麼他就能夠将本地資料包随意引流到任意節點,然後執行中間人(MITM)攻擊或分布式拒絕服務(DDoS)攻擊。決定最終的攻擊屬于MITM還是DDoS的因素是受攻擊位址映射的目标鍊路層位址:如果攻擊者能夠将受攻擊的IPv6位址映射到自己的鍊路層位址,那麼他執行的就是MITM攻擊。如果他将受攻擊位址映射到一個不存在的鍊路層位址,那麼這就是DDoS攻擊。

另一個診斷工具是SI6 Networks的IPv6 Toolkit,它是一個開源IPv6安全評估和故障修改綜合工具,它支援各種作業系統(包括GNU/Linux、BSD和Mac OS)。它包含許多實用工具,如可用于發送僞造友鄰廣告(NA)消息的na6工具。

na6可用于執行前面提到的MITM或DDoS攻擊。例如,如果将通向IPv6位址fc00:1::1的所有流量轉發到鍊路層位址11:22:33:44:55:66,攻擊者可以執行下面的na6指令:

na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v –o

按前面介紹的方法手工檢查友鄰緩存,就可以看到這個工具對于ND緩存的攻擊效果。

正如前面所提到的,攻擊者可能利用IPv6擴充頭和/或碎片去回避安全控制。是以,如果攻擊者想要繞開一些無法處理整個IPv6頭資訊的安全裝置,那麼他可以執行下面的指令,發送一些惡意NA消息:

na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o

-u 64

顯然,這個指令隻是在前一條指令的基礎上添加了選項“-u 64”,它的作用是在規定的IPv6頭資訊之後插入一條64位元組的目标選項頭資訊。

最後,理論上ND消息(包括NA消息)都采用了碎片機制。雖然RFC 6980禁止在ND中使用碎片,但是一些未更新的實作可能仍然接受這些資料包。在評估一個IPv6網絡或實作時,我們應該檢查是否可以使用帶有IPv6碎片的ND去繞開安全控制。這裡有兩個不同的測試例可以使用:發送一個IPv6原子碎片格式的NA消息和發送一個超大IPv6頭資訊鍊的NA消息。

RFC 6946定義的IPv6原子碎片實際上是一些包含偏移值為0和MF(更多碎片)位為0的IPv6碎片頭資訊的IPv6資料包——即包含一個碎片頭但隻有一個碎片的資料包。執行下面的指令,就可以在na6工具中發送原子碎片格式的資料包:

-y 500

其中,選項“-y 500”表示工具會将友鄰廣告消息分割為500位元組為機關的碎片——但是由于整個NA消息遠遠小于500位元組,是以最終發送的消息将采用原子碎片格式。

第二個測試例是一個超大IPv6頭資訊鍊。如果一個資料包已經分割為碎片,并且第一個碎片不包含所有協定頭資訊,包括從第一個規定的IPv6頭資訊到最上層協定(如傳輸協定頭資訊),那麼這個資料包就是一個超大IPv6頭資訊鍊。下圖顯示的就是一個超大IPv6頭資訊鍊。

如何避免IPv6“友鄰發現”威脅?

圖4:一個超大IPv6頭資訊鍊

RFC 7112定義了超大IPv6頭資訊鍊,反對使用這種頭資訊,并且明确規定在遇到時允許丢棄相應的資料包。然而,一些過時的IPv6實作可能仍然接受這些資料包,是以不可能認為受攻擊節點一定會丢棄這些資料包。使用na6工具,執行下面的指令就可以以超大IPv6頭資訊鍊的格式發送NA消息:

-u 500 -u 100 -y 400

這實際上就是前面使用的同一個攻擊指令,隻是增加了兩個目标選項頭資訊(一個是500位元組,後面緊跟一個100位元組的頭資訊),以及一個将NA消息分割為最大400位元組碎片的請求(“-y 400”選項)。是以,第一個碎片的大小不足以傳輸整個IPv6頭資訊鍊,是以IPv6頭資訊鍊會被分割為兩個碎片。

作為IPv6網絡安全評估的一部分,我們可以執行這裡的每一個測試例,進而評估所部署的安全控制措施是否能應對這些攻擊方式。

原文釋出時間為:2015年02月10日

本文來自雲栖社群合作夥伴至頂網,了解相關資訊可以關注至頂網。

繼續閱讀