我使用SonarQube和RATS执行嵌入式C代码的代码分析 (安全粗略审计工具)。
在Ubuntu Shell下,我执行
rats --quiet --xml -w 1。 > ./rats_report.xml
获取将导入SonarQube的报告。
我遇到了这样的错误:
应特别注意确保安全使用堆栈上分配的字符数组。它们是缓冲区溢出攻击的主要目标。
这是生成错误的函数的代码段:
static char* GetQueryStringForValue( const char* valueLabel )
{
static char queryString[QUERY_LEN + 1];
memcpy( queryString, '\0', sizeof(queryString) );
snprintf( queryString, sizeof(queryString), "{'%s'", valueLabel );
return queryString;
}
我知道问题与分配到堆栈中的缓冲区有关。
我的问题是:防止缓冲区溢出攻击的最佳做法是什么?
我应该添加特定控件吗?
感谢您的帮助!
BR, 费德里科
答案 0 :(得分:4)
这是一个误报,在堆栈上没有分配任何东西"这里。对于static
存储类说明符,queryString
具有静态存储持续时间,这意味着它在程序的整个执行期间存在。没有C的实现会将这样的对象放在堆栈上。
但是这个功能仍然非常错误:
memcpy( queryString, '\0', sizeof(queryString) );
这是尝试取消引用NULL
指针(NUL
字符常量被隐式转换为NULL
指针)。您可能想要的是
memset(queryString, 0, sizeof queryString);
也就是说,如果您仍然收到此警告,请将其视为现状:警告。它警告你要特别小心。修复代码以使用memset()
后,您无法在此处queryString
溢出。
您的代码有一些不同的担忧:由于使用了static
变量,它不是线程安全。让调用者为queryString
提供缓冲区可能会更好。