我在编译我正在做的项目时启用了-Wstack-protector警告(一个商业的多平台C++游戏引擎,在MacOSX10.6上编译,GCC 4.2)。此标志警告那些即使启用了-fstack-protector也不会受到堆栈破坏保护的函数。GCC在建设这个项目时发出了一些警告:
不保护函数:没有至少8字节长的缓冲区
不保护局部变量:可变长度缓冲区
对于第一个警告,我发现可以调整缓冲区在函数中使用时必须具有的最小大小,以防止堆栈崩溃:可以使用--param ssp-buffer-size=X,其中X默认为8,并且可以低到1。
对于第二个警告,除非停止使用-Wstack-protector,否则无法阻止其出现。
-fstack-protector?(例如,在开发过程中,或者仅仅在跟踪bug的过程中)-fstack-protector-all?-Wstack-protector告诉我什么?这是否意味着我要降低缓冲区最小大小?如果是,-Wstack-protector似乎不是您一直想要启用的那种标志。是这样吗?发布于 2010-11-25 19:46:23
堆栈保护是一种强化策略,而不是调试策略。如果您的游戏是网络感知或其他数据来自一个不受控制的来源,打开它。如果它没有数据来自某个不受控制的地方,不要打开它。
如下所示:如果您有错误并根据攻击者可以控制的内容进行缓冲区更改,则攻击者可以重写返回地址或堆栈的类似部分,以使其执行他们的代码而不是代码。如果程序检测到这种情况,堆栈保护将中止您的程序。你的用户不会高兴,但他们也不会被黑。这不是那种在游戏中作弊的黑客行为,而是指有人利用你代码中的漏洞创建一个可能感染你的用户的漏洞。
对于面向调试的解决方案,请看一些类似的内容。
关于你的具体问题:
如果从不受控制的源获取数据,则
-fstack保护器
发出额外的代码来检查缓冲区溢出,例如堆栈崩溃攻击。这是通过向带有易受攻击对象的函数添加一个保护变量来完成的。这包括调用alloca的函数和缓冲区大于8个字节的函数。在输入函数时初始化保护程序,然后在函数退出时进行检查。如果安全检查失败,则打印错误消息,程序退出.。
-fstack-保护器-全部
除了所有功能都受到保护外,类似于-fstack保护程序。
发布于 2009-10-27 10:15:29
您确实不应该关心对正常构建的警告。更多的是一种信息信息。我希望这是很明显的,您确实有一个固有的安全考虑,与可变大小的缓冲区在堆栈上;如果大小计算错误,您将打开一个大洞。
https://stackoverflow.com/questions/1629685
复制相似问题