如何解决 C 代码中的堆缓冲区溢出问题?

How can I solve heap-buffer-overflow in my C-code?

我对 C 编码相当陌生,我有一个任务,我们 运行 libFuzzer 在基本 C 程序上利用问题并修复它们。这是我的 C 程序(它需要一个字符串输入并将“&”更改为“&”,“>”更改为“>”,“<”更改为“<”):

char *checkString(char str[50]) {
  int i;
  char *newstr;
  newstr = (char *)malloc(200);
  for (i = 0; i < strlen(str); i++) {
    if (str[i] == '&') {
      const char *ch = "&amp";
      strncat(newstr, ch, 4);
    } else if (str[i] == '<') {
      const char *ch = "&lt";
      strncat(newstr, ch, 3);
    } else if (str[i] == '>') {
      const char *ch = "&gt";
      strncat(newstr, ch, 3);
    } else {
      const char ch = str[i];
      strncat(newstr, &ch, 1);
    }
  }
  return newstr;
}

这是来自 libFuzzer 的错误消息:

SUMMARY: AddressSanitizer: heap-buffer-overflow (/path/to/a.out+0x50dc14) in strncat

有人知道如何解决这个堆缓冲区溢出问题吗?谢谢!

newstr = (char *)malloc(200); 之后,newstr 尚未正确初始化,因此您不能调用 strncat( newstr, ... )
你可以解决这个问题,例如通过在 malloc() 之后调用 strcpy( newstr, "" ); 或将 malloc(200) 替换为 calloc(200,1) 从而用 NUL 填充整个缓冲区。

此外,正如@stevesummit 所提到的,尽管有声明,但不能保证strlen(str) < 50。因此,与其分配固定数量的 200 个字符,不如分配 strlen(str)*4 + 1 ... 或者 strlen(str)*5 + 1 如果你正在做的是 HTML 逃避并且你意识到 & 应该被 &amp;

取代