防範IPv6中間人攻擊—IPv6 RA Guard

邱顯智 Ozzy Chiou

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:網路管理與通訊應用

 

 

IPv6是近代所有的作業系統內建安裝而且優先採用的通訊協定,所以當兩台雙堆疊主機(同時具備IPv4與IPv6封包發送能力的裝置)進行通訊時,原則上會優先選用IPv6。然而IPv6允許網路上的IPv6路由器提供用戶主機生成IPv6位址的方便功能,可以不需要像IPv4一樣另外架設DHCP伺服器,對於有心人士來說,這剛好是一個可以用來誘拐封包進行中間人攻擊的機會,這種威脅的因應措施有兩種方法:

  1. 停用所有主機的IPv6通訊協定,這種消極的做法僅適用於尚未導入IPv6的單位;
  2. 在交換器啟用IPv6 RA Guad,允許用戶主機只能接收來自合法IPv6路由器的IPv6位址配置訊息,這個方法就是今天這篇文章要介紹的主角。

在介紹IPv6 RA Guad之前,我們需要瞭解一下透過路由器配置用戶主機IPv6位址的運作方式,以及這個安全隱憂的由來。


IPv6路由器會定期在網路上傳送Router Advertisement(縮寫為RA)訊息,RA訊息透過ICMPv6進行傳送(Type=134),在IPv6表頭裡面標示的來源位址為路由器本身介面的Link-local Address(FE80開頭的IP,例如:FE80::1),目的地位址則是FF02::1(All IPv6 nodes multicast address),在RA訊息中會夾帶諸如:路由器介面IPv6位址的前綴(Prefix)以及其前綴長度(Prefix Length)……等資訊。


路由器會定期發送上述的RA訊息,同時,由於網路上已經啟用IPv6的主機都會加入FF02::1這個群組,所以就可以透過RA訊息提供的前綴(例如:2001:DB8:AA:BB::)與前綴長度資訊(例如:/64)得到IPv6位址的前64個位元,至於後面64個位元的後綴(Interface ID)則可利用自動生成的機制,湊好湊滿自己完整的IPv6位址,再經過重複位址偵測(Duplicated Address Detection)的機制,確認這組IPv6位址為獨一無二之後正式生效使用。

此外,RA訊息封包的來源IPv6位址雖然標的是路由器的Link-local Address(例如:FE80::1),但是用戶主機仍然可以將其標示為預設閘道(Default-gateway),將來如果有跨網段的IPv6通訊需求時,IPv6封包就會透過該路由器進出。

然而RA訊息預設每200秒發送一次,為了避免用戶主機啟動的時候錯送RA訊息,造成久久得不到IPv6位址的狀況,用戶主機開機的時候會主動發送Router Solicitaion(ICMP Type=133)訊息,請求網路上的IPv6 Router立即發送RA封包,當Router收到RS封包以後,就會立即在介面上再度發送RA封包,用戶主機就可以立即得到IPv6位址無須等待。

因此,對路由器而言,RA訊息不是定期發送就是收到RS訊息以後再度發送,而且目的地IPv6位址都是FF02::1,也就是所有的IPv6芸芸眾生主機們,並沒有指名道姓,再者用戶主機得到RA訊息之後生成的IPv6位址也沒有後續的回報機制,所以IPv6路由器對網路上到底存在哪些IPv6用戶主機,各自又生成了哪些IPv6位址完全狀況外,因此這種自動配置IPv6位址的機制稱為Stateless Address Autoconfiguration(縮寫為SLAAC)。

透過前述的方式,即使網路上沒有支援IPv6的DHCP伺服器(DHCPv6 Server),設定為自動取得IPv6位址的用戶主機仍然可以得到一組IPv6位址,還具備跨網段的IPv6封包發送能力,甚至如果您的路由器支援RFC8106的功能,還可以透過RA訊息順便提供DNS伺服器的IPv6位址、網域名稱尾碼……等額外資訊。

基於上述理論,攻擊者只要在網路上安裝一台IPv6路由器,開始發送RA訊息,造成用戶主機得到錯誤的IPv6前綴、預設閘道…等資訊,日後用戶主機發送的跨網段IPv6封包都有可能被誘導到攻擊者私自安裝的IPv6路由器,更有甚者,若RA訊息同時提供DNS伺服器IPv6位址(當然也是攻擊者自己架設的非法DNS伺服器),更可以提供錯誤的名稱解析結果,把不論是IPv6甚至是IPv4的上網流量誘導到攻擊者自建的伺服器,進行一系列的中間人攻擊。

有鑑於此,IPv6 RA Guard的交換器保護措施應運而生(詳見RFC6105),其動作原理非常簡單,也就是把連接在交換器的網路裝置角色(Device-role)區分為Host或是Router兩種,只有連接合法IPv6路由器的介面套用Router的Device-role,允許來自該介面RA訊息可以轉送到相同VLAN的其他所有介面;其餘介面則套用Host的Device-role,來自這些介面的RA訊息一律阻擋下來,不可轉送到其他介面,如此一來,用戶主機只會接收到來自合法IPv6路由器發送的RA訊息,便可以一勞永逸地解決SLAAC機制可能帶來的中間人攻擊威脅。


左方範例中有兩台IPv6路由器,一台是合法路由器(Legimate),連接在交換器的GigabitEthernet 0/1介面,合法路由器透過RA訊息發送2222::/64的前綴;至於非法路由器(Illegimate)則連在在交換器的GigabitEthernet 0/2介面,發送3333::/64的前綴。在交換器尚未啟用RA Guard之前,用戶電腦會接收到來自兩台路由器的RA訊息,並且同時生成兩個網段的IPv6位址。



所以我們必須在交換器啟用IPv6 RA Guard,防止用戶主機收到來自非法路由器發送的前綴(3333::/64),不過在此之前,您必須先輸入一道咒語(很難記的一道指令)解除思科交換器對IPv6相關指令的封印,並且重新開機。


接著我們需要建立兩個RAGuard Policy,第一個RAGuard Policy(Clients)定義裝置類型為Host,將這個Policy套用在不應該連接IPv6路由器的介面上(Gi 0/2-24);第二個RAGuard Policy(router)定義裝置類型為router,將這個Policy套用在連接IPv6路由器的介面上(Gi 0/1),如此一來只有來自合法路由器的RA訊息可以被轉送到其他介面,進而讓用戶主機收到,其它介面連接的IPv6路由器所發送的RA訊息就會被交換器攔截,避免用戶主機產生錯誤的IPv6位址進而避免把IPv6封包傳送給非法路由器,這樣是不是感覺安心多了呢?