我正在Quora上阅读答案,我遇到了一些简单的事情:
char* inputString;
printf(inputString);
是一个安全漏洞。
我假设inputString不是简单的未初始化,而是在两个语句之间用一些外部输入初始化。
如何这是一个安全漏洞?
Quora的原始答案在这里:
If C and C++ give the best performance, why do we still code in other languages?
但它没有为此声明提供额外的背景信息。
答案 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);
打印出未初始化的字符串是未定义的行为。未定义行为的影响可以从打印垃圾值到段错误和其他恶意。这种不可预测的模式可以被利用,从而危及安全性。
但更重要的是,没有人会写这个,因为它除了冒险发生段错误之外没有做任何有意义的事情。