NAT穿越引入的一個漏洞

UE和ePDG通過Notify(NAT_DETECTION_SOURCE_IP)和Notify(NAT_DETECTION_DESTINATION_IP)判斷兩端是否處於NAT後面。如果任何一端探測探測到自己在NAT後面,本端會把自己的通信端口改爲4500。如圖1所示,UE 位於NAT後面,所以UE將自己通信端口由500變爲了4500,由於NAT設備做了地址映射,所以ePDG看到UE的地址是114.80.10.10/64500。

NAT設備中的地址映射表有可能變化(比如NAT設備重啓或NAT keep alive時間過長),如圖2所示,ePDG收到的請求消息中的源ip地址和源端口發生了變化。在這種場景下,ePDG現在的處理方式是立即進行源地址更新,即向新地址114.80.20.20/64500發送響應消息。

問題

ePDG這種立即更新地址的行爲可能會導致DOS攻擊。如圖3所示,攻擊者在NAT與ePDG之間的網絡上截獲了一個UE發送給ePDG的數據包,篡改源地址後繼續發往ePDG。由於完整性校驗不包括源地址, ePDG對這個數據包進行完整性校驗不會有任何問題。ePDG發現其源地址發生了變化,會誤以爲NAT設備的映射發生了變化造成的,於是ePDG向新地址114.80.8.8發送IKE信令和ESP數據包。

解決方案

攻擊者的一個數據包就可以導致ePDG拒絕爲某個UE提供服務,即所謂的DOS攻擊。我們可以通過MOBIKE協議來解決這個漏洞。MOBIKE的核心思想是:UE通過某種手段探測到NAT映射發生變化後,然後把這個變化通知給ePDG。ePDG發現源地址發生變化後,只有收到UE通知後,纔會更新源地址。

具體的實現如下。由於DPD的需要, UE和ePDG之間會存在心跳消息(INFORMATIONAL交換)。MOBIKE協議在心跳消息增加Notify(NAT_DETECTION_SOURCE_IP)和Notify(NAT_DETECTION_DESTINATION_IP),如果UE發現心跳消息中NAT_DETECTION_DESTINATION_IP發生變化後,認爲NAT設備的映射發生了變化,立即發送一個只攜帶Notify(UPDATE_SA_ADDRESSES)的INFOMATIONAL 請求,通知ePDG源地址發生了變化。


圖1


圖2


圖3

我們不能假設UE的IP地址不會變化。

首先,UE可能有多個地址,UE會根據負載的變化不斷的更換地址。

其次,UE有可能位於NAT的後面。NAT分爲兩種,靜態映射和動態映射。對於採用動態映射機制的NAT設備,其改變地址映射的可能性非常大。雖然UE定時發送NAT-keepalive消息,但是這個方法不足以確保NAT設備地址映射不變化。原因如下:

█NAT-keepalive消息是一個UDP包,UDP是一個不可靠的協議

█UE發送NAT-keepalive的時間間隔與NAT設備上的超時間隔可能不一致。如果前者大於後者,則地址映射會發生變化

█NAT重啓或者發生主備切換,需要動態的重建映射表

如果認可了上述觀點,ePDG會有如下幾個問題:

問題1

UE的地址變化後,上行數據流會被ePDG統統的丟棄。

因爲在ePDG現有的實現中,用五元組來標識一個ISPEC tunnel

{rid,srcip,dst ip,protocol,spi}

如果UE的地址發生變化後,五元組發生變化,ePDG無法找到對應的tunnel,只能丟棄對應的數據報文。

問題2

如果ePDG用SPI來唯一標識一個IPSEC tunnel,第一封郵件裏的攻擊方法在信令面和數據面都通用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章