【发布时间】:2019-03-03 11:06:40
【问题描述】:
我(间接)调用size_t sl; vsnprintf(ap, "...%n...", ..., &sl, ...);,现在我的程序在每次调用vsnprintf 时都会打开/proc/self/maps。为什么?以及如何摆脱它?
【问题讨论】:
我(间接)调用size_t sl; vsnprintf(ap, "...%n...", ..., &sl, ...);,现在我的程序在每次调用vsnprintf 时都会打开/proc/self/maps。为什么?以及如何摆脱它?
【问题讨论】:
如果glibc 是用_FORTIFY_SOURCE=2 编译的,它会检查使用的格式字符串是否在可写代码段中(以防止涉及使用%n 写入黑客控制的内存位置的一类安全漏洞) .现在,为此,glibc 打开并读取/proc/self/maps 进行检查。
解决方案:
_FORTIFY_SOURCE=2的情况下编译glibc。%n(不管它是在可写内存还是只读内存中)。【讨论】:
_FORTIFY_SOURCE=2 是一个非常好的功能 - 在编译自己的程序时也应该使用它(恕我直言)。
glibc 是打开和读取 /proc/self/maps 事情的代码。
%n 检查之前检查一个标志。只有当调用源自启用源代码强化编译的代码时,它才会执行它们。请注意,某些工具链会尝试自动启用源代码强化。
gcc -D_FORTIFY_SOURCE=2 -> /usr/include/features.h:373:4: warning: #warning _FORTIFY_SOURCE requires compiling with optimization (-O) [-Wcpp] 不