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,第一封邮件里的攻击方法在信令面和数据面都通用。


猜你喜欢

转载自blog.csdn.net/liaoxiangui/article/details/80604691
今日推荐