当前位置:文档之家› IPv6邻居发现协议的安全性研究

IPv6邻居发现协议的安全性研究

IPv6邻居发现协议的安全性研究

宋浪

湖南理工学院计算机学院,岳阳 414000

Email:*****************

【摘要】邻居发现协议(Neighbor Discovery Protocol,NDP)作为IPv6协议的重要组成部分,取代了IPv4中的ARP协议、ICMP路由发现和ICMP重定向功能。文章分析了NDP存在的安全问题,尤其是伪造IP地址攻击,并在此基础上提出采用加密生成地址和签名技术等来解决这些安全威胁。

【关键词】IPV6 邻居发现安全加密生成地址

【中图分类号】TP393

【文献标识码】G434

Analysis on IPv6 Neighbor Discovery Protocol Security

Song Lang

(School of Computer Science,Hunan Institute Science and Technology, Yueyang 414000)【Abstract】NDP(Neighbor Discovery Protocol, NDP) is an important part of IPv6 protocol, which corresponds to acombination of ARP protocol, ICMP router discovery and ICMP redirect function in IPv4. This paper analyses security problem that may be subjected to NDP, especially IP address spoofing attack. At last, this paper puts forward CGA(Cryptographically Generated Addresses, CGA) and signature to solve the threats of IPv6 NDP.

【keywords】IPV6 neighbor discovery security CGA

1 引言

随着网络规模迅速发展,IPv4网络暴露出越来越多的问题,IETF于1992年在IPv4的基础上定义了下一代的Internet协议,被称之为“IPng”或“IPv6”。 IPv6[1]的一个显著特点是它的地址自动配置功能,它由IPv6协议中的邻居发现协议实现,主机不需要任何人工操作即可自动获得一个合法的IPv6地址进行通信。邻居发现协议[2]解决了连接在同一条链路上的所有节点之间的互连问题,它主要完成路由器发现、重定向功能、地址自动配置、重复地址检测、地址解析和邻居不可达探测的功能。然而,地址自动配置也带来了一些安全问题,使得邻居发现协议可能遭受到各种网络攻击。了解并发现各种攻击手段,提出有效的防御措施是目前亟待解决的。

2 邻居发现协议的伪造IP地址进行攻击

IPv6节点为每一个网络接口维护邻居缓存、目的缓存、前缀列表、默认路由器列表等信息。我们来看一下该攻击方法[3]:

(1) 攻击者伪造被攻击节点的IP地址,发送携带虚假的源链路层地址的邻居请求消息或虚假的目的链路层地址的邻居宣告消息,使接收者更新邻居缓存,存储错误的链路层地址,导致发送给被攻击节点的合法报文无法达到。

(2) 攻击者伪造路由器的IP地址,发送一个携带路由器生命期为0的路由器宣告消息,使得本地主机错误地认为没有默认路由器,与外网的节点无法进行正常通信。

(3) 当节点发送邻居不可达检测的邻居请求消息判断一个目的节点是否可到达时。攻击者在确定该目的节点不可到达时能伪造成它的IP地址来回复邻居不可达检测的邻居请求消息,使节点错误地认为该目的地可达,仍继续使用邻居缓存中已经无效的该目的节点的信息。

(4) 主机进入网络,能够自动配置获得IP地址,在重复地址检测过程中,攻击节点可以重复声称该申请的IP地址已被占有,使主机永远也不能获得一个IP地址。

3 CGA技术

图1

针对邻居发现协议的伪IP地址攻击,我们在邻居发现消息中添加新的选项来解决它的安全威胁 [5] 。我们可以采用CGA技术 (Cryptographically Generated Addresses,以下简称CGA)和签名来防止伪IP地址攻击。CGA技术是防止攻击者伪造IPv6地址,它是基于公私密钥对的非对称加密体系,在每次产生CGA前,主机会首先产生一对公共/私有密钥对。对公共密钥和辅助参数进行两次Hash加密算法计算产生IPv6地址的接口标志符,在此接口标志符前面加上本地网络前缀得到的IPv6地址就是CGA。私有密钥用来对来自这个地址的消息进行签名认证。公共密钥和辅助参数构成了一个CGA参数数据结构,它的格式如图1所示。

伪随机序列由计算机随机生成,在每次生成CGA的过程中使用,通过加入此随机数来加强抗攻击能力;子网前缀指的是本地子网前缀;冲突数为无符号整数,必须是0,1或2;

公共密钥为存储自己的公共密钥;扩充区域将留待以后使用。

(1) CGA的产生过程。在CGA中,接口标志符的最左边三位被规定为CGA的安全参数SEC,是一个无符号整数,可以是0到7中的一个值,它是为了加强抵御暴力破解攻击而设立的。在CGA产生过程中,首先随机产生一个伪随机序列值,并将子网前缀和冲突数置0,接着对CGA参数数据结构执行Hash算法,如果得到的Hash值最左边的16*SEC位不全为0,则伪随机序列值加1,重复第一次Hash算法,直到Hash值最左边16*SEC位全是0为止,此时确定了本次CGA过程的伪随机序列值。然后对CGA参数数据结构的冲突数置0,将子网前缀字段值设置为本地网络子网前缀,对整个数据结构再执行Hash算法,得到一个新的Hash 值,提取其最左边的64位Hash值,并将SEC的值写入到Hash值的最左边三位,得到接口标志符。将64位的子网前缀放在接口标志符前,形成128位的IPv6地址,对该地址执行邻居发现协议的重复地址检测,一旦发现地址冲突,冲突数加1,并再次执行第二次Hash算法。若冲突数大于2,则中止本次生成地址过程,否则我们得到的IPv6地址就是CGA,本次生成地址过程也确定了CGA参数数据结构的伪随机序列值和冲突数值。在主机与别的节点进行通信时,发送报文的源地址使用这个CGA,邻居发现消息选项中将携带对应的CGA参数数据结构。

(2) CGA的验证过程。接收者接收到报文后,提取报文中的CGA和CGA参数数据结构进行验证。首先判断冲突数是否是0,1或2其中任意一个值,如果不是则验证失败;然后确认CGA参数数据结构中子网前缀与地址子网前缀是否一致,如果不一致则验证失败;最后对CGA参数数据结构进行两次Hash算法(方法同上),若第一次得到的Hash值与接口标志符不等则验证失败,第二次得到的Hash值最左边16*SEC位不全是0,则验证失败,丢弃报文,否则验证成功。

在CGA的产生过程中,我们使用了公共密钥,而对应的私有密钥,主机将用来对消息进行签名认证。主机用私有密钥和消息作为输入进行Hash算法和签名算法来产生签名。接受者首先进行CGA验证(上面已经介绍了验证的具体过程),验证成功后再对签名进行验证,用CGA参数数据结构中的公共密钥和消息作为输入进行同样的Hash算法和签名算法,得到的值与接收到的签名进行比较,如果不一致,则认为消息不是由该地址发送出来的,签名认证失败,丢弃该消息,否则接收消息。

攻击者如果试图用CGA技术来伪造其它节点的CGA时,在CGA的产生过程中,由于该地址已经存在,因此在进行第二次Hash算法时会发生冲突,使冲突数增加,如果冲突数大于2,返回错误,并重新生成伪随机序列去再次计算CGA,所以它无法伪造成其它节点的CGA。

相关主题