“__fortify_fail”有什么作用?

时间:2013-02-05 16:13:45

标签: security gcc debian

用户提交了错误报告,我的应用程序会在“__fortify_fail()”中进行段错误。

我知道这与使用Debian的“强化”标志-D_FORTIFY_SOURCE=2 -fstack-protector构建我的应用程序有关。

不幸的是,用户的backtrace并没有告诉我太多,并且用户没有超级响应(现在)。

为了更好地了解正在发生的事情,我想知道__fortify_fail实际上做了什么。

1 个答案:

答案 0 :(得分:4)

此功能通常只是一个错误记者。 glibc的示例代码是:

extern char **__libc_argv attribute_hidden;

void
__attribute__ ((noreturn))
__fortify_fail (msg)
     const char *msg;
{
  /* The loop is added only to keep gcc happy.  */
  while (1)
    __libc_message (2, "*** %s ***: %s terminated\n",
                    msg, __libc_argv[0] ?: "<unknown>");
}
libc_hidden_def (__fortify_fail)

在这里和那里可以称之为强化来源。 &#34;设防&#34;本身只是几个运行时检查。来自openat的{​​{1}}函数中的示例用法是:

io/openat.c

如果没有强化,int __openat_2 (fd, file, oflag) int fd; const char *file; int oflag; { if (oflag & O_CREAT) __fortify_fail ("invalid openat call: O_CREAT without mode"); return __openat (fd, file, oflag); } 在没有模式的情况下是可以接受的(这种情况仍然非常可疑, 合法)。

考虑O_CREAT喜欢printf + abort。

关于你的问题转向心灵感应,我可能会建议用户在用户代码中使用libc时遇到一些问题。 __fortify_fail是libc中的一个位置,其中某些运行时检查失败,因此/lib/x86_64-linux-gnu/libc.so.6(+0xebdf0)[0x7f75d3576df0]是一个无法正确调用libc的地方。