为什么printf(inputString)是一个安全漏洞?

时间:2015-11-13 13:49:01

标签: c++ c pointers printf

我正在Quora上阅读答案,我遇到了一些简单的事情:

char* inputString;
printf(inputString);

是一个安全漏洞。

我假设inputString不是简单的未初始化,而是在两个语句之间用一些外部输入初始化。

如何这是一个安全漏洞?

Quora的原始答案在这里:

  

If C and C++ give the best performance, why do we still code in other languages?

但它没有为此声明提供额外的背景信息。

3 个答案:

答案 0 :(得分:10)

我假设输入字符串是您从用户获得的字符串,而不仅仅是未初始化的值。

问题是用户可以

  • 使程序崩溃:printf ("%s%s%s%s%s%s%s%s%s%s%s%s")
  • 查看堆栈:printf ("%08x %08x %08x %08x %08x\n");
  • 查看任何位置的内存,
  • 甚至可以将整数写入进程内存中的几乎任何位置。

这导致攻击者能够:

  • 覆盖控制访问权限的重要程序标志
  • 覆盖堆栈上的返回地址,函数指针等

这一切都得到了很好的解释here

答案 1 :(得分:8)

这不仅仅是一个安全问题,而且根本不起作用,因为指针未初始化。在这种情况下,使程序崩溃=不再运行可能是(安全)问题,取决于程序的作用以及它运行的上下文。

我认为你的意思是你有一个合适的字符串。在这种情况下,如果字符串由某些外部输入(用户等)提供,则可能存在(意外的)占位符,如%s等,而printf的其余部分需要例如。广告。对于这个例子(%s而不是%d),它将开始打印所有内存内容,直到某个0字节,而不是打印一个整数,然后可能会发出一些存储在int字节之后的秘密信息。

类似的东西,即。由于错误的未经检查的用户输入而发出太多字节,例如发生。在不久前已知的“Heartbleed”漏洞中,这是一个非常大的全球性问题。 ...第一个printf参数应该是固定的,而不是来自任何变量。

其他占位符组合也是可能的,导致各种可能的影响(包括在CPU中生成错误的浮点信号,这可能会导致更严重的问题,具体取决于架构等等。)

答案 2 :(得分:1)

char* inputSting; 
printf(inputSting);

打印出未初始化的字符串是未定义的行为。未定义行为的影响可以从打印垃圾值到段错误和其他恶意。这种不可预测的模式可以被利用,从而危及安全性。

但更重要的是,没有人会写这个,因为它除了冒险发生段错误之外没有做任何有意义的事情。