如果一个易受攻击的函数的输入是安全的,那么它有可能利用它吗

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

本文关键字:安全 有可能 输入 一个 函数 攻击 易受 如果      更新时间:2023-10-16

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

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确实需要存在,以防检查被重构掉。