这段代码容易受到缓冲区溢出的影响

时间:2015-04-16 15:20:18

标签: c overflow buffer-overflow

Fortify在下面的代码中报告了一个缓冲区溢出漏洞,原因如下:

在这种情况下,我们主要关注案例"取决于在代码的直接范围之外强制执行的数据的属性。" ,因为我们不能验证memcpy()在abc.cpp

中执行的操作的安全性
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';
..........
..........

}

在我看来是误报,因为我们首先得到数据的大小,分配了大量的空间,然后调用大小要复制的memcpy。 但我正在寻找有充分理由说服其他开发人员摆脱当前的实现,而不是使用c ++字符串。这个问题已经分配给他了。他只是认为这是一个误报,所以不想改变任何事情。

编辑我看到对当前代码的快速,有效的批评。希望我现在能够说服他。否则,我会拿着接力棒。 :)

2 个答案:

答案 0 :(得分:7)

看看strlen(),它有输入字符串,但它没有上限,然后它继续搜索,直到它找到\0。这是一个漏洞,因为您将memcpy()信任其结果(如果由于搜索时的访问冲突而导致崩溃)。想象:

create_dir((const char*)12345, baseDir, strlen(baseDir));

你标记了C和C ++ ......如果你正在使用C ++,那么std::string保护你免受这些问题的影响。

答案 1 :(得分:4)

  

在我看来是误报,因为我们先获取数据大小,分配了大量空间

此假设是与警告/错误匹配的问题。在您的代码中,您假设 malloc成功分配了所请求的内存。如果您的系统没有备用内存,malloc将失败并返回NULL。当您尝试memcpy进入tmp_dir时,您正在复制到NULL,这将是个坏消息。

在将malloc视为有效指针之前,应检查以确保NULL返回的值不是{{1}}。