满天星 发表于 2010-9-28 23:13:16

IPv6 的SEND 研究

作者:王志强    北京邮电大学信息与通信工程学院信号与信息处理实验室, 北京(100876)
E-mail:wzhq19842000@yahoo.com.cn

摘 要:
邻居发现 (Neighbor Discovery)是IPv6协议体系的一个重要组成部分。本地连接上的节点进行通信时,如果存在恶意节点,就会产生大量的安全威胁,将导致各种各样的非法访问、拒绝服务(DoS)和重定向攻击等。SEND(Secure Neighbor Discovery)是用来保护邻居发现协议安全的,它主要包括地址加密生成Cryptographically Generated Addresses,简称CGA)和RSA签名两种技术。本文就这两种技术进行了详细的论述,并对NDP中的安全威胁的种类进行介绍,SEND能够很好的抵抗这些威胁。在邻居发现报文中使用CGA选项和RSA签名选项面对不同的威胁模式时增加网络通信的安全性。

关键词:IPv6;邻居发现协议NDP;地址加密生成CGA;RSA 签名
中图分类号:TN915

1.引言
随着网络规模迅速发展IPv4网络暴露出越来越多的问题,IETF于1992年在IPv4的基础上定义了下一代的Internet协议,被称之为IPng或IPv6。IPv6的一个显著特点是它的地址自动配置功能它由IPv6协议中的邻居发现协议实现主机不需要任何人工操作即可自动获得一个合法的IPv6地址进行通信。邻居发现协议解决了连接在同一条链路上的所有节点之间的互连问题,它主要完成路由器发现、重定向功能、地址自动配置、重复地址检测、地址解析和邻居不可达探测的功能。然而,地址自动配置也带来了一些安全问题,使得邻居发现协议可能遭受到各种网络攻击。对SEND(Secure Neighbor Discovery)进行研究就是保护NDP(Neighbor Discovery Protocol)不遭受RFC 3756中的威胁和攻击。SEND主要包括CGA(Cryptographically Generated Addresses)和RSA签名来保护NDP的安全。

2.CGA技术

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

2.2 CGA格式
CGA选项可以使接收节点对发送节点的CGA地址进行验证。CGA选项的格式如图2-1所示。


图 2-1 CGA 选项的格式

下面对选项中的字段进行解释:

[*]Type(类型):8位长的字段,值为11。
[*]Length(长度):8位长的字段,选项的整个长度的8字节数。(包括类型、长度、填充长度、保留字段、CGA参数和填充字段。)
[*]Pad Length(填充长度):8位长的字段,在CGA参数字段后面填充一定数目的字节但必须在长度字段定义的长度之内。填充字节在发送时初始化为0并且在接收端不作比较。
[*]Reserved(保留):一个8位字段为将来使用做保留。在发送端被初始化为认在接收端不作比较。
[*]CGA Parameters(CGA参数):包括CGA参数数据结构的可变长字段,CGA参数数据结构在以后进行了定义。如果消息中包含了CGA选项和CGA签名选项,对签名进行认证时,可以从CGA选项的CGA参数字段中获取地址拥有者的公钥。并且CGA签名选项中的公钥散列字段的输入值必须是这个公钥,如果检验结果不一致,则消息将被丢弃。
[*]Padding(填充):一个长度可变的字段,使选项的长度落在8字节的边界上。填充字节的长度在填充长度字段中定义。


2.3 CGA参数和Hash值
每个 CGA 都有一个CGA 参数数据结构,它的格式如图2-2 所示:


图 2-2 CGA 参数格式

下面对 CGA 参数的选项进行解释:

[*]Modifier(伪随机序列):该字段是128 位的无符号整数,它可以为任何值。在生成CGA 的过程中,伪随机序列用来执行Hash 扩展,并通过引进随机性增加地址的加密性。
[*]Subnet Prefix(子网前缀):该字段包含CGA 的64 位长子网前缀。
[*]Collision Count(冲突次数):它是一个8 位无符号整数,值必须是0,1 和2。在生成CGA 的过程中,对生成的该地址进行DAD 检测,如果发现有冲突,那么冲突次数就加1。
[*]Public Key(公共密钥):它是一个变长字段,包含地址拥有者的公共密钥。公共密钥的格式必须是Internet X.509 证书配置中定义的SubjectPublicKeyInfo 类型,它的结构就是该类型中的DER-encoded ASN.1。RSA 公共密钥的长度必须至少是384 位。在SEND 中,不考虑其他类型的公共密钥,因为它们可能导致执行之间的不兼容。该字段的长度是由ASN.1 编码确定的。
[*]Extension Fields(扩展字段):它是个目前还没有规范的变长字段。该字段的未来版本会包括CGA 参数数据结构中新增的数据字段。


2.4 生成CGA
CGA地址的生成入选项有四个:128位的修正序列生成一个新的CGA地址需要的输64位的EUI-64地址、8位的冲突计数和地址所有者的公钥。生成一个新的CGA地址的时间随着安全参数值的增加呈指数级增加。

CGA地址的生成过程如下:

