避免缓冲区溢出
缓冲区溢出是最常见的安全风险来源之一。 缓冲区溢出实质上是由将未检查的外部输入视为可信数据引起的。 使用 CopyMemory、 strcat、 strcpy 或 wcscpy 等操作复制此数据的行为可能会产生意外的结果,从而导致系统损坏。 在最好的情况下,应用程序会中止核心转储、分段错误或访问冲突。 在最坏的情况下,攻击者可以通过在进程中引入和执行其他恶意代码来利用缓冲区溢出。 将未选中的输入数据复制到基于堆栈的缓冲区是可利用故障的最常见原因。
缓冲区溢出可能以多种方式发生。 以下列表简要介绍了几种类型的缓冲区溢出情况,并提供了一些想法和资源来帮助你避免创建新风险并缓解现有风险:
-
静态缓冲区溢出
-
如果已声明在堆栈上的缓冲区写入的数据多于分配给它保留的数据,则会发生静态缓冲区溢出。 将未经验证的用户输入数据直接复制到静态变量时,会发生此错误的较不明显版本,从而导致潜在的堆栈损坏。
-
堆溢出
-
堆溢出(如静态缓冲区溢出)可能会导致内存和堆栈损坏。 由于堆溢出发生在堆内存中而不是堆栈中,因此有些人认为堆溢出不太可能导致严重问题;然而,堆溢出需要真正的编程护理,并且能够像静态缓冲区溢出一样允许系统风险。
-
数组索引错误
-
数组索引错误也是内存溢出的来源。 仔细检查边界和索引管理有助于防止这种类型的内存溢出。
防止缓冲区溢出主要与编写良好的代码有关。 始终验证所有输入,并在必要时正常失败。 有关编写安全代码的详细信息,请参阅以下资源:
- Maguire, Steve [1993], Writing Solid Code, ISBN 1-55615-551-4, Microsoft Press, Redmond, Washington.
- Howard, Michael and LeBlanc, David [2003], Writing Secure Code, 2d ed., ISBN 0-7356-1722-8, Microsoft Press, Redmond, Washington.
注意
某些语言和国家/地区可能不提供这些资源。
安全字符串处理是一个长期存在的问题,通过遵循良好的编程做法,以及通常使用和改造具有安全字符串处理函数的现有系统,可以继续解决该问题。 Windows shell 的此类函数集的示例以 StringCbCat 开头。