首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flawfinder检测到Fix (CWE-120,CWE-20)

Flawfinder检测到Fix (CWE-120,CWE-20)
EN

Stack Overflow用户
提问于 2020-11-04 10:39:45
回答 1查看 607关注 0票数 1

我被要求使用Flawfinder分析一些C代码:

代码语言:javascript
复制
char * buffer;
size_t len;
// my_fd is a file descriptor
read(my_fd, &len, sizeof(len));
buffer = malloc(len + 1);
read(my_fd, buffer, len);
buffer[len] = '\0';

我在第2条上收到以下警告:

代码语言:javascript
复制
test.c:xx:  [1] (buffer) read:
  Check buffer boundaries if used in a loop including recursive loops
  (CWE-120, CWE-20).
test.c:xx:  [1] (buffer) read:
  Check buffer boundaries if used in a loop including recursive loops
  (CWE-120, CWE-20). 

我尝试遵循this答案,修改函数如下:

代码语言:javascript
复制
char * buffer;
size_t len;
// my_fd is a file descriptor
ssize_t ret = read(my_fd, &len, sizeof(len));

if (ret == -1 || ret != sizeof len) {
     buffer = NULL;
} else {
     buffer = malloc(len + 1);
     ret = read(my_fd, buffer, len);
     buffer[ret] = '\0';
}
free(buffer);

但这些漏洞仍被检测到。我遗漏了什么?

更新#1:

我根据@4386427建议更新了函数,检查了read()malloc()

代码语言:javascript
复制
char * buffer = NULL;
size_t len;
ssize_t ret = read(my_fd, &len, sizeof(len));

if (ret == sizeof len)
{
     buffer = malloc(len + 1);

     if (buffer != NULL)
     {
          ret = read(my_fd, buffer, len);

          if (ret == len)
          {
               buffer[ret] = '\0';
          }
          free(buffer);
     }
}

但是没有什么改变,我怎样才能进一步提高安全性呢?

更新#2

因为Flawfinder只进行模式检查,而且似乎没有更多的改进可以应用;此时,我将这些错误标记为假阳性。

EN

回答 1

Stack Overflow用户

发布于 2020-11-04 11:04:13

在最后一个代码段中,我看到两个地方没有正确地处理返回值。1)你不检查malloc 2)你不检查读取

尝试:

代码语言:javascript
复制
char * buffer;
size_t len;
// my_fd is a file descriptor
ssize_t ret = read(my_fd, &len, sizeof(len));

if (ret != sizeof len) {
     buffer = NULL;
} else {
    buffer = malloc(len + 1);
    if (buffer != NULL)        // Check that malloc was ok
    {
         ret = read(my_fd, buffer, len);

         if (ret == -1)        // Check that read was ok
         {
             // error handling....
             //
             // for now just do:
             ret = 0;
         }
         else if (ret != len)
         {
             // Didn't get as much data as expected
             //
             // Add some error handling....
         }
         buffer[ret] = '\0';
    }
}
free(buffer);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64678474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档