最近的安全通知(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电话中看到这一点 - 我错过了什么?
答案 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循环。
你也可以发布循环吗?