如果一个易受攻击的函数的输入是安全的,那么它有可能利用它吗
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
确实需要存在,以防检查被重构掉。
相关文章:
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 有可能使shared_ptr协变吗
- 有可能在信号处理程序中设置promise吗
- 是否有可能实现O(N)时间和O(1)空间解决方案,以实现C++中的字符串循环移位
- 是否有可能构建面向Linux和Windows的.Net Core C++ / CLI应用程序?
- 是否有可能使用debug_info获取ELF文件的源代码?
- C++,是否有可能/如何定义在.h和.cpp源文件中调用函数的类构造函数
- 有可能在C++中有类的查找表吗
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- 是否有可能编写新的叮当声现代化规则?
- 是否有可能通过指向另一个未关联的子对象的指针来获取指向一个子对象的指针?
- 是否有可能通过演绎指南实现整个 std::make_tuple 功能?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 是否有可能具有放入容器的移动操作的类型?
- 是否有可能通过溢出 C 中的第一个元素来写入数组第二个元素
- 声明是否有可能逃脱其封闭的名称空间
- 如果一个易受攻击的函数的输入是安全的,那么它有可能利用它吗
- 这个类是否有可能不安全