【问题标题】:Why does snprintf/vsnprintf open /proc/self/maps on every single call with %n?为什么 snprintf/vsnprintf 在每次使用 %n 调用时都打开 /proc/self/maps?
【发布时间】:2019-03-03 11:06:40
【问题描述】:

我(间接)调用size_t sl; vsnprintf(ap, "...%n...", ..., &sl, ...);,现在我的程序在每次调用vsnprintf 时都会打开/proc/self/maps。为什么?以及如何摆脱它?

【问题讨论】:

    标签: gcc glibc


    【解决方案1】:

    如果glibc 是用_FORTIFY_SOURCE=2 编译的,它会检查使用的格式字符串是否在可写代码段中(以防止涉及使用%n 写入黑客控制的内存位置的一类安全漏洞) .现在,为此,glibc 打开并读取/proc/self/maps 进行检查。

    解决方案:

    1. 在没有_FORTIFY_SOURCE=2的情况下编译glibc
    2. 不要使用%n(不管它是在可写内存还是只读内存中)。

    【讨论】:

    • 我肯定会选择选项 2(或者只是接受它)。 _FORTIFY_SOURCE=2 是一个非常好的功能 - 在编译自己的程序时也应该使用它(恕我直言)。
    • "在没有 _FORTIFY_SOURCE=2 的情况下编译 glibc" - 你的意思可能是“在没有 _FORTIFY_SOURCE=2 的情况下编译 你的程序”。
    • 不,glibc 是打开和读取 /proc/self/maps 事情的代码。
    • glibc 在执行%n 检查之前检查一个标志。只有当调用源自启用源代码强化编译的代码时,它才会执行它们。请注意,某些工具链会尝试自动启用源代码强化。
    • gcc -D_FORTIFY_SOURCE=2 -> /usr/include/features.h:373:4: warning: #warning _FORTIFY_SOURCE requires compiling with optimization (-O) [-Wcpp]
    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 2023-03-24
    • 2010-11-26
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多