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