安全研究
安全漏洞
关于ipchains firewall的漏洞
发布日期:1999-12-15
更新日期:1999-12-15
受影响系统:
Linux ipchains firewall描述:
翻译:dspman
根据bugtraq的报告,在2.2内核的linux中的ipchain firewall存在如下的漏洞:
Data Protect的研究人员发现广泛应用在Linix系统中的ipchains firewall被发现具有潜在的安全漏洞。在某些情况下,一个攻击者可以通过防火墙的包过滤机制与某些机器通信,这些机器允许进入的数据包达到特定的端口。这类攻击和以往的讨论的分段(fragmentation)攻击不同,分段攻击者会利用分段来改写协议头中的TCP或者UDP信息。但是在这种新的攻击中,端口的信息被改写为被防火墙所屏蔽的端口,由此来达到攻破防火墙,取得端口控制的目的。
在本文中,我们会为2.2.10的内核提供一个补丁,用来修正这个错误。
程序描述
Linux ipchains firewall的代码中对IP的分段有特别的规定:IP的分段不包含供分析传输协议头的足够信息。从偏移0开始的分段因为长度不够而不能提供完整的传输头信息,将被当作偏移〉0的分段处理(在TCP中是〉1)。下面是相关的在ip_fw.c中的代码:
if (offset == 0) {
unsigned int size_req;
switch (ip->protocol) {
case IPPROTO_TCP:
/* Don''t care about things past flags word */
size_req = 16;
break;
case IPPROTO_UDP:
case IPPROTO_ICMP:
size_req = 8;
break;
default:
size_req = 0;
}
offset = (ntohs(ip->tot_len) < (ip->ihl<<2)+size_req);
}
我们可以看到,偏移为0的分段,由于太短而提供不了完整的传输协议头信息,被当作其他的分段而处理了。 这样,一个攻击者就可以进行如下的端口改写攻击了:
1. 攻击者发送一个分段,包括偏移0,IP_MF位和完整的传输协议头,这个协议头符合防火墙的过滤规则并且被发送到被攻击的主机。
2. 攻击者发送一个分段,包括偏移0,IP_MF位,并且规定长度为4个字节(这个是关键)。在分段中还包含了被防火墙屏蔽的端口。这个分段会被防火墙接收然后这些分段在被攻击的主机上重组,这样就覆盖了步骤1中的端口信息。
3. 攻击者发送一个分段,包括一个被清零的IP_MF位,标记该分段组的结束。
根据被攻击主机的重组分段的策略,步骤1和2可能要交换。
还有两条很重要的条件要满足:
1. 包过滤器必须在Linux的内核中被配置为CONFIG_IP_ALWAYS_DEFRAG。如果包过滤器在进行防火墙规则检查之前就重组了分段,那么攻击就失效了!
2. 包过滤器必须允许非第一个的分段通过。在Linux ipchains的how-to中是建议管理员选择CONFIG_IP_ALWAYS_DEFRAG或者建立这样的一条规则。有了这个规则后这类攻击将由于包过滤器的屏蔽后续分段而失效!
建议:
修复信息
如下的Linux内核补丁将关闭这个漏洞。
可能的修复方法是重新配置ipchains使它一直重组分段,或者把有关允许非第一个的IP分段通过的规则去掉。可以从ipchains的-f开关选项得到帮助!
以下是补丁:
*** linux.old/net/ipv4/ip_fw.c Wed Jun 9 05:33:07 1999
--- linux/net/ipv4/ip_fw.c Fri Jul 23 19:20:45 1999
***************
*** 37,42 ****
--- 37,45 ----
* 19-May-1999: Star Wars: The Phantom Menace opened. Rule num
* printed in log (modified from Michael Hasenstein''s patch).
* Added SYN in log message. --RR
+ * 23-Jul-1999: Fixed small fragment security exposure opened on 15-May-1998.
+ * John McDonald <jm@dataprotect.com>
+ * Thomas Lopatic <tl@dataprotect.com>
*/
/*
***************
*** 644,650 ****
default:
size_req = 0;
}
! offset = (ntohs(ip->tot_len) < (ip->ihl<<2)+size_req);
}
src = ip->saddr;
--- 647,666 ----
default:
size_req = 0;
}
!
! /* If it is a truncated first fragment then it can be
! * used to rewrite port information, and thus should
! * be blocked.
! */
!
! if (ntohs(ip->tot_len) < (ip->ihl<<2)+size_req)
! {
! if (!testing && net_ratelimit()) {
! printk("Suspect short first fragment.\n");
! dump_packet(ip,rif,NULL,NULL,0,0,0,0);
! }
! return FW_BLOCK;
! }
}
src = ip->saddr;
浏览次数:7984
严重程度:0(网友投票)
绿盟科技给您安全的保障