有用的GCC标志可以提高程序的安全性吗?

Cre*_*hal 13 c security gcc

通过纯粹的机会,我偶然发现了一篇文章,提到你可以"启用"ASLR -pie -fPIE(或者更确切地说,使你的应用程序能够识别ASLR).-fstack-protector也常被推荐(尽管我很少看到它如何以及针对它保护的攻击类型的解释).

是否有一些有用的选项和解释如何提高安全性?

...

当你的应用程序使用大约30个不使用它们的库时,这些措施有多大用处呢?;)

pru*_*nat 6

强化的Gentoo使用这些标志:

CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" 
LDFLAGS="-Wl,-z,now -Wl,-z,relro"
Run Code Online (Sandbox Code Playgroud)

在默认的phoronix基准测试套件中,与优化的Gentoo linux(包括PaX/SElinux和其他测量,而不仅仅是CFLAGS)相比,我看到了大约5-10%的性能下降.

  • 只是稍微更新一下这个答案,最好使用"-fstack-protector-strong",它只会在溢出可能实际发生而不是无处不在的情况下插入堆栈金丝雀.这导致几乎同样有效的SO缓解,从而降低了开销方面的成本. (2认同)

jan*_*neb 5

Debian的维基页面硬化解释至少是最公地的人这是在Linux上使用.列表中缺少的是-D_FORTIFY_SOURCE = 2,-Wformat,-Wformat-security,以及动态加载程序relro和now功能.


R..*_*R.. 5

至于你的最后一个问题:

无论如何,当您的应用程序使用大约 30 个不使用这些方法的库时,这些措施有多大用处?;)

PIE 只需要主程序能够在随机地址加载。ASLR 始终适用于共享库,因此无论您使用一个共享库还是 100 个共享库,PIE 的好处都是一样的。

堆栈保护器只会使使用堆栈保护器编译的代码受益,因此如果您的库充满漏洞,仅在主程序中使用它将无济于事。

在任何情况下,我都鼓励您不要将这些选项视为应用程序的一部分,而是将其视为整个系统集成的一部分。如果您在一个程序中使用 30 多个库(在代码质量和安全性方面可能大部分都是垃圾),并且将与不受信任的、潜在的恶意数据交互,那么构建整个系统将是一个好主意带有堆栈保护器和其他安全加固选项。

但是请记住,最高级别的_FORTIFY_SOURCE安全选项以及其他一些新的安全选项可能会破坏合法、正确的程序可能需要执行的有效操作,因此您可能需要分析使用它们是否安全。其中一个选项所做的一件已知危险的事情(我忘记了哪个)正在使它的%n说明符printf不起作用,至少在某些情况下是这样。如果应用程序使用%n偏移量获取生成的字符串,并且需要使用该偏移量稍后写入其中,并且未填充该值,则这本身就是一个潜在的漏洞......