当前位置:  开发笔记 > 编程语言 > 正文

snprintf格式字符串安全漏洞问题

如何解决《snprintf格式字符串安全漏洞问题》经验,为你挑选了1个好方法。

我们对这行代码有一个Coverity错误:

snprintf( tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value),
A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max));

错误说:

non_const_printf_format_string: "format string is not a string literal, 
potential security vulnerability if user controlled"

我将testStrings更改为const,但是没有做任何事情:

static const char *testStrings[] = {"1", ... etc};

关于这个错误究竟是什么意思的任何想法?



1> Michael..:

你的代码很好.

问题是,如果将用户控制的字符串作为printf格式字符串传递,则可能会出现安全漏洞.

例如, printf(userName);

userName由用户提供,用户可以传递"%s",并使您的函数开始访问堆栈上随机地址的数据,这可能会导致崩溃.printf将尝试从堆栈中弹出其他参数,从而导致堆栈损坏.像这样的拒绝服务攻击可能是最好的情况,可以通过让printf转储堆栈上的值来公开信息,甚至有办法让printf样式函数修改堆栈上的返回地址.

由于您的字符串不受用户控制,因此可以安全地忽略此消息.典型的解决方法是替换我给出的printf示例printf("%s", userName);,这对您的情况似乎没有帮助,因为const字符串似乎包含格式字符串.

Wikipedia在格式字符串漏洞方面有更多内容:http://en.wikipedia.org/wiki/Format_string_vulnerabilities

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有