如果输入是安全的,是否有可能利用易受攻击的函数?

Is it possible to exploit a vulnerable function if its input is safe?

假设我有一个存在缓冲区溢出漏洞的代码如下

int func(const char *str){
    char buffer[100];
    unsigned short len = strlen(str);

    if(len >= 100){
        return -1;
    }
    strncpy(buffer,str,strlen(str));
    return 0; 
}

(取自此

如果从另一个函数(不是用户输入)获取输入并且 str 的长度总是小于 100,是否有办法利用此漏洞?

例如

int main() {
    int user_input;
    if (cin >> user_input) {
        if(user_input == 1)
          func("aaaa");
        else 
          func("bbbb");
    }
}

假设代码中没有其他漏洞。

只是一个假设性问题,有什么想法吗?

总之,没有漏洞。每个输入都经过清理 = 没有漏洞。

但这并不意味着您应该让它保持不变。虽然没有物理漏洞,但存在很多 潜在 漏洞。 现在您不会传递超过 100 个字符的任何内容。但是从现在开始几个月呢?你还记得你只能传递少于 100 个字符的输入吗?我不这么认为。

您可以通过以下方式修复它:

  1. 选择将 strlen 保存在 size_t 中(但如果变量长于 4GB,这不会避免缓冲区溢出)
  2. 使用动态分配的缓冲区并检查您是否设法malloc它成功
  3. 使用 strnlensizeof(buffer) 而不是 strlen
  4. len 作为第二个参数传递(可能很烦人)

使用 strncpy(a, b, strlen(b)) 与使用 strcpy(a,b) 相同。通过 if 指令中的检查在某种程度上可以防止这种情况,但是选择 unsigned short 来存储它无论如何都毫无价值。最好使用 strncpy(a, b, len) 来表明 len 确实需要存在,以防支票被重构。