随笔-15  评论-2  文章-0  trackbacks-0

今天在fortify代码扫描的时候检测出一个HOT,漏洞类型是Buffer Overflow,元凶是sprintf。

1sprintf(aTmp, "16.2f", TransAmt);

其中aTmp是20位字符数组,TransAmt为double型金额字段,值不确定。

理论上来说,是TransAmt按照格式16.2f写进aTmp的时候,有可能产生越界的错误。我一开始考虑将aTmp长度放长后,double应该可以顺利拷进aTmp,尝试将aTmp的长度分配到50,100,200,还是消除不掉这个HOT,因为不明白是double所表示的浮点数的长度有可能超过200位还是fortify认死理,而银行又强制规定代码扫描不能有HOT(-。-),所以将sprintf替换成snprintf。

1snprintf(aTmp, sizeof(aTmp), "16.2f", TransAmt);

需要注意的一点是,第二个参数的值。网上有人提到写成snprintf(buf, 10, "%10s", p)其实是不对的,因为这里的长度,是包括结束符0x00的,也就是说,既然需要按照%10s格式化,那么这里的第二个参数必须写成11而不是10。

相似的,strcpy等不带长度的字符串操作函数,如果不注意写法,往往会有Buffer Overflow的隐患。这时候,一般来说以strncpy等类似的带长度参数的函数替换就可以避免漏洞的产生。

另外,在网上查这个问题的时候,看到一个关于sprintf和snprintf的自拷贝的问题。

1sprintf(buf, "%s world\n", buf);

因为我自己有时候也会有这种写法,但也是不太确定会不会有问题。既然网上已经有明确的研究了,那我就直接拿结论。

关于这两个函数的自拷贝问题,在不同的编译器上,结果不同。编译器可以有不同的策略,有的简单的把原先的值抹去,有的会保留。因此,一般来说,我们应该尽量避免这种写法。

 

posted on 2010-02-09 23:25 RayRiver 阅读(2068) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理