CVE:CVE-2007-0251
CNNVD:CNNVD-200701-203
Snort是Snort团队的一套网络入侵预防软件与网络入侵检测软件。该软件提供数据包嗅探、数据包分析和数据包检测等功能。很多其他IDS产品中也使用了Snort及其组件。
Snort的decode.c文件中DecodeGRE()函数在解码GRE协议时存在整数溢出漏洞，攻击者可能利用此漏洞获取某些敏感信息。
漏洞相关代码如下： 
==BEGIN CODE==
...
 (line 3459 decode.c)
void DecodeGRE(u_int8_t *pkt, const u_int32_t len, Packet *p)
{
    u_int8_t flags;
    u_int32_t hlen;    /* GRE header length */
    u_int32_t payload_len;
...
payload_len = len - hlen;    (calculation for payload_len is done here)
...
switch (ntohs(p->greh->ether_type))    (line 3597 decode.c)
    {
...
        default:            (line 3625 decode.c)
            pc.other++;
           p->data = pkt + hlen;
            p->dsize = (u_short)payload_len;  (truncates payload_len to 65XXX)
            return;
    }
...
==END CODE==
payload_len、len和hlen都是32位的无符整型。特制的GRE报文会触发整数下溢，导致payload_len回绕成为非常大的数值。如果使用了GRE头中正确的协议字段的话，攻击者就会到达decode.c的3627行，该行将payload_len做为无符short型分配给p->dsize，这能将payload_len截短到大约65535。
 必须以--enable-gre选项编译了Snort且以-d选项运行才能利用这个漏洞dump每个报文的应用层内容。如果接收到了恶意报文，Snort就会在内存中报文长度以外读取和记录数据，导致泄漏可能包含有其他报文内容、Snort规则和各种Snort数据结构的内存部分。
solution:Upgrade snort snort to a higher version than 2.6.1.2,and avoid the version 2.6.1.2