[*]选择安全参数的值,Sec=0,1,2,...安全参数的取值将会影响到修正序列的生成时间。
[*]生成随机的或伪随机的128位序列作为修正序列。
[*]设置8位的冲突计数参数值为0。
[*]连接修正序列、EUI-64地址、8位零字节和地址拥有者的公钥然后使用SHA -1算法进行散列运算,生成Hash2散列。
[*]取输出的Hash2散列右边的64+20*Sec位,其中最左边的16*Sec位和零比较。如果非零,Hash2序列加1,返回第4步。(如果Sec= 0,则比较很容易成功)
[*]连接随机序列、EUI-64地址、冲突计数参数和公钥,然后使用SHA-1算法进行散列运算,生成Hashl散列。
[*]连接64位的路由前缀和Hashl散列输出的最左边的64位得到一个128位的 CGA地址。
[*]把U /L位和I/G位置1,把最右边三位设为sec的值。
[*]如果检测到地址冲突,冲突计数加1返回第6步。但是,经过三次冲突后,停止返回并报错。


2.5 验证CGA
验证一个CGA地址需要用到的CGA参数为:修正序列、64位的EUI-64地址,冲突计数、地址所有者的公钥和安全参数。验证CGA地址的步骤如下:

[*]检查CGA参数数据结构中的冲突计数,它的值必须是0,1或2。如果冲突计数的值超出范围,则验证失败。
[*]对CGA参数数据结构执行SHA-1散列算法,取出散列值的最左边的64位, 这就是生成过程中的Hashl。
[*]把Hashl和地址的接口标识符进行比较。忽略U/L位、I/G位和最右边的 3 位。如果两个序列不一致,则验证失败。
[*]从64位接口标识符的最右边3位读取安全参数Sec的值。
[*]从左到右连接修正序列、64十8位0字节和公钥,并执行SHA-1散列运算。从散列值的最左边取出112位,这对应于生成算法中的Hash2序列。
[*]把Hash2序列中最左边的16-Sec位和零做比较,如果有的位不为零,则验证失败。否则,CGA地址验证成功。〔如果Sec=0,则这一步的验证几乎不会败)



3.RSA签名

3.1 RSA签名选项格式
签名选项在发送过程中附加到邻居发现消息中,它的格式如图3-1所示:


图 3-1 RSA 签名格式


[*]Type(类型):8位长的字段,值为12。
[*]Length(长度):8位长的字段,整个选项的长度(包括签名选项中的所有字段),必须落在8字节的边界上。
[*]Reserved(保留):16位长的字段,保留用作将来使用。发送节点必须初始化为0,接收节点忽略该字段。
[*]Key Hash(公钥散列):长度为128位,把用于验证签名的公钥进行SHA-1散列后,取出散列值的最左边的128位形成该字段。公钥存放于同一消息的CGA选项的CGA参数数据结构中。这样做的目的时把签名和公钥进行相关联。公钥也可以保存在接收主机的证书缓存当中。
[*]Digital Signature(数字签名):变长字段,包括一个数字签名。使用发送节点的私钥和签名信息生成。签名的计算使用RSASSA-PKCS1-v1_5 算法和SHA-1算法。数字签名字段在公钥散列字段的后面。数字签名字段的长度为签名选项的长度减去其他字段(包括可变的填充字段)的长度。
[*]Padding(填充字段):长度可变,在签名选项的最后填充由填充长度字段定义的字节数。


3.2 发送端的处理原则
如果发送节点支持CGA机制,则在发送邻居请求/公告消息、路由公告消息和重定向消息必须添加签名选项;除非发送节点使用未指定的IP地址,否则在路由请求消息中也要添加签名选项。
一个发送节点在发送消息是使用签名选项的话,消息的构造过程如下:

[*]用于签名的信息由消息除签名选项外的所有部分构成。
[*]签名选项作为选项中的最后一个添加到消息中。
[*]使用地址所有者的私钥对用于签名的信息进行签名,把生成的符合PKCS #1规范的签名放进签名选项的数字签名字段中取。


3.3 接收端的处理原则
如果在邻居请求和邻居公告消息、路由公告消息和重定向消息中没有签名选项,则接收主机将把它视为不安全消息,可以按照非CGA节点发送的邻居发现消息进行处理。如果本地链路强制要求所有的节点使用签名选项,则接收节点将丢弃这个不安全消息。
不含签名选项的路由请求消息也必须视为不安全消息,除非消息的源地址为未指定地址。
包含签名选项的邻居发现消息(邻居请求消息、邻居公告消息、路由请求消息、路由公告消息、重定向消息)按以下步骤进行检查:

[*]接收节点忽略签名选项以后的其他选项。
[*]公钥散列字段应该能够指明如何得到所需要的公钥。或者是前面的CGA 选项选项中的公钥字段,或者通过其他方法。
[*]数字签名字段必须被正确编码,不能超出签名字段定义的长度。
[*]接收节点得出的数字签名必须和发送节点生成的数字签名一致。

