# 1. 简介(在编译时进行设置):

fority 是轻微的检测,用于检查缓冲区溢出的错误,在程序采用打量的字符串或者内存操作函数适用,例如:memcpy、memset、stpcpy、strcpy、strncpy、strncat、sprintf、snprintf、vsprintf、gets 以及宽字符的变体。

# 2. 作用:

FORTIFY_SOURCE 是一个 C/C++ 编译器提供的安全保护机制,旨在防止缓冲区溢出和其他与字符串和内存操作相关的安全漏洞。它是在编译时自动 插入的一组额外代码 ,用于增强程序对于缓冲区溢出和其他常见安全问题的防护。 FORTIFY_SOURCE 提供了以下主要功能:

  1. 运行时长度检查: FORTIFY_SOURCE 会在编译时自动将长度检查代码插入到一些危险的库函数中,例如 strcpy、strcat、sprintf 等。这些代码会检查目标缓冲区的长度,以确保操作不会导致溢出。如果检测到溢出情况,程序会立即终止,从而防止潜在的漏洞利用。
  2. 缓冲区溢出检测: FORTIFY_SOURCE 还会将额外的保护机制添加到一些敏感的库函数中,例如 memcpy、memmove、memset 等。这些机制可以检测传递给这些函数的源和目标缓冲区是否有重叠,并防止潜在的缓冲区溢出。
  3. 安全警告和错误报告:当 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 程序执行时也会进行检查,当检查到缓冲区溢出时,就会终止程序

# 开启:

l
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

此文章已被阅读次数:正在加载...更新于