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

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

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

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

圖4:一個(gè)超大IPv6頭信息鏈
RFC 7112定義了超大IPv6頭信息鏈,反對(duì)使用這種頭信息,并且明確規(guī)定在遇到時(shí)允許丟棄相應(yīng)的數(shù)據(jù)包。然而,一些過時(shí)的IPv6實(shí)現(xiàn)可能仍然接受這些數(shù)據(jù)包,因此不可能認(rèn)為受攻擊節(jié)點(diǎn)一定會(huì)丟棄這些數(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
這實(shí)際上就是前面使用的同一個(gè)攻擊命令,只是增加了兩個(gè)目標(biāo)選項(xiàng)頭信息(一個(gè)是500字節(jié),后面緊跟一個(gè)100字節(jié)的頭信息),以及一個(gè)將NA消息分割為最大400字節(jié)碎片的請(qǐng)求(“-y 400”選項(xiàng))。因此,第一個(gè)碎片的大小不足以傳輸整個(gè)IPv6頭信息鏈,因此IPv6頭信息鏈會(huì)被分割為兩個(gè)碎片。
作為IPv6網(wǎng)絡(luò)安全評(píng)估的一部分,我們可以執(zhí)行這里的每一個(gè)測(cè)試?yán)瑥亩u(píng)估所部署的安全控制措施是否能應(yīng)對(duì)這些攻擊方式。