# 1.简介(在编译时进行设置):
fority是轻微的检测,用于检查缓冲区溢出的错误,在程序采用打量的字符串或者内存操作函数适用,例如:memcpy、memset、stpcpy、strcpy、strncpy、strncat、sprintf、snprintf、vsprintf、gets以及宽字符的变体。
# 2.作用:
FORTIFY_SOURCE 是一个 C/C++ 编译器提供的安全保护机制,旨在防止缓冲区溢出和其他与字符串和内存操作相关的安全漏洞。它是在编译时自动插入的一组额外代码,用于增强程序对于缓冲区溢出和其他常见安全问题的防护。FORTIFY_SOURCE 提供了以下主要功能:
- 运行时长度检查:
FORTIFY_SOURCE会在编译时自动将长度检查代码插入到一些危险的库函数中,例如strcpy、strcat、sprintf等。这些代码会检查目标缓冲区的长度,以确保操作不会导致溢出。如果检测到溢出情况,程序会立即终止,从而防止潜在的漏洞利用。 - 缓冲区溢出检测:
FORTIFY_SOURCE还会将额外的保护机制添加到一些敏感的库函数中,例如memcpy、memmove、memset等。这些机制可以检测传递给这些函数的源和目标缓冲区是否有重叠,并防止潜在的缓冲区溢出。 - 安全警告和错误报告:当
FORTIFY_SOURCE检测到潜在的缓冲区溢出或其他安全问题时,它会生成相应的警告和错误报告。FORTIFY_SOURCE提供了一层额外的安全保护,它可以在很大程度上减少常见的缓冲区溢出和字符串操作相关的安全漏洞。
# 3.级别
# 1._FORTIFY_SOURCE设置为1
启用 Fortify 功能的基本级别。 在编译时进行一些安全检查,如缓冲区边界检查、格式化字符串检查等。 在运行时进行某些检查,如检测函数返回值和大小的一致性。 如果检测到潜在的安全问题,会触发运行时错误,并终止程序执行。【这里会导致无法进行缓冲区溢出,但是格式化字符串仍然有用】
将编译器设置为优化1(gcc -O1),并且当出现上面简介中的情形时,在程序编译时就会进行检查,但并不会改变程序功能。
gcc -D_FORTIFY_SOURCE=1 只会在编译时检查(特别像一些头文件 #include <string.h>)
# 2._FORTIFY_SOURCE设置为2
当设置为2时,一些检查功能会被加入进来,但是也会造成程序崩溃;
gcc -D_FORTIFY_SOURCE=2 程序执行时也会进行检查,当检查到缓冲区溢出时,就会终止程序
# 开启:
gcc -o test test.c //默认不开启该检查
gcc -D_FORTIFY_SOURCE=1 -o test test.c //较弱的检查
gcc -D_FORTIFY_SOURCE=2 -o test test.c //较强的检查
参考: