【旧资料整理】libnids 隐性BUG

资料时间: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源码,并不会影响逻辑,所以,没有考虑反馈给官方。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值