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

14

我偶然发现了一篇文章,提到可以使用-pie -fPIE(或者说是让你的应用程序具备ASLR功能)来"启用"ASLR。常常建议使用-fstack-protector(但我很少看到说明它如何保护以及防范哪些攻击)。

是否有一个有用的选项列表和说明,说明它们如何增加安全性?

...

如果您的应用程序使用约30个未使用这些选项的库,这样的措施有多有用呢? ;)


什么是ASLR?我们在哪里可以找到关于这些标志及其性能影响的详细说明? - uss
3个回答

10

强化版的 Gentoo 使用以下标记:

CFLAGS="-fPIE -fstack-protector-all -D_FORTIFY_SOURCE=2" 
LDFLAGS="-Wl,-z,now -Wl,-z,relro"

我在默认的Phoronix基准测试套件中看到了与优化后的Gentoo Linux(包括PaX/SElinux和其他措施,不仅仅是CFLAGS)相比下降了约5-10%的性能。


4
为了更新这个答案,最好使用“-fstack-protector-strong”,仅在可能发生溢出的函数中插入堆栈保护标记,而不是在所有地方都插入。这样可以在几乎没有开销的情况下提供高效的堆栈溢出保护。 - Tomas Pruzina

5

Debian wiki上的加固页面解释了可在Linux上使用的至少最常见的选项。你的列表中至少缺少-D_FORTIFY_SOURCE=2,-Wformat,-Wformat-security以及对于动态加载器relro和now功能。


请确保不要在没有-O1(或-O2、-O3等)的情况下使用-D_FORTIFY_SOURCE=2。Debian已经修复了这个问题,但有些发行版没有修复,在-O0上会破坏构建。换句话说,不要将-D_FORTIFY_SOURCE添加到应该属于CPPFLAGS的位置。请将其与-O1/-O2/-O3/-O6选项一起添加到CFLAGS/CXXFLAGS中。 - anonymous

5
关于你的最后一个问题:
“如果您的应用程序使用了约30个库,而这些库都没有使用这些措施,那么这些措施到底有多有用呢?” ;)
PIE仅在主程序需要在随机地址加载时才是必需的。ASLR始终适用于共享库,因此,无论您使用一个共享库还是100个共享库,PIE的好处都是相同的。
堆栈保护程序仅对使用堆栈保护编译的代码有益,因此,仅在主程序中使用它将不会有帮助,如果您的库充满漏洞,则无济于事。
无论如何,我鼓励您不要将这些选项视为您的应用程序的一部分,而是作为整个系统集成的一部分。如果您在将与不受信任的、可能恶意的数据进行交互的程序中使用了30多个库(其中大部分在代码质量和安全方面都很糟糕),则建议您使用堆栈保护程序和其他安全强化选项来构建整个系统。
但请注意,最高级别的_FORTIFY_SOURCE和其他一些新的安全选项会破坏合法程序可能需要执行的有效操作,因此您可能需要分析是否安全使用它们。其中一个已知的危险选项(我忘记了是哪一个)会使printf的%n指定符无法使用,至少在某些情况下。如果应用程序使用%n来获取生成字符串中的偏移量,并需要在稍后写入该偏移量,并且该值未填充,则这本身就是一个潜在的漏洞...

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