吴亚铭,徐文斌,王 驭,杨天泉,梁鸿斌
随着移动互联网技术的高速发展和广泛应用,信息安全引起了社会各界的高度关注。“斯诺登”事件让人们认识到,网络攻击无处不在,信息安全形势十分严峻。
网络攻击可以分为被动攻击和主动攻击。其中,被动攻击的特性是对传输进行窃听和监测,攻击者的目的是获得传输的信息,如传输信息的内容、传输流量的分析等。主动攻击包括对数据流进行修改或伪造数据流,可分为假冒、重放、消息修改和拒绝服务等四类。重放攻击是指将通过窃听等手段获得的信息再次发送以产生非授权的效果[1]。
抗重放攻击的基本原理是在每个协议数据帧中增加抗重放变量,并保证该变量在每个数据帧中的值不相同。抗重放变量可以是随机数、时间戳和流水号等。当抗重放变量采用随机数时,通信双方需要记住某一时间段内使用过的所有随机数,保存和查询的开销很大。当抗重放变量采用时间戳时,通信双方需要准确进行时间同步。同步越好,抗重放的效果越好。当抗重放变量采用流水号时,通信双方不需要进行时间同步,存储和查询的开销也较小。
IPsec通过在被保护数据前增加一个IPsec包头,并采用数据完整性校验/验证、加/解密、抗重放判断等方式对通信数据进行保护。IPsec的“验证头(AH)”协议[2]和“封装安全载荷(ESP)”协议[3],均采用流水号方式提供抗重放服务。数据包格式分别如图1、图2所示。
图1 AH数据包格式
图2 ESP数据包格式
创建安全关联(SA)时,通信双方均将序列号(即流水号)设置为0。每个IPsec包头内的序列号均是独一无二且单调递增的。每次发送方发送数据时,序列号递增,并写入发送IPsec包头。接收方收到后,使用如图3所示的滑动窗口,判断新收到的数据是否为重放的数据报文,并在验证新收数据的合法性后,对该窗口进行滑动操作。
图3 32位滑动窗口(刚收到第N+33包,尚未验证、滑动窗口)
由图3可见,32位滑动窗口由滑动窗口宽度k、位图(32 bit)和起始序列号N三个参数构成。位图的每个比特依次对应一个数据包流的序列号,用于记录起始序列号为N的32个连续数据包是否已收到的状态,bit0对应N,bit1对应N+1,……,bit31对应N+31。滑动窗口每个比特的取值表示该序列号对应的数据包是否已收到,0表示未收到(图中用阴影表示),1表示已收到。图3中,序列号为N、N+26、N+28、N+30、N+32、N+34以及N+34之后的数据包均未收到;滑动窗口内的其他数据包、滑动窗口之前的数据包均已收到;序列号为N+33的数据包刚刚收到,但滑动窗口尚未执行滑动操作。
当新收到一个数据包时,接收方首先应判定是否为重放数据包。若为重放包,则丢弃;否则,对数据包的合法性进行验证(合法性验证包括解密、完整性验证等操作)。合法性验证失败,则丢弃;否则,接收该数据包并进行窗口滑动操作。
VPN隔离网关是一种利用IPsec技术实现网络数据加密传输并对可信网络(即内网)和不可信网络(即外网)进行安全隔离的设备,可有效防止非法数据进入可信网络,避免可信网络内的主机被非法控制以及内网的敏感数据泄露到外网。IPsec抗重放技术是一种VPN隔离网关抵抗重放攻击的有效手段。
通常,VPN隔离网关采用如图4所示的“双ARM+FPGA”架构。FPGA位于内网主机和外网主机之间,对内网和外网数据进行“摆渡”、加解密处理和数据包合法性验证[4]。
图4 VPN隔离网关
VPN隔离网关抗重放功能的实现方式与单处理器存在较大差异。在单处理器中实现IPsec时,处理器只需按照“抗重放判断、合法性验证、窗口滑动”的流程执行即可。但是,在“双ARM+FPGA”的架构中,为了保证数据的安全性,合法性验证不能在外网主机中实现,而应在FPGA中实现。因此,需要对抗重放流程进行改进。
VPN隔离网关的抗重放功能应按图5所示的流程实现。首先,由外网主机对新到的数据包进行抗重放判断,不是重放包则将数据包发送到FPGA,否则丢弃。FPGA收到数据包后进行解密和合法性验证,合法则将明文数据包发送至内网主机,否则丢弃。FPGA每次完成合法性验证后应将结果返回外网主机,外网主机根据合法性验证结果决定是否进行窗口滑动。
图5 VPN隔离网关的抗重放流程
FPGA将合法性验证的结果返回外网主机,有软件通知和硬件通知两种方式。软件通知方式是通过外设接口向外网主机发送通知(数据协议帧)。这种方式的反馈信息量较大,可能带来一定的安全隐患,但适用于SA较多的场合。硬件通知方式是通过INT引脚向外网主机发送通知(高低电平)。这种方式的反馈信息量小,安全性较高,但由于每个SA需一个INT引脚,需要的硬件资源较多,仅适用于SA较少的场合。
数据包是否为重放包的判据如下:
(1)当新到数据包的序列号小于N时,则判定该数据包为重放包;
(2)当新到数据包的序列号大于等于N且小于N+k时,若该序列号对应的位图中的bit为1,则判定该数据包为重放包;否则,判定为非重放包;
(3)当新到数据包的序列号大于等于N+k时,则判定该数据包为非重放包。
设新到数据包为非重放包,且其序列号大于滑动窗口右侧对应的序列号(即已收最大序列号)。若通过了合法性验证,则需按照以下步骤进行窗口滑动操作:
(1)计算新到数据包序列号与已收最大序列号之间的步进距离,设为d;
(2)若d大于序列号变化阈值,则拒绝滑动并返回;
(3)滑动窗口左侧对应序列号N向前滑动d,即N=N+d;
(4)位图左移d位,并将位图的bit31置位。
当窗口向前滑动时,若窗口左侧对应的数据包仍未收到,则会造成丢包。以图3中收到第N+33包为例,滑动窗口需向前步进2,而第N包仍未收到,因此第N包将被永久性拒收。
若密钥协商过程被破解而造成密钥泄漏,则攻击者可以通过先于发送方向接收方发送数据而接管通信过程,或者不断给接收方发送序列号较大的数据包而加快抗重放窗口的滑动,并造成大量数据包的拒收。此外,发送端因程序错误造成序列号异常(如突增),也会造成数据包的拒收。为了防止序列号突变,接收方设置序列号变化阈值。若序列号变化量超过该阈值,则拒绝滑动窗口。因此,抗重放机制的可靠性需要用安全的密钥保护机制和健壮可靠的程序来保证。
记录序列号的使用情况的结构体如下:
structxfrm_replay_state{
__u32 seq;//记录当前序列号的值
__u32 bitmap;//位图,如果滑动窗口长度小于32,则使用bitmap的低位。
};
统计抗重放结果的结构体如下:
structxfrm_stats{
__u32 replay_window;//丢弃的包数
抗重放判断的源代码如下:
本文从工程实践的角度对Linux的IPsec抗重放攻击的原理进行分析和研究,提出了IPsec抗重放技术在VPN隔离网关中的应用方法,设计了抗重放流程和实施细节,并针对序列号突变设计了相应的应对机制,同时实现了软件代码。
[1] William S,唐明.密码编码学与网络安全——原理与实践[M].第6版.北京:电子工业出版社,2003:131-147,216-233.William S,TANG Ming.Cryptography and Network Security-Principles and Practice[M].6th ed.Beijing:Publishing House of Electronics Industry,2003:131-147,216-233.
[2] IP Authentication Header[S].RFC4302-Dec,2005.
[3] IP Encapsulating Security Payload(ESP)[S].RFC4303-Dec,2005.
[4] 孙伟峰,张琳.一种增强型VPN安全隔离网关设计与实现[J].中国电子科学研究院学报,2015(06):628-631,651.SUN Wei-feng,ZHANG Lin.Design and Implementation of an Enhanced VPN Security Isolation Gateway[J].Journal of China Electronics Academy,2015(06):628-631,651.