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

Vis*_*was 0 c c++ printf pointers

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

char* inputString;
printf(inputString);
Run Code Online (Sandbox Code Playgroud)

是一个安全漏洞.

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

如何准确,这是一个安全漏洞?

Quora的原始答案在这里:

如果C和C++提供最佳性能,为什么我们仍然使用其他语言编写代码?

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

Jan*_*egg 10

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

问题是用户可以

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

这导致攻击者能够:

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

这里都说得很清楚.


dev*_*fan 8

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

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

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

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

  • 或者它甚至可以包含`%n`格式说明符并开始写入意外的内存...... (2认同)