应格外小心,以确保安全使用分配在堆栈上的字符数组

Extra care should be taken to ensure that character arrays that are allocated on the stack are used safely

我使用 SonarQube 和 RATS 对我的嵌入式 C 代码进行代码分析 (粗略的安全审计工具)。

在UbuntuShell下,我执行

rats --quiet --xml -w 1 . > ./rats_report.xml

获取将导入 SonarQube 的报告。

我遇到这样的错误:

Extra care should be taken to ensure that character arrays that are allocated on the stack are used safely. They are prime targets for buffer overflow attacks.

这是生成错误的函数的片段代码:

static char* GetQueryStringForValue( const char* valueLabel )
{
  static char queryString[QUERY_LEN + 1];

  memcpy( queryString, '[=10=]', sizeof(queryString) );
  snprintf( queryString, sizeof(queryString), "{'%s'", valueLabel );

  return queryString;
}

我了解到问题与分配到堆栈的缓冲区有关。

我的问题是:防止缓冲区溢出攻击的最佳做法是什么?

我应该添加特定的控件吗?

感谢您的帮助!

BR, 费德里科

这是误报,这里没有分配任何内容 "on the stack"。使用 static 存储 class 说明符,queryString 具有 静态存储持续时间 ,这意味着它在程序的整个执行时间内都存在。 C 的任何实现都不会将这样的对象 放在堆栈上

但是这个函数还是有很大的错误:

memcpy( queryString, '[=10=]', sizeof(queryString) );

这是试图取消引用 NULL 指针(NUL 字符常量隐式转换为 NULL 指针)。你的意思可能是

memset(queryString, 0, sizeof queryString);

也就是说,如果您仍然收到此警告,请按原样处理:警告。它警告您要格外小心。代码固定为使用 memset(),这里无法溢出你的 queryString


您的代码有一些不同的地方需要担心:它不是 线程安全的,因为使用了 static 变量。让调用者为 queryString.

提供缓冲区可能会更好