Snort是广泛部署的开放源码网络入侵检测系统(IDS)。很多其他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数据结构的内存部分。 Snort Project Snort 2.6.1.2...
Snort是广泛部署的开放源码网络入侵检测系统(IDS)。很多其他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数据结构的内存部分。 Snort Project Snort 2.6.1.2 目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载: <a href="http://www.snort.org/" target="_blank">http://www.snort.org/</a>