禁用使用__sprintf_chk()函数

9
我注意到一个C++程序使用了sprintf,其中这个sprintf隐式调用了__sprintf_chk()。这个__sprintf_chk()似乎通过检查堆栈帧来检查缓冲区溢出。
为了我的研究目的,我想知道是否有可能禁用使用__sprintf_chk()

1
你能否编写自己的 __sprintf_chk() 函数,以便链接器不会从库中调用它? - Jamie
2个回答

18

尝试将程序中所有对 sprintf 的调用替换为以下形式:

 sprintf(params...);

转化为

 (sprintf)(params...);

这将禁用任何基于预处理器的sprintf更改 (*仅当使用类似于__sprintf_chk的函数宏更改sprintf时)。

对于gcc,有选项-fno-stack-protector -fno-mudflap。也可以是-D_FORTIFY_SOURCE=0(适用于任何glibc)

对于Ubuntu和Debian,有安全功能列表页面:http://wiki.debian.org/Hardeninghttps://wiki.ubuntu.com/Security/Features 此处列出了一些已使用的编译器标志:https://wiki.ubuntu.com/ToolChain/CompilerFlags

还有一篇关于SSP(堆栈保护程序)和Fortify_source(glibc)的论文:http://www.linuxfromscratch.org/hints/downloads/files/ssp.txt

注:同样适用于__fgets_chk __gets_chk __printf_chk __fprintf_chk __vprintf_chk __vfprintf_chk __vsprintf_chk __wmemcpy_chk __wmemmove_chk __wmempcpy_chk __wmemset_chk __wcscpy_chk __wcpcpy_chk __wcsncpy_chk __wcpncpy_chk __wcscat_chk __wcsncat_chk __swprintf_chk __vswprintf_chk __fwprintf_chk __wprintf_chk __vfwprintf_chk __vwprintf_chk __fgetws_chk __wcrtomb_chk __mbsrtowcs_chk __wcsrtombs_chk __mbsnrtowcs_chk __wcsnrtombs_chk __memcpy_chk __memmove_chk __mempcpy_chk __memset_chk __strcpy_chk __strncpy_chk __stpncpy_chk __strcat_chk以及其他一些函数。


1
这通常适用于几乎任何标准的 C 库函数,它可以被实现为预处理器宏。使用括号强制你的代码使用实际的函数而不是宏。 - David R Tribble
1
@DavidRTribble,这个括号技巧在我使用-O3时从来没有起作用过。在这种情况下,唯一起作用的是-D_FORTIFY_SOURCE=0-U_FORTIFY_SOURCE - Z boson
使用-Wl,--wrap = sprintf进行编译,并使用--wrap = sprintf进行链接。您需要一个单独的代码模块来处理__wrap_sprintf。然后,您可以在不更改任何代码的情况下使用接受的答案。我个人不喜欢关闭大量代码的警告。另请参见下面的答案。也许有一种方法可以更改构建系统,以便仅针对某些代码模块提供-D_FORTIFY_SOURCE = 0 - Daisuke Aramaki

6

__sprintf_chk()似乎通过检查栈帧来检查缓冲区溢出。 ... 出于我的研究目的,我想知道是否有可能禁用使用__sprintf_chk()?

我相信这是来自于FORTIFY_SOURCE。像这样有很多被守卫的函数。 我相信以下内容适合您:

CFLAGS += -U_FORTIFY_SOURCE

或者,您也可以尝试以下方法:

CFLAGS += -D_FORTIFY_SOURCE=0

相关:如果我在现场遇到禁用 FORTIFY_SOURCE 的软件,那么我会对其进行安全性缺陷报告。虽然可以在调试和测试时禁用它,但在生产软件中不合适。


此外,下面是一份[可能不完整]可以使用 FORTIFY_SOURCE 来保护的函数列表:

  • memcpy
  • mempcpy
  • memmove
  • memset
  • stpcpy
  • strcpy
  • strncpy
  • strcat
  • strncat
  • sprintf
  • snprintf
  • vsprintf
  • vsnprintf
  • gets

详情请见gcc -D_FORTIFY_SOURCE=1 与 -D_FORTIFY_SOURCE=2 之间的区别


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