如何避免IPv6“友鄰發(fā)現(xiàn)”威脅?
如果企業(yè)正著手準備部署IPv6,那么一定要了解“友鄰發(fā)現(xiàn)(ND)”及其漏洞。
IPv6友鄰發(fā)現(xiàn)是IPv6協(xié)議套件的一個核心部件。它可用于IPv6解析和IPv6無狀態(tài)地址自動配置。本文主要介紹各種基于友鄰發(fā)現(xiàn)(ND)的攻擊,以及闡述IT管理員如何使用一個開源IPv6工具套件來評估所有可能受此類問題影響的安全設(shè)備的有效性。
IPv6友鄰發(fā)現(xiàn)(ND)是IPv6協(xié)議套件的一個關(guān)鍵組件,它部署在IPv6節(jié)點,包含許多的功能:
· IPv6地址解析
· 無狀態(tài)地址自動配置
· 重復(fù)地址檢測
· 友鄰中斷檢測
IPv6地址解析包括將一個友鄰節(jié)點的IPv6地址映射到相應(yīng)的鏈路層地址上。在IPv4中,執(zhí)行相同功能的是地址解析協(xié)議(Address Resolution Protocol, ARP)。無狀態(tài)地址自動配置(Stateless address autoconfiguration, SLAAC)包括發(fā)現(xiàn)鄰近路由器和獲取用于建立IPv6連接的網(wǎng)絡(luò)配置信息。重復(fù)地址檢測(Duplicate address detection, DAD)是一個在部署一個IPv6網(wǎng)絡(luò)通信地址之前用于檢測重復(fù)IPv6地址的功能。最后,友鄰中斷檢測(NUD)可用于評估一條通向相鄰節(jié)點路徑的可達性。在遇到節(jié)點中斷時,可以部署一條替代路徑。
友鄰發(fā)現(xiàn)使用互聯(lián)網(wǎng)控制消息協(xié)議v6消息控制它的所有功能;它不同于ARP,后者直接運行在底層的鏈路層協(xié)議之上。雖然這種設(shè)計方式看起來“更整潔一些”(因為ND不會綁定到任何一種鏈路層技術(shù)上),但是這里也包含一些重要影響。例如,任何用于監(jiān)控ND流量或防御ND攻擊的設(shè)備或技術(shù)都必須應(yīng)對IPv6數(shù)據(jù)包的多樣性及其復(fù)雜性。又例如,IPv6碎片和IPv6擴展頭信息就被證實可能會影響任何ND安全性、監(jiān)控設(shè)備或技術(shù)。
IPv6地址解析及其工作方式
當IPv6數(shù)據(jù)包發(fā)送到本地鏈路時,一個相鄰節(jié)點的IPv6地址(可以是最終目標或中間路由器)需要映射到相應(yīng)的鏈路層地址。
想要搞壞地址解析功能的最簡單方法是部署nDisc6 IPv6診斷工具的ndisc6工具(開源)。ndisc6工具可以破壞兩個功能:解析得到的IPv6地址和用于執(zhí)行地址解析的網(wǎng)絡(luò)接口。例如,它可能將IPv6地址fc00:1::1解析為下面的鏈路層地址:

圖1:解析一個IPv6地址
一個IPv6實現(xiàn)在一個名為友鄰發(fā)現(xiàn)緩存(與之對應(yīng)的是IPv4的ARP緩存)中保存著IPv6地址到鏈路層地址的映射列表。在手工評估一個節(jié)點是否下載了錯誤地址映射(可能由攻擊造成的錯誤)的過程中,檢查友鄰緩存是非常有用的。所有IPv6實現(xiàn)都提供了用于檢測友鄰緩存的方法或工具。例如,在GNU/Linux系統(tǒng)中,使用“ip”命令就可以檢查友鄰緩存:

圖2:檢查友鄰發(fā)現(xiàn)緩存
結(jié)果中每一行包含一個IPv6地址、友鄰所在的網(wǎng)絡(luò)接口、相應(yīng)的鏈路層地址、表示地址是否指向一個路由器的關(guān)鍵字(router)和這個記錄的狀態(tài)(例如,友鄰是否可達、映射信息是否失效等)。
在BSD系列操作系統(tǒng)中,則可以使用ndp檢查友鄰緩存的內(nèi)容:

