软件在预期缓冲区的末尾或开头之前写入数据。
通常会导致数据损坏、崩溃或代码执行。软件可以修改索引或执行指针算术来引用缓冲区边界之外的存储位置。随后的写入操作会产生未定义或意外的结果。
危害: 影响软件的完整性。修改内存;DoS:崩溃、退出或重启;执行未经授权的代码或命令。
被利用性较高。
措施:
(1)使用不允许出现此弱点的语言或提供使此弱点更容易避免的结构。如:Java和Perl,不会受到缓冲区溢出的影响。其他语言(如Ada和C3)通常提供溢出保护,但程序员可以禁用该保护。
(2)使用经过审查的库或框架,不允许出现此弱点,或提供使此弱点更容易避免的构造。(不完整的解决方案,因为许多缓冲区溢出与字符串无关。)
(3)使用可自动提供减轻或消除缓冲区溢出的保护机制的功能或扩展来运行或编译软件。(某些编译器和扩展提供内置到编译代码中的自动缓冲区溢出检测机制,这些机制只能检测某些类型的溢出。此外,攻击仍可能导致拒绝服务,因为典型的响应是退出应用程序。)
(4)在分配和管理应用程序的内存时,请考虑遵守以下规则:
仔细检查缓冲区是否与指定的一样大。
使用接受要复制的字节数的函数时,例如strncpy(),请注意,如果目标缓冲区大小等于源缓冲区大小,则它可能不会以NULL终止字符串。
如果在循环中访问缓冲区,请检查缓冲区边界,并确保没有写入超过分配空间的危险。