【发布时间】:2015-01-16 10:51:33
【问题描述】:
在编译我正在处理的项目(商业多平台 C++ 游戏引擎,在 Mac OS X 10.6 和 GCC 4.2 上编译)时,我已启用 -Wstack-protector 警告。
即使启用了-fstack-protector,此标志也会警告无法防止堆栈粉碎的函数。
GCC 在构建项目时会发出一些警告:
没有保护功能:没有至少 8 个字节长的缓冲区
不保护局部变量:可变长度缓冲区
对于第一个警告,我发现可以调整缓冲区在函数中使用时必须具有的最小大小,以保护该函数免受堆栈粉碎:可以使用--param ssp-buffer-size=X,其中 X 为 8默认情况下,可以低至 1。
对于第二个警告,除非我停止使用 -Wstack-protector,否则我无法抑制它的出现。
- 什么时候应该使用
-fstack-protector? (例如,在开发期间的所有时间,或者只是在跟踪错误时?) - 什么时候应该使用
-fstack-protector-all? -
-Wstack-protector告诉我什么?是否建议我减小缓冲区最小大小? - 如果是这样,将大小设置为 1 有什么缺点吗?
- 看来
-Wstack-protector不是那种你想在任何时候都启用的标志,如果你想要一个无警告的构建。对吗?
【问题讨论】:
-
这些选项试图防止基于缓冲区溢出/堆栈损坏的攻击。这些文章应该会有所帮助: - What's the stack smashing protector - SSP
-
你需要使用C99的变长数组(VLA)特性吗?如果你不使用它,你就不会得到警告——你会得到保护。您真的确定您从使用 VLA 中获得了足够的收益,以至于失去保护是可以接受的吗?
-
VLA 已被删除,警告在这种情况下很有用。
-
感谢您的链接。不过,我仍然没有看到大局。堆栈保护对商业游戏真的有用吗?如果启用 -fstack-protector,游戏是否会受到任何性能影响?最小缓冲区大小设置为 1?或者是否启用了 -fstack-protector-all?
-
您希望人们尝试破解您的代码吗?如果是这样,这可能是个好主意。至于性能,你必须计算。这是一个起点:trl.ibm.com/projects/security/ssp/…
标签: c++ gcc stack protection