# 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 //较强的检查 |
参考:
https://www.cnblogs.com/Spider-spiders/p/8798628.html