应格外小心,以确保安全使用分配在堆栈上的字符数组
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
.
提供缓冲区可能会更好
我使用 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
.