【发布时间】:2016-09-25 13:16:03
【问题描述】:
我们在生产中拥有一些没人关心的构建系统,这些机器运行古老版本的 GCC,例如 GCC 3 或 GCC 2。
而且我无法说服管理层将其升级到更新版本:他们说,“如果没有损坏,就不要修复它”。
由于我们维护了一个非常古老的代码库(写于 80 年代),因此这段 C89 代码在这些编译器上编译得很好。
但我不确定使用这些旧东西是否是个好主意。
我的问题是:
使用旧的 C 编译器会损害已编译程序的安全性吗?
更新:
Visual Studio 2008 为 Windows 目标构建了相同的代码,MSVC 还不支持 C99 或 C11(我不知道更新的 MSVC 是否支持),我可以在我的 Linux 机器上使用最新的海湾合作委员会。因此,如果我们只是加入一个更新的 GCC,它可能会像以前一样构建。
【问题讨论】:
-
有趣的问题 - 这可能也值得快速阅读 - developers.slashdot.org/story/13/10/29/2150211/… .. 所以较新的编译器在优化时也可能会损害安全性。
-
那些旧的 gcc 版本是否支持为 ASLR 编译为 PIC/PIE?他们支持堆栈金丝雀吗? W^X (NX)?如果不是,那么缺乏针对漏洞的缓解措施是升级的一个很好的理由。
-
仅查看 gcc 4.x 的警告可能会立即揭示大量您不知道的现有安全漏洞。
-
@OrangeDog:为什么选择 gcc 4.x? gcc6 是当前的发布系列,而 gcc 5 已经存在了一段时间。但是,是的,使用现代 gcc 和 clang 解决
-O3 -Wall -Wextra -fsanitize=undefined发现的任何问题应该会有所帮助。 -
@OrangeDog GCC 已转到营销版本号。 GCC 5 值得大版本升级,因为它们改变了默认的 C 和 C++ 标准以及 libstdc++ ABI。 GCC 6 应该被称为 5.1。