导航

忆龙2009:TCP非法复位漏洞及解决方法

Posted on 2009-12-20 11:37  忆龙2009  阅读(792)  评论(0编辑  收藏  举报

 

      英国的NISCC发布236929安全公告:按照RFC 793实现的TCP协议存在安全漏洞,正常的TCP连接可以被非法的第三方复位。在已知TCP连接的四元组(源地址、目的地址、源端口号、目的端口号)的情况下,攻击者可以伪造带有RST/SYN标志的TCP报文或普通数据报文,当其sequence number落在TCP连接的滑动窗口(window size)范围内,可能导致以下攻击后果:

1.伪造RST 报文终止正常的TCP会话。

2.伪造SYN 报文终止正常的TCP会话。

3.攻击者可插入虚假数据到正常的TCP 会话。

 

      假设当前TCP连接的sequence number为A,攻击者选择一个随机sequence number为B,以步长为"window size"发送报文,因为sequence number范围为0~2^32,同时考虑到A、B所处位置的概率,攻击者平均发送"2^32/(windowsize*2)"个报文就有一个落在当前TCP连接的滑动窗口范围内,从而导致该TCP连接复位。以windowsize为8192为例,达成攻击平均需要发送262144个报文,假设报文长度为256字节,那么攻击者使用2M的ADSL线路可以在512秒复位这个TCP连接。考虑到现在很多操作系统的window size多达32K甚至64K,而且攻击者的线路带宽也远不止2M,攻击者可以更快达成攻击。

 

      达成攻击的前提条件是:已知(源地址、目的地址、源端口号、目的端口号);sequence number落在window size之内。对于一些基于TCP的应用,如telnet,ftp等,因为IP地址范围太大,猜测较难,而且这些应用的连接时间一般不长,所以威胁不算太大。但是对于BGP协议来说,要获取这四元组相对容易:首先,很多AS站点的地址信息能够在一些"BGP looking glasses"服务或者一些DNS资源信息上查到,这导致可以较为容易获取源地址和目的地址信息;其次目的端口是well-known的179;最后虽然源端口是变化的,但是研究发现,几乎所有厂商的TCP实现,在选择源端口号时是有规律的。加上BGP的TCP连接长时间存在,攻击者可以比较从容的发动攻击并得手。BGP被认为受本次发现的漏洞影响最大。

 

问题解决措施:

1.TCP问题的修改:

• RST的修改:

(1)报文段的RST被置位,顺序号不在接收窗口范围内,丢弃该报文

(2)报文段的RST被置位,并且该报文的顺序号正是期望的顺序号,reset the connection

(3)报文段的RST被置位,该报文的顺序号不是期望的顺序号,但是在窗口范围内(RCV.NXT < SEG.SEQ <= RCV.NXT+RCV.WND),send an ACK。

其中第三点修改建议经过分析,在正常情况不会对TCP造成影响。两个设备(假设A和B)建立TCP连接,如果其中一端A发起正好符合上面的条件RST报文段,这属于异常关闭流程,不遵守TCP的状态变迁,A会清除本端连接,对端B收到这个RST后,回应一个ACK给A,A收到后,发一个RST给B,这样两端就都断开连接,不存在一端连接长时间存在的问题。如果中间有报文丢弃,KEEPALIVE可以解决这个问题。

• SYN的修改:

(1)报文段的SYN被置位,顺序号不在接收窗口范围内,给对端发ACK

(2)报文段的SYN被置位,并且该报文的顺序号正是期望的顺序号(RCV.NXT == SEG.SEQ),发送ACK,在发送ACK之前,把被确认的值减一

(3)报文段的SYN被置位,该报文的顺序号不是期望的顺序号,但是在窗口范围内(RCV.NXT < SEG.SEQ <= RCV.NXT+RCV.WND),发送ACK

       报文段的ACK值检查,VRP软件处理已满足draft建议的范围((SND.UNA - MAX.SND.WND) <= SEG.ACK < SND.NXT)。

 

2.BGP的MD5认证问题修改:

      减轻被攻击影响的措施:

(1)在启动了BGP协议的一些关键应用场合,启动IPSEC;

(2)不能使用IPSEC的关键应用场合,在支持源地址逆向检查的设备上,建议用户启动源地址逆向检查功能。这可以大大减少攻击达成的可能性;

(3)严格控制启动BGP的设备的相关信息外露。