如果发送的消息没有通过验证过程的任何一步就会被无声丢弃。对于明显的DoS攻击,接受者也会丢弃接收到的消息。

4. NDP的安全威胁
NDP是在基于完全可信网络的前提下提出的,其安全威胁主要分为两种:

[*]重定向攻击:恶意节点将报文从最后一跳路由器或者其他合法接收节点重定向到链路上的其他节点。
[*]拒绝服务攻击:恶意节点破坏被攻击节点和其他所有节点间的通信。比如洪水式拒绝服务攻击,恶意节点重定向其他节点的通信到被攻击节点,从而在被攻击节点产生大量的虚假通信攻击。


4.1 重定向攻击

[*]恶意的最后一跳路由器
攻击者周期性地发送路由器通告,假冒真的最后一跳路由器声明其生命期值为0,被欺骗的主机就会认为该路由器不再提供服务,进而选择假的主机作为默认路由器,攻击者就有机会截取主机的通信或者实施中间人攻击。
[*]邻居请求或通告的欺骗
由于邻居缓存默认总是用新的信息来覆盖旧的,攻击者只需发送包含不同链路层地址的邻居请求或邻居通告,就能将本应发送到合法节点的报文转发到其他链路层地址。但攻击时间受限,攻击者必须一直对虚假的链路层地址作出响应以使攻击继续。此类攻击类似于IPv4中的ARP欺骗攻击。
[*]虚假的重定向报文
利用重定向报文将发送到固定目的节点的报文转发到链路上的另一个地址。攻击者使用最后一跳路由器作源地址发送重定向报文给合法主机。主机检查报文源地址是自己的默认路由器,从而接受该重定向。


4.2 拒绝服务攻击

[*]虚假的地址配置前缀
攻击节点发出包含错误子网前缀的路由器通告,主机使用错误的前缀信息通过地址自动配置机制设置IP地址,因此该主机无法在子网中正常运行。
[*]重复地址检测的拒绝服务攻击
攻击者通过响应所有的重复地址检测过程,声称已使用被攻击者请求的地址,被攻击者将无法获取IP地址,进而实现拒绝服务攻击。
[*]邻居不可达检测(NUD)失败
节点通常依赖上层信息来确定其他节点是否可达,但如果上层通信的延迟足够长,节点就会激活NUD,发送邻居请求到目的节点,如果可达,目的节点会回应邻居通告。否则经过几次重试失败后,该节点就会删除对应的邻居缓存记录。攻击者持续发送虚假邻居通告来响应NUD的邻居请求,进而造成拒绝服务。
[*]虚假的路由器通告参数
主机使用路由器通告中的参数来确定自己是否要进行保持状态的地址配置。攻击者发送包含恶意参数的虚假路由器通告来破坏通信。比如声明较小值的跳数限制,主机按此参数配置后发出的数据包将无法到达目的节点。


5.结束语
利用SEND中的CGA技术和RSA签名可以阻止NDP的两种主要安全威胁:重定向攻击和拒绝服务攻击。CGA技术可以防止邻居发现协议的伪造IP地址进行攻击。RSA签名可以包含整个NDP报文的安全,它能防止中间人对NDP中的报文修改。虽然CGA技术和RSA签名能够保护NDP的安全,但是主机和路由器要花费额外的时间进行计算和验证,攻击者有可能会利用这个不利因素,向被攻击者大量的发送SEND报文,使被攻击者处理不了这些报文,而导致DoS攻击。因此需要对SEND中的CGA和RSA签名进行简化,这是要进一步研究的。

参考文献
杨志刚,张长河,祝跃飞.IPv6 邻居发现协议安全机制研究.计算机应用,2006,26(4):939.
李睿.IPv6 邻居发现的安全性研究.山西:太原理工大学,2005:39~47.
T. Aura, Cryptographically Generated Addresses (CGA), RFC 3972, March 2005:5~10.
J. Arkko, Ed., J. Kempf, P. Nikander, Secure Neighbor Discovery(SEND), RFC 3971, March 2005:10~18.
Nikander P, Kempf J, Nordmark E, IPv6 Neighbor Discovery (ND) Trust Models and Threats, RFC 3756, May 2004:8~20.

Research on IPv6 SEND
WANG Zhiqiang

School of Information and Telecommunications, Beijing University of Posts and
Telecommunications, Beijing, (100876)

Abstract
Neighbor Discovery for IPv6 is a main part of IPv6 Protocol. If there are malicious nodes on a local
link, this may creates a great number of new security threats such as DoS and redirect threats. SEND is
used to secure the Neighbor Discovery Protocol, it contains cryptographically generated address and
RSA signature. This paper discussed CGA and RSA signature in detail, and introduce some types of
security threats in NDP, SEND method can resist those threats. When face many threats , it can enhance
communication security using CGA and RSA signature.

Keywords:
IPv6; Neighbor Discovery Protocol; Cryptographically Generated Addresses; RSA signature

作者简介:王志强(1984—),男,硕士研究生,主要研究方向是计算机网络。
页: [1]
查看完整版本: IPv6 的SEND 研究