应特别注意确保安全使用堆栈上分配的字符数组

时间:2017-08-25 12:33:40

标签: c security code-analysis

我使用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, 费德里科

1 个答案:

答案 0 :(得分:4)

这是一个误报,在堆栈上没有分配任何东西"这里。对于static存储类说明符,queryString具有静态存储持续时间,这意味着它在程序的整个执行期间存在。没有C的实现会将这样的对象放在堆栈上

但是这个功能仍然非常错误:

memcpy( queryString, '\0', sizeof(queryString) );

这是尝试取消引用NULL指针(NUL字符常量被隐式转换为NULL指针)。您可能想要的是

memset(queryString, 0, sizeof queryString);

也就是说,如果您仍然收到此警告,请将其视为现状:警告。它警告你要特别小心。修复代码以使用memset()后,您无法在此处queryString溢出。

您的代码有一些不同的担忧:由于使用了static变量,它不是线程安全。让调用者为queryString提供缓冲区可能会更好。