李成友 韓昧華
聊城大學網(wǎng)絡(luò)信息中心 山東 252059
近幾年來,無論是網(wǎng)絡(luò)運營商,還是各高校校園網(wǎng)、各單位的局域網(wǎng)等等,都經(jīng)受了ARP欺騙的攻擊。這種攻擊帶有很大的普遍性,對用戶和網(wǎng)管人員影響都非常大。其實,這類攻擊大多是來自于蠕蟲病毒,發(fā)起者電腦通常是在不知情的情況下感染了這類病毒,并在不知情的情況下對同一VLAN內(nèi)的電腦發(fā)起了攻擊。根據(jù)欺騙的對象可以將 ARP欺騙分為兩種類型:欺騙網(wǎng)關(guān)型和欺騙主機型。其中,欺騙網(wǎng)關(guān)型是指攻擊發(fā)生時網(wǎng)關(guān)內(nèi)存中維護的IP-MAC對照表被污染,網(wǎng)關(guān)找不到真實的主機,致使主機收不到網(wǎng)關(guān)的回應(yīng)包,從而造成上網(wǎng)不正常;而欺騙主機型是指攻擊發(fā)生時主機緩存中維護的ARP表被污染,網(wǎng)關(guān)的真實MAC地址被篡改,致使主機找不到真實的網(wǎng)關(guān),同樣造成上網(wǎng)不正常。
(1)每臺主機都會在自己的ARP緩沖區(qū)(ARP Cache)中建立一個 ARP列表,以存儲IP地址和MAC地址(即鏈路層地址)的映射關(guān)系。
(2)當源主機需要將一個數(shù)據(jù)包發(fā)送到目的主機時,會首先檢查自己 ARP列表中是否存在該 IP地址對應(yīng)的MAC地址,如果有,就直接將數(shù)據(jù)包發(fā)送到這個MAC地址;如果沒有,就向本地網(wǎng)段發(fā)起一個ARP請求的廣播包,查詢此目的主機對應(yīng)的MAC地址。此ARP請求數(shù)據(jù)包里包括源主機的IP地址、MAC地址、以及目的主機的IP地址。
(3)網(wǎng)絡(luò)中所有的主機收到這個ARP請求后,會檢查數(shù)據(jù)包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此數(shù)據(jù)包;如果相同,該主機首先將發(fā)送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已經(jīng)存在該IP的信息,則將其覆蓋,然后給源主機發(fā)送一個 ARP響應(yīng)數(shù)據(jù)包,告訴對方自己是它需要查找的MAC地址。
(4)源主機收到這個ARP響應(yīng)數(shù)據(jù)包后,將得到的目的主機的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息開始數(shù)據(jù)的傳輸。如果源主機一直沒有收到ARP響應(yīng)數(shù)據(jù)包,表示ARP查詢失敗。
漏洞一:在工作原理第3條中,當網(wǎng)絡(luò)節(jié)點接收到目的IP地址與自己的IP地址相同的ARP請求報文時,會先將源設(shè)備的IP地址和MAC地址添加到自己的ARP緩存表中,若ARP表中已經(jīng)存在該IP的信息,則將其無條件的覆蓋,然后再給源設(shè)備發(fā)送一個ARP響應(yīng)報文。在這個過程中,沒有任何機制來驗證ARP請求報文中源設(shè)備的IP地址和MAC地址的真實性。從而給欺騙者留下了漏洞,使得他們可以偽造ARP請求報文,既可以欺騙主機,也可以欺騙網(wǎng)關(guān)。當前有些ARP欺騙病毒正是利用了這個漏洞,成批地偽造ARP請求報文。
漏洞二:ARP協(xié)議并沒有規(guī)定必須在接收到ARP請求報文后,才能發(fā)送ARP響應(yīng)報文,這就為別有用心者創(chuàng)造了機會:他們可以人為地制造ARP響應(yīng)報文,在報文中指定源IP、源MAC、目的IP、目的MAC,通過制造的響應(yīng)包去修改其它網(wǎng)絡(luò)設(shè)備上的動態(tài)ARP緩存。當前的一部分ARP攻擊就是利用了這個缺陷,偽造大量的ARP響應(yīng)報文,去修改其它網(wǎng)絡(luò)設(shè)備的APR緩存表,造成同一廣播域中的大量網(wǎng)絡(luò)設(shè)備維護的ARP緩存表錯誤,不能正常上網(wǎng)。
從上面的分析可以看出,造成欺騙的根本原因在于ARP協(xié)議本身存在致命的漏洞,而地址解析的過程又是基于鏈路層的廣播機制,所以要想從根本上杜絕ARP欺騙的發(fā)生是不可能的。通過采取積極的防范措施,可以在很大程度上降低ARP欺騙對網(wǎng)絡(luò)造成的嚴重影響,但這畢竟增加了許多管理的代價,同時也存在網(wǎng)絡(luò)質(zhì)量的降低。在基于Ipv6的下一代互聯(lián)網(wǎng)中,關(guān)于地址解析是如何設(shè)計的?能否從根本上杜絕類似問題的出現(xiàn)呢?
在IPv6中,沒有專門的地址解析協(xié)議,而是利用ICMPv6中的鄰居發(fā)現(xiàn)協(xié)議(Neighbor Discovery Protocol,NDP)來完成的。NDP是Ipv6中的一個基礎(chǔ)協(xié)議,它實現(xiàn)了Ipv4中的地址解析、重定向和路由器發(fā)現(xiàn)等所有功能。對于IPv4,我們無法檢測鄰居的可達性,而鄰居發(fā)現(xiàn)協(xié)議則定義了一種鄰居是否可達的檢測機制,同時,還可進行重復(fù)IP地址檢測。
鄰居發(fā)現(xiàn)協(xié)議采用5種類型的ICMPv6報文來實現(xiàn)各種功能,分別是:
(1)路由器請求RS(Router Solicitation):當接口工作時,主機發(fā)送路由器請求消息,要求路由器立即產(chǎn)生路由器通告消息,而不必等待下一個預(yù)定時間。
(2)路由器通告RA(Router Advertisement):路由器周期性地通告它的存在以及配置的鏈路和網(wǎng)絡(luò)參數(shù),或者對路由器請求消息作出響應(yīng)。路由器通告消息包含在連接(on-link)確定、地址配置的前綴和跳數(shù)限制值等。
(3)鄰居請求NS(Neighbor Solicitation):節(jié)點發(fā)送鄰居請求消息來請求鄰居的鏈路層地址,或驗證它先前所獲得并保存在緩存中的鄰居鏈路層地址的可達性,或者驗證它自己的地址在本地鏈路上是否是惟一的。
(4)鄰居通告NA(Neighbor Advertisement):鄰居請求消息的響應(yīng)。節(jié)點也可以發(fā)送非請求鄰居通告來指示鏈路層地址的變化。
(5)重定向(Redirect):路由器通過重定向消息通知主機。對于特定的目的地址,如果不是最佳的路由,則通知主機到達目的地的最佳下一跳。
其中鄰居請求和鄰居通告報文共同完成地址解析功能。對于每一個IPv6主機,它為每一個網(wǎng)絡(luò)接口都要維護下列緩存表:鄰居緩存表、目的地緩存表、前綴緩存表和默認路由器緩存表。
在鄰居緩存表項中,鄰居可達性狀態(tài)是最關(guān)鍵的信息,規(guī)定了5種狀態(tài):
(1)不完整(INCOMPLETE):正在進行地址解析,鄰居的鏈路層地址還沒確定。
(2)可達(REACHABLE):鄰居在最近處于可達狀態(tài)(在小于10s以前)。
(3)失效(STALE):在數(shù)據(jù)流發(fā)送給該鄰居以前鄰居是不可達的,并無法驗證其可達性。
(4)延遲(DELAY):鄰居不再是可達的,同時數(shù)據(jù)流在最近已經(jīng)發(fā)送給鄰居,但不立即對該鄰居進行探測,而在一個短時延后發(fā)送探測信息,這樣就可以為上層協(xié)議提供可達性確認。
(5)探測(PROBE):鄰居不再是可達的,同時發(fā)送單播鄰居請求探測以驗證可達性。
當一個網(wǎng)絡(luò)節(jié)點要給它的鄰居發(fā)送數(shù)據(jù),但不知道它的鏈路層地址,這時它就要啟動一個地址解析過程。為了更好地理解地址解析過程,您可以參考RFC4861的4.3和4.4,搞清楚鄰居請求報文和通告報文的格式。
(1)鄰居請求報文的發(fā)送
對于支持多播的接口,它需要首先創(chuàng)建一個鄰居緩存表項,且設(shè)置狀態(tài)為不完整(INCOMPLETE),然后發(fā)送一個目標指向這個鄰居的 NS。這個報文發(fā)給目標地址的請求節(jié)點多播地址,且報文要包括發(fā)送者的鏈路層地址作為源鏈路層地址選項。
(2)鄰居請求報文的接收
當一個NS被接收到,首先要經(jīng)過有效性(valid)檢查:IP hop limit 閾值為255、ICMP校驗和有效、ICMP code值為0、target address 不是一個多播地址、若IP Source address是一個未指定地址,那么IP destination address就一定是請求節(jié)點多播地址且NS沒有包括源鏈路層地址選項。若有一項檢查通不過,這個NS就會被靜靜的丟掉。
當上述有效性檢查都通過了,就要進行第2步操作,根據(jù)IP source address是否為未指定地址而采取不同的處理動作:若不是未指定地址,且NS包括源鏈路層地址選項,那么接收者就應(yīng)該(SHOULD)為這個源IP地址創(chuàng)建或更新自己的鄰居緩存表項,若這個表項不存在,就應(yīng)該創(chuàng)建一個,且設(shè)置其可達性狀態(tài)為失效,若這個表項已經(jīng)存在,且接收的源鏈路層地址不同于緩存表項中鏈路層地址,那么緩存表項中的鏈路層地址就應(yīng)該被新接收的替換,且必須設(shè)置其可達性狀態(tài)為失效;若是未指定地址,則接收者一定不要創(chuàng)建或更新鄰居緩存表項。
(3)被請求鄰居通告的發(fā)送
當接收者創(chuàng)建或更新了鄰居緩存表項,作為對NS的回應(yīng)它就要發(fā)送NA。NA中的target address字段值從請求報文的 target address字段中拷貝得來。若請求報文中的目的 IP地址是一個多播地址,那么通告報文必須包含目標鏈路層地址選項,且若該節(jié)點是路由器,必須設(shè)置路由器標志為1。如果請求報文的源IP地址是未指定地址,那么節(jié)點必須設(shè)置請求標志為 0,且發(fā)送通告報文給全節(jié)點多播地址;否則,必須設(shè)置請求標志為1,且給請求的源發(fā)送單播通告報文。
(4)鄰居通告報文的接收
當一個NA被接收到,首先要經(jīng)過有效性檢查:IP hop limit 閾值為255、ICMP校驗和有效、ICMP code值為0、target address 不是一個多播地址、若目的IP地址是一個多播地址那么請求標志就應(yīng)該為 0。若有一項檢查通不過,這個請求報文就應(yīng)被靜靜的丟掉。
當上述有效性檢查都通過了,這個報文就是有效的通告報文,就可以進行下面的操作。節(jié)點開始搜索鄰居緩存表以定位包含有目標(target)的表項。如果未找到,那么這個被收到的NA就應(yīng)該被靜靜的丟棄。若定位到,則會根據(jù)鄰居緩存表項的可達性狀態(tài)、鄰居通告消息中的標志和準確的鏈路層地址等三方面的綜合情況來決定采取何種措施。
若可達性狀態(tài)為不完整,且NA中不包括目標鏈路層地址選項,節(jié)點就應(yīng)該將這個NA靜靜地丟棄;若可達性狀態(tài)為不完整,且NA中包含了目標鏈路層地址選項,則節(jié)點就要完成下面步驟:①將目標鏈路層地址記錄在鄰居緩存表項中;②若通告中的請求標志為1,則設(shè)置可達性狀態(tài)為可達,否則設(shè)置為失效;③根據(jù)通告中的路由器標志設(shè)置緩存中IsRouter標志;④節(jié)點開始發(fā)送數(shù)據(jù)包。
通過追蹤?quán)従影l(fā)現(xiàn)協(xié)議的RFC和IPv6尋址體系結(jié)構(gòu)的RFC,仔細研究最新的標準草案RFC4861得知,鄰居發(fā)現(xiàn)協(xié)議在許多方面對ARP協(xié)議都有改進,這里只對與地址解析相關(guān)的方面作理論探討:
(1)在IPv4中,實現(xiàn)從網(wǎng)絡(luò)層到鏈路層地址的解析是靠鏈路層的廣播機制,這在節(jié)點數(shù)目很大的網(wǎng)絡(luò)中,會占用大量的帶寬,有時還會引起“廣播風暴”;而在Ipv6中,這一過程是基于網(wǎng)絡(luò)層的多播機制實現(xiàn)的,這樣就使得在地址解析的過程中,受到地址解析所發(fā)送包的影響的節(jié)點數(shù)大大減少,而且非IPv6節(jié)點不會受到影響。
(2)路由器通告包含有鏈路層地址,這樣為了解析路由器的鏈路層地址就不再需要額外的報文交換。
(3)重定向包含有新的下一跳的鏈路層地址,那么當主機收到重定向報文時,單獨的地址解析過程就不再需要了。
(4)鄰居發(fā)現(xiàn)協(xié)議使用鄰居不可達檢測機制來檢查半連接(half-link)失敗情況,從而避免給雙向連接缺失的鄰居進一步發(fā)送流量。而ARP協(xié)議不提供這種檢測。
(5)通過設(shè)置跳數(shù)限制(hop limit)為255,鄰居發(fā)現(xiàn)協(xié)議對于偶然或有意地發(fā)送ND報文的非連接發(fā)送者具有了免疫力;在IPv4中,非連接發(fā)送者既可以發(fā)送icmp redirect消息,亦可以發(fā)送路由器通告消息。
(6)IPv4的ARP運行在數(shù)據(jù)鏈路層,這樣不同的網(wǎng)絡(luò)介質(zhì)就需要不同的ARP協(xié)議,例如Ethernet ARP與FDDI ARP就不完全相同;而鄰居發(fā)現(xiàn)協(xié)議運行在網(wǎng)絡(luò)層,與介質(zhì)無關(guān),任何網(wǎng)絡(luò)媒介都可以使用相同的鄰居發(fā)現(xiàn)協(xié)議,同時使得采用更加適合的通用的網(wǎng)絡(luò)層認證和安全機制成為可能。
(7)當一個有效的(valid)鄰居通告消息被收到,鄰居緩存表就會被搜索以定位包含有目標(target)的表項。如果未找到,那么這個被收到的鄰居通告消息就應(yīng)該被靜靜的丟棄。若定位到,則會根據(jù)鄰居緩存表項的可達性狀態(tài)、鄰居通告消息中的標志和準確的鏈路層地址等三方面的綜合情況來決定采取何種措施。這一點可以保證未經(jīng)請求的鄰居通告消息不能輕易的修改鄰居緩存表。而IPv4中的ARP就做不到,它會無條件地增加一條。
(8)當一個節(jié)點的鏈路層地址發(fā)生了改變,它希望盡快地通知它的鄰居,這時它就會發(fā)送一條無請求鄰居通告消息(Unsolicited Neighbor Advertisements)。RFC4861規(guī)定最多只能發(fā)送3條,并且要求間隔時間不得小于RetransTimer。這樣就使得偽造的鄰居通告消息不能大批量的頻繁的發(fā)送,從而減輕了這類欺騙給網(wǎng)絡(luò)造成的影響。
鄰居發(fā)現(xiàn)協(xié)議中的地址解析和IPv4中的ARP相比,它提供了許多改進,并且是非常明顯的改進。但是鄰居發(fā)現(xiàn)協(xié)議作為協(xié)議自身,它仍然無法完全避免地址解析的欺騙現(xiàn)象,欺騙者仍然可以偽造合法且有效的鄰居請求或鄰居通告消息,別有用心者仍然可以篡改真實的鄰居請求和鄰居通告報文,原因是協(xié)議本身無法驗證IP地址和MAC地址的真實性,也無法確認發(fā)送者的真實身份。
但是,正像在前面討論的那樣,鄰居發(fā)現(xiàn)協(xié)議在地址解析方面確確實實做了不少改進,使得欺騙消息不太容易修改鄰居緩存表,并且欺騙造成的影響程度也不像IPv4中的ARP欺騙那么嚴重。并且非常值得稱道的是它為我們提供了進一步采取安全措施的平臺,也就是鄰居發(fā)現(xiàn)協(xié)議運行在 IPv6之上,屬于網(wǎng)絡(luò)層協(xié)議,所以它的安全性可以由IPv6的安全機制來保證。而IPv6協(xié)議缺省情況下要求采用安全性相當高的IPSec協(xié)議來保證它的安全。IETF提出了增強NDP安全機制的算法 SEND(Secure Neighbor Discovery),并引入CGA(Cryptographically Generated Address)和公鑰密碼以保證NDP的安全。當前有一些學者在此基礎(chǔ)上,又提出了改進的安全算法,比如LL-HBA,以解決計算開銷過大的問題。所以下一代的互聯(lián)網(wǎng)中,地址解析中的欺騙問題是有望徹底解決的。
[1] RFC4861 Neighbor Discovery for IP version 6(IPv6). September 2007.T.Narten AND E.Nordmark AND W.Simpson AND H.Soliman.
[2] 楊志剛,張長河,祝岳飛.Ipv6鄰居發(fā)現(xiàn)協(xié)議安全機制研究[J].計算機應(yīng)用.2006.