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通知后,才会更新源地址。