格式字符串攻击?

时间:2015-07-10 15:12:51

标签: c security printf

最近的安全通知(http://osdir.com/ml/bugtraq.security/2015-04/msg00102.html)声明这行代码:

fprintf(stderr, (isprint(adata->contents[i])) ? "%c " : "%02x", adata->contents[i]);

受到“格式字符串攻击”的影响,我理解为使用以下内容:

fprintf(stderr, varWithUserSuppliedData);

而不是:

fprintf(stderr, "%s", varWithUserSuppliedData);

但是我没有在第一次fprintf电话中看到这一点 - 我错过了什么?

3 个答案:

答案 0 :(得分:4)

感谢@cremno为相关文件提供了GIT存储库的链接:kssl.c(请注意,不是存储库头。)

很明显,这份报告是虚假的。首先,fprintf调用没有真正的问题,尽管你可以争辩说像OpenSSL这样的安全相关产品中的代码需要超越安全,即使是偶然的一瞥就能保证安全。 (我不确定我是否会提出这个论点,但已经制定了。)

但更重要的是,有问题的代码是已禁用(请注意围绕它的预处理程序指令):

# if 0
{
    int i;
    fprintf(stderr, "%s[at%d:%d] ", label, adata->ad_type, adata->length);
    for (i = 0; i < adata->length; i++) {
        fprintf(stderr, (isprint(adata->contents[i])) ? "%c " : "%02x",
                        adata->contents[i]);
    }
    fprintf(stderr, "\n");
}
# endif

答案 1 :(得分:2)

这看起来像是一个自动生成的错误消息。显然该工具不知道将使用哪个格式字符串,因此它无法分析格式字符串和参数,并声明使用是安全的。

一个更聪明的工具可能会发现格式字符串只有两种可能性,并且每种可能性都是安全的,并且不会给出错误消息。

代码本身是安全的。当然,您可以使用if / else语句来消除该消息。在安全关键代码中,您不会只修复 错误的内容,而且看起来错误的内容。而你永远不会知道,在将fprintf转换为if / else之后,该工具可能会检测到我们都错过的真正的问题。

答案 2 :(得分:0)

信用必须转到rici,但代码看起来一切正常。

即使出现问题,一切都可以像char或hex一样安全打印。

问题可能在于对字符串进行操作的for或while循环。

你也可以发布循环吗?