我想找出为什么strncpy被认为是不安全的。有没有人有任何关于这方面的文档或者利用它的例子?
发布于 2009-05-15 17:20:07
看看this site;这是一个相当详细的解释。基本上,strncpy()
不需要NUL终止,因此容易受到各种攻击。
发布于 2012-06-01 15:12:07
最初的问题显然是strcpy(3)不是memory-safe operation,所以攻击者可以提供比缓冲区更长的字符串,这将覆盖堆栈上的代码,如果仔细安排,就可以执行攻击者的任意代码。
但是strncpy(3)还有另一个问题,它并不是在目的地的每种情况下都提供null终止。(假设源字符串比目标缓冲区长。)当结果被复制到第三个缓冲区时,未来的操作可能会期望在相同大小的缓冲区之间符合以C nul结尾的字符串,并在下游发生故障。
使用strncpy(3)比使用strcpy(3)更好,但是像strlcpy(3)这样的更好。
发布于 2010-10-23 01:29:22
要安全地使用strncpy,必须(1)手动将空字符粘贴到结果缓冲区上,(2)事先知道缓冲区以空结束,并将( length -1)传递给strncpy,或者(3)知道永远不会使用任何不将缓冲区长度限制到缓冲区长度的方法复制缓冲区。
值得注意的是,strncpy将对缓冲区中超过复制字符串的所有内容进行零填充,而其他受长度限制的strcpy变体则不会。在某些情况下,这可能会消耗性能,但在其他情况下,这是一种安全优势。例如,如果使用strlcpy将"supercalifragilisticexpalidocious“复制到缓冲区中,然后再复制"it",则缓冲区将保留"it^ercalifragilisticexpalidocious^”(使用"^“表示零字节)。如果缓冲区被复制成固定大小的格式,额外的数据可能会随之标记。
https://stackoverflow.com/questions/869883
复制相似问题