GCC编译C/C++的最严格选项集是什么?

10

哪些GCC选项能够提供最好的保护,以防止内存损坏漏洞,如缓冲区溢出和悬空指针?GCC是否提供任何类型的ROP链缓解措施?是否存在性能问题或其他问题,会阻止该GCC选项在生产中用于关键任务应用程序?

我正在查看Debian强化指南以及GCC Mudflap。以下是我考虑的配置:

-D_FORTIFY_SOURCE=2
-fstack-protector --param ssp-buffer-size=4
-fPIE -pie
-Wl,-z,relro,-z,now (ld -z relro and ld -z now)

这组选项是否有可以改进的地方?假设您知道任何酷炫的即将推出的功能,请告诉我!


2
我对你所说的“最安全”的要求感到担忧的是,你可能认为通过一些编译和链接技巧可以使自己免受恶意代码的攻击。你的首要任务应该是编写正确的代码!最终,这些编译器选项只能对有缺陷的代码产生积极的影响... - Kerrek SB
@Kerrek SB 我们谈论的破损代码是Webkit和v8。我需要构建一个非常安全的Linux系统,运行开源软件,并使用最佳保护措施。作为一个编写缓冲区溢出漏洞的人,我可以告诉你,这些现代化的缓解措施确实起到了作用,并且效果很好。 - rook
最近,clang正在进行工作,使用编译器插桩检测几类运行时错误。它有所谓的“sanitizer”来检测未初始化的内存使用、缓冲区溢出、使用后释放、数据竞争和某些未定义行为的情况。Sanitizer更适用于分析和测试,因为这些都具有运行时性能成本,但您可能想要查看一下。 - bames53
1
@ZephyrPellerin:当然,您是正确的,这些保护措施非常有用。我只是想指出,它们是第二道防线,不能成为粗糙编码的借口,如果这样说可以的话。 - Kerrek SB
这是一个重复的问题,参考什么是GCC编译C/C++最硬化的选项? - ckujau
显示剩余4条评论
3个回答

1

虽然不是GCC选项,但与GCC兼容。请查看我们的CheckPointer工具,该工具可以检测大多数内存管理错误。

执行速度会显著减慢;该工具必须跟踪指针和分配存储的有效性,这会增加开销。


非常有趣,所以这是用于分析而不是生产。像这样的酷工具让我想开始另一个模糊测试项目。 - rook
我犯了个错误。你要求C++选项;Checkpointer还不支持C++。如果你不要求保留此答案,我会将其删除。 - Ira Baxter
留下它,它仍然很有趣。另外,我们正在处理两个。 - rook

0
这不是关于CFLAGSLDFLAGS的答案,所以也许不是你特别想要的,但你也应该研究一下为加固目的编写的gcc插件。这些插件用于加固内核构建,并捕获了很多恶意代码。你可能需要为你的发行版安装一个gcc插件包,可以使用apt-cache search gcc | grep plugin或类似命令来查找包名。我相信LLVM编译器套件也有类似的插件,如果你愿意考虑使用他们的clang编译器(它大部分兼容gcc)。

0

请参阅GCC编译C/C++的最强选项是什么

因此,以下提供了合理的选项。

警告:

-Wall -Wextra -Wformat-security -Werror

硬化措施:

-mmitigate-rop -Wstack-protector -fstack-protector-strong -fstack-clash-protection -pie -fPIE -D_FORTIFY_SOURCE=2 -Wl,-z,rel -Wl,dynamicbase -Wl,nxcompat

适用于打补丁:

-fvtable-verify=std 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接