这些天我读过缓冲区溢出攻击,实际上我不能说我已经了解了大局,我心里有些疑惑。
所以,为了解决我的疑问,问题出现了,如果我的程序是用C语言编写的,并且所有代码都用于获取输入或复制/合并缓冲区,检查边界,是否会发生缓冲区溢出?或直接说,是输入(无论何处来)攻击者可以用来导致缓冲区溢出的唯一方法?
例如,请考虑以下代码:
int main(){
int size = 15;
char buf[size];
fgets(buf, size , stdin);
printf("%s",buf);}
是否容易受到缓冲区溢出的影响? 谢谢!:)
答案 0 :(得分:3)
实际上伙计们代码中存在错误,并且可能存在潜在的安全问题,在某些应用程序中进行编码!简而言之,检查返回值很重要。
虽然可能有人认为他的程序确实是安全的,但更大的图景是关于代码上的模式,并确保代码的假定不变量,即buf,包含0到14字节之间的NULL终止字符串长。
从手册页:
fgets()函数必须从流中读取字节到s指向的数组,直到n-1个字节 读取,或读取并传输到s,或遇到文件结束条件。 然后该字符串以空字节终止。
返回值
成功完成后,fgets()将返回s。如果流位于文件末尾,则 应设置流的文件结束指示符,并且fgets()应返回空指针。 如果发生读错误,则应设置流的错误指示符,fgets()应返回 空指针,[CX] [Option Start],并设置errno以指示错误。
安排错误条件,可能意味着没有NULL可以附加到字符串并且缓冲区被自动分配,因此printf(3)可能泄漏信息..想想Heardbleed。
当chux指出初始化自动分配的缓冲区buf[0] = '\0';
,或者静态声明buf以使其系统初始化为0时,不应该依赖于错误,buf的状态是未定义的
因此需要检查fgets的返回值。所以更像是:
{
char *s;
if ((s = fgets( buf, sizeof buf, stdin)) {
puts( s);
}
}
以下是有关安全编程的文章的链接,可能会引起您的兴趣http://www.dwheeler.com/secure-programs/
答案 1 :(得分:1)
使用'fgets'确实可以防止缓冲区溢出。根据手册页:
fgets()函数最多读取一个小于给定流中size指定的字符数,并将它们存储在字符串str中。读- 在找到换行符时,在文件结尾或错误时停止。保留换行符(如果有)。如果读取任何字符且没有错误, 附加一个“\ 0”字符以结束字符串。
注意上面的“阻止”。如果将大小设置为大于实际缓冲区,则可以提取比缓冲区可容纳的更多信息,从而导致缓冲区溢出。建议使用
sizeof(buf)
以防止可能超过缓冲区大小。