如果输入是安全的,是否可以利用易受攻击的功能?

smt*_*tsp 7 c c++ security exploit

假设我有一个具有缓冲区溢出漏洞的代码,如下所示

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; 
}
Run Code Online (Sandbox Code Playgroud)

(取自这个问题)

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

例如

int main() {
    int user_input;
    if (cin >> user_input) {
        if(user_input == 1)
          func("aaaa");
        else 
          func("bbbb");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

只是一个假设的问题,任何想法?

rr-*_*rr- 2

简而言之,不存在漏洞。每个输入都已清理=没有漏洞。

但这并不意味着您应该不修复它。虽然不存在物理漏洞,但存在很大的潜在漏洞。现在您不会传递任何超过 100 个字符的内容。但从现在起几个月后呢?您还记得只能传递少于 100 个字符的输入吗?我不这么认为。

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

  1. 选择保留(但如果变量长于 4GB,这不会避免缓冲区溢出strlensize_t
  2. 使用动态分配的缓冲区并检查是否malloc成功
  3. strnlen与 一起使用sizeof(buffer)而不是strlen
  4. len作为第二个参数传递(可能很烦人)

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