Re s e a r c h
唐述科 李汉菊
(华中科技大学计算机学院,武汉 430074)
【摘 要】邻居发现协议(Neighbor Discovery Protocol ,NDP)作为IPv6协议的重要组成部分,取代了IPv4中的ARP 协议、ICMP 路由发现和ICMP 重定向功能。文章分析了NDP 存在的安全问题,尤其是伪造IP 地址攻击,并在此基础上提出采用加密生成地址和签名技术等来解决这些安全威胁。【关键词】IPv6 邻居发现 安全 加密生成地址
Analysis on IPv6 Neighbor Discovery Protocol Security
Tang Shuke Li Hanju
(School of Computer Science, Huazhong University of Science and Technology, Wuhan 430074)
【Abstract 】NDP(Neighbor Discovery Protocol, NDP) is an important part of IPv6 protocol, which corresponds to a combination 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
IPv6邻居发现协议的安全性分析
*
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 地址。
A c a d e m i c 信息安全与通信保密・2006.9
101
3 CGA技术
[4]
针对邻居发现协议的伪IP 地址攻击,我们在邻居发现消息中添加新的选项来解决它的安全威胁
[5]
。我们可以采用C G A 技术
(Cr yp t o gr a ph i c a l l y Ge ne r a t e d
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 算法(方法同上),
若第一次得到的Ha s h 值与接口标志符不等则验证失败,第二次得到的Hash 值最左边16*SEC 位不全是0,则验证失败,丢弃报文,否则验证成功。
在CGA 的产生过程中,我们使用了公共密钥,而对应的私有密钥,主机将用来对消息进行签名认证。主机用私有密钥和消息作为输入进行Hash 算法和签名算法来产生签名。接受者首先进行CGA 验证(上面已经介绍了验证的具体过程),验证成功后再对签名进行验证,用CGA 参数数据结构中的公共密钥和消息作为输入进行同样的Hash 算法和签名算法,得到的值与接收到的签名进行比较,如果不一致,则认为消息不是由该地址发送出来的,签名认证失败,丢弃该消息,否则接收消息。
攻击者如果试图用CGA 技术来伪造其它节点的CGA 时,在CGA 的产生过程中,由于该地址已经存在,因此在进行第二次Hash 算法时会发生冲突,使冲突数增加,如果冲突数大于2,返回错误,并重新生成伪随机序列去再次计算CGA ,所以它无法伪造成其它节点的CGA 。若拥有该CGA 的节点离线,攻击者可以成功伪造该CGA 地址而不会产生冲突,但由于攻击者没有对应的私有密钥,在签名验证过程中仍将会失败而无法发起攻击。同样,当攻击者不使用CGA 技术,直接伪造成其它节点的CGA 以及携带对应的CGA 参数数据结构,由于攻击者没有该节点的私有密钥,因此在签名验证过程中仍将失败,无法达到攻击的效果。所以CGA 技术可以成功地防止攻击者伪造IP 地址进行攻击。
4 结束语
相比IPv4,IPv6通过采用IPSec 能够提供更高的安全性,但协议本身仍存在安全威胁。本文详细分析了伪造IP 地址攻击的安全问题,并提出了针对这些攻击的防御措施。虽然在邻居发现协议的标准文本中指出可以使用IPSec 来保护邻居发现协议,但是由于邻居发现协议实现地址自动配置功能,而IPSec 却要求建立安全连接之前要进行繁琐的手工操作,从实用性角度来说存在着一定的问题,因此
图1 CGA
参数数据结构
(下转第104页
)