irs*_*sis 4 c overflow buffer-overflow
Fortify在下面的代码中报告了一个缓冲区溢出漏洞,理由如下:
在这种情况下,我们主要关注案例"取决于在代码的直接范围之外强制执行的数据的属性".,因为我们无法验证abc.cpp中memcpy()执行的操作的安全性
void create_dir(const char *sys_tmp_dir, const char *base_name,
size_t base_name_len)
{
char *tmp_dir;
size_t sys_tmp_dir_len;
sys_tmp_dir_len = strlen(sys_tmp_dir);
tmp_dir = (char*) malloc(sys_tmp_dir_len + 1 + base_name_len + 1);
if(NULL == tmp_dir)
return;
memcpy(tmp_dir, sys_tmp_dir, sys_tmp_dir_len);
tmp_dir[sys_tmp_dir_len] = FN_LIBCHAR;
memcpy(tmp_dir + sys_tmp_dir_len + 1, base_name, base_name_len);
tmp_dir[sys_tmp_dir_len + base_name_len + 1] = '\0';
..........
..........
}
Run Code Online (Sandbox Code Playgroud)
在我看来这是一个误报,因为我们首先得到数据的大小,分配大量的空间,然后调用memcpy大小来复制.但我正在寻找有充分理由说服其他开发人员摆脱当前的实现,而不是使用c ++字符串.这个问题已经分配给他了.他只是认为这是一个误报,所以不想改变任何东西.
编辑我看到对当前代码的快速,有效的批评.希望我现在能够说服他.否则,我会拿着接力棒.:)
看看strlen(),它有输入字符串,但它没有上限,然后它会继续搜索,直到它找到\0.这是一个漏洞,因为您将执行memcpy()信任其结果(如果由于搜索时的访问冲突而不会崩溃).想像:
create_dir((const char*)12345, baseDir, strlen(baseDir));
Run Code Online (Sandbox Code Playgroud)
你标记了C和C++ ...如果你使用C++那么std::string将保护你免受这些问题.