圖3:在BSD系統(tǒng)中檢查友鄰緩存
注意,雖然上面的結(jié)果與Linux有一些不同,但是兩者的信息是基本一致的。
如果有攻擊者能夠在友鄰緩存中加入一些非法映射,那么他就能夠?qū)⒈镜財?shù)據(jù)包隨意引流到任意節(jié)點,然后執(zhí)行中間人(MITM)攻擊或分布式拒絕服務(wù)(DDoS)攻擊。決定最終的攻擊屬于MITM還是DDoS的因素是受攻擊地址映射的目標鏈路層地址:如果攻擊者能夠?qū)⑹芄舻腎Pv6地址映射到自己的鏈路層地址,那么他執(zhí)行的就是MITM攻擊。如果他將受攻擊地址映射到一個不存在的鏈路層地址,那么這就是DDoS攻擊。
另一個診斷工具是SI6 Networks的IPv6 Toolkit,它是一個開源IPv6安全評估和故障修改綜合工具,它支持各種操作系統(tǒng)(包括GNU/Linux、BSD和Mac OS)。它包含許多實用工具,如可用于發(fā)送偽造友鄰廣告(NA)消息的na6工具。
na6可用于執(zhí)行前面提到的MITM或DDoS攻擊。例如,如果將通向IPv6地址fc00:1::1的所有流量轉(zhuǎn)發(fā)到鏈路層地址11:22:33:44:55:66,攻擊者可以執(zhí)行下面的na6命令:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v –o
按前面介紹的方法手工檢查友鄰緩存,就可以看到這個工具對于ND緩存的攻擊效果。
正如前面所提到的,攻擊者可能利用IPv6擴展頭和/或碎片去回避安全控制。因此,如果攻擊者想要繞開一些無法處理整個IPv6頭信息的安全設(shè)備,那么他可以執(zhí)行下面的命令,發(fā)送一些惡意NA消息:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-u 64
顯然,這個命令只是在前一條命令的基礎(chǔ)上添加了選項“-u 64”,它的作用是在規(guī)定的IPv6頭信息之后插入一條64字節(jié)的目標選項頭信息。
最后,理論上ND消息(包括NA消息)都采用了碎片機制。雖然RFC 6980禁止在ND中使用碎片,但是一些未更新的實現(xiàn)可能仍然接受這些數(shù)據(jù)包。在評估一個IPv6網(wǎng)絡(luò)或?qū)崿F(xiàn)時,我們應(yīng)該檢查是否可以使用帶有IPv6碎片的ND去繞開安全控制。這里有兩個不同的測試例可以使用:發(fā)送一個IPv6原子碎片格式的NA消息和發(fā)送一個超大IPv6頭信息鏈的NA消息。
RFC 6946定義的IPv6原子碎片實際上是一些包含偏移值為0和MF(更多碎片)位為0的IPv6碎片頭信息的IPv6數(shù)據(jù)包——即包含一個碎片頭但只有一個碎片的數(shù)據(jù)包。執(zhí)行下面的命令,就可以在na6工具中發(fā)送原子碎片格式的數(shù)據(jù)包:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-y 500
其中,選項“-y 500”表示工具會將友鄰廣告消息分割為500字節(jié)為單位的碎片——但是由于整個NA消息遠遠小于500字節(jié),所以最終發(fā)送的消息將采用原子碎片格式。
第二個測試例是一個超大IPv6頭信息鏈。如果一個數(shù)據(jù)包已經(jīng)分割為碎片,并且第一個碎片不包含所有協(xié)議頭信息,包括從第一個規(guī)定的IPv6頭信息到最上層協(xié)議(如傳輸協(xié)議頭信息),那么這個數(shù)據(jù)包就是一個超大IPv6頭信息鏈。下圖顯示的就是一個超大IPv6頭信息鏈。

圖4:一個超大IPv6頭信息鏈
RFC 7112定義了超大IPv6頭信息鏈,反對使用這種頭信息,并且明確規(guī)定在遇到時允許丟棄相應(yīng)的數(shù)據(jù)包。然而,一些過時的IPv6實現(xiàn)可能仍然接受這些數(shù)據(jù)包,因此不可能認為受攻擊節(jié)點一定會丟棄這些數(shù)據(jù)包。使用na6工具,執(zhí)行下面的命令就可以以超大IPv6頭信息鏈的格式發(fā)送NA消息:
na6 -i eth0 -W fc00:1::1 -E 11:22:33:44:55:66 -L -v -o
-u 500 -u 100 -y 400
這實際上就是前面使用的同一個攻擊命令,只是增加了兩個目標選項頭信息(一個是500字節(jié),后面緊跟一個100字節(jié)的頭信息),以及一個將NA消息分割為最大400字節(jié)碎片的請求(“-y 400”選項)。因此,第一個碎片的大小不足以傳輸整個IPv6頭信息鏈,因此IPv6頭信息鏈會被分割為兩個碎片。
作為IPv6網(wǎng)絡(luò)安全評估的一部分,我們可以執(zhí)行這里的每一個測試例,從而評估所部署的安全控制措施是否能應(yīng)對這些攻擊方式。