邪恶八进制信息安全团队技术讨论组's Archiver

cnsword 2005-5-7 13:05

[转载]Snort拒绝服务漏洞

  信息来源:辛巴达 sinbad.dhs.org.

   Snort拒绝服务漏洞

发信人: Sinbad <[email]anonymous@anonymous.com[/email]>
标  题: Snort拒绝服务漏洞
发信站: 辛巴达 (Fri Sep 27 10:19:39 2002)

发信人: Sinbad <[email]MicroBin@263.net[/email]>
标  题: Snort拒绝服务漏洞
发信站: 辛巴达 (Mon Jan 14 10:32:46 2002)

Snort拒绝服务漏洞


发现者:Sinbad
公布日期:2002年1月11日
修订日期:2002年1月30日
漏洞类型:拒绝服务

BugTraq ID:3849
[url]http://www.securityfocus.com/bid/3849[/url]

ISS xforce advisory:
[url]http://xforce.iss.net/alerts/advise108.php[/url]

受影响的版本:
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 ([email]roesch@sourcefire.com[/email], [url]www.snort.org[/url])
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版本中:
[url]http://www.securityfocus.com/archive/1/249623[/url]

另一哥们chris把第二次减去4的代码给注释了,非拉着我一起发布安全公告:
[url]http://footclan.realwarp.net/index.php?h=foot-20020111[/url]

我最初贴在bugtraq上的邮件:
[url]http://www.securityfocus.com/archive/1/249340[/url]

下面的地址是关于此漏洞的讨论,有兴趣的朋友可以进去看看!
[url]http://sinbad.zhoubin.com/read.html?board=Vul&num=55[/url]

页: [1]
© 1999-2008 EvilOctal Security Team