假设我有一些遗留代码,其中使用了不安全的C STL函数调用,比如
让我们假设我可以确定每个调用点的
我是从开发自动修补遗留代码的人的角度提出这个问题的。有没有人对如何最好地处理这个问题有想法呢?
strcpy
。我们都知道 strcpy
是不安全的,因为它会使程序易受缓冲区溢出问题的影响。假设我想将所有对 strcpy
的调用替换为对 strncpy
的调用。一种替换所有 strcpy(dest, src)
调用的技术涉及使用参数 (dest, src, dest长度-1)
调用 strncpy
,然后用 \0
终止 dest
。我知道这样做的问题在于我们并不总是知道 dest
的长度,因为它可能是指向在堆上分配的内存的指针。让我们假设我可以确定每个调用点的
dest
长度。我可以将所有对 strcpy
的调用替换为调用 strncpy
,这将保证我的程序免受缓冲区溢出攻击(至少免于因不当使用 strcpy
而导致的攻击)。然而,这种方法可能会默默截断数据并以不良方式改变程序行为。这种方法是否比检测截断并中止程序更好?或者允许截断但也记录下来?我是从开发自动修补遗留代码的人的角度提出这个问题的。有没有人对如何最好地处理这个问题有想法呢?
strcpy
的调用而没有审查它发生的上下文),您不应该进行截断。 - Steve Jessopstrcpy
的替代实现,它 (a) 是符合标准的正确实现,因此除了性能问题外,它不会影响任何正确调用strcpy
的程序 (尽管为了达到这一点,你不能仅仅调用strncpy
,因为strncpy
存在零填充行为),(b) 防止缓冲区溢出,(c) 用其他行为替换缓冲区溢出 UB,这有助于诊断问题 (无论是中止还是记录日志)。 - Steve Jessop