如果输入是安全的,是否有可能利用易受攻击的函数?
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 个字符的输入吗?我不这么认为。
您可以通过以下方式修复它:
- 选择将
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
确实需要存在,以防支票被重构。
假设我有一个存在缓冲区溢出漏洞的代码如下
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
确实需要存在,以防支票被重构。