假设我有一个具有缓冲区溢出漏洞的代码,如下所示
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个字符的输入?我不这么认为。
您可以通过以下方式进行修复:
- 选择将
strlen
保持在size_t
中(但如果变量长于4GB,则这不会避免缓冲区溢出) - 使用动态分配的缓冲区并检查是否成功
malloc
- 将
strnlen
与sizeof(buffer)
一起使用而不是使用strlen
- 将
len
作为第二个参数传递(可能很烦人)
使用strncpy(a, b, strlen(b))
与使用strcpy(a,b)
相同。if
指令中的检查在一定程度上防止了这种情况,但选择unsigned short
作为其存储使其毫无价值。最好使用strncpy(a, b, len)
来表明len
确实需要存在,以防检查被重构掉。