资料时间:2014年
分享时间:2014年到百度空间,空间关闭,重新整理
前段时间优化了libnids,性能提高的很明显,可是换个IDC环境部署时,竟然挂掉了。汇编调试一下core文件,从指令和寄存器来看,异常在了数组索引,最终确认是nids有个BUG:
tcp.c中函数原代码如下:
1
2
3
4
5
6
|
static
int
mk_hash_index(
struct
tuple4 addr)
{
int
hash=mkhash(addr.saddr, addr.source, addr.daddr, addr.dest);
return
hash % tcp_stream_table_size;
}
|
mkhash生成一个无符号的hash值,赋值给有符号数,再模出一个hash索引,如果hash值高位是1,就会模出负数,做为数组索引时,引起内存溢出。
解决办法就是将变量换为无符号数:
1
2
3
4
5
|
static
u_int mk_hash_index(
struct
tuple4 addr)
{
u_int hash=mkhash(addr.saddr, addr.source, addr.daddr, addr.dest);
return
hash % tcp_stream_table_size;
}
|
可是,为什么nids这个BUG一直不被人所知呢?原来mkhash的代码是这么写的,最后几行如下:
1
2
3
|
for
(i = 0; i < 12; i++)
res = ( (res << 8) + (data[perm[i]] ^ xor[i])) % 0xff100f;
return
res;
|
算hash值时模了0x00ff100f,这样,高位恒定是0,转成有符号数也不会出错,只是,我们改进了hash算法之后,就异常了,因为与ip环境有关,所以换个IDC环境才显现出来。
这个BUG是隐性的,如果不改nids源码,并不会影响逻辑,所以,没有考虑反馈给官方。