缓冲区溢出原理
缓冲区溢出原理
缓冲区是程序运行时计算机内存中的一块连续的地址空间,它用于保存给定类型的数 据。在一些高级语言的函数调用中,缓冲区是在堆栈上进行分配的。堆栈是一个后进先出的 队列,它的生长方向与内存的生长方向正好相反。具体如图所示
在正常情况下,处理器在函数调用时,将函数的参数、返回地址(即进行函数调用的那 条指令的下一条指令的地址)及基址寄存器EBP(该寄存器存储的内存地址为函数在参数和 变量压栈之前的内存地址)压入堆栈中,然后把当前的栈指针(ESP)作为新的基地址。如果 函数有局部变量,则函数会把堆栈指针ESP 减去某个值,为需要的动态局部变量腾出所需的内存空间,函数内使用的缓冲区就分配在腾出的这段内存空间上。函数返回时,弹出EBP 恢复堆栈到函数调用前的地址,弹出返回地址到EIP 以继续执行原程序。假设程序从攻击者处接收一长度超过缓冲区长度的字符串, 则会出现安全漏洞。由于堆 栈的生长方向与内存的生长方向正好相反, 如果接收的是超长字符串,EBP 和EIP 的值就 有可能被覆盖。一般情况下,会导致程序运行失败,但如果覆盖EIP 的值刚好是攻击代码的 内存地址,从而控制了程序的运行权,程序将自动跳转到攻击代码的位置,开始执行写 好的攻击代码,从而达到攻击的目的。这就是缓冲区溢出攻击的原理。
缓冲区溢出的防御现状
目前堆溢出攻击的方法分为四种主要类型。 1 编写安全的代码与代码审查在, 包括使用 安全的编程语言, 静态代码审查和动态代码审查等; 2 编译器修改在, 包括数组边界检查与 关键数据完整性检查;3 库函数修改,主要针对malloc 库溢出,修改分配和释放的内存块的布局;4 操作系统与硬件修改,通过不执行内存和随机化指令集与地址来防止堆溢出 。
- 编写安全的代码与代码审查 :已有的防范方法中较早的一种就是针对C 中的如strcpy( ) 、sprintf( ) 等库函数不进行 边界检查来进行的。这些库函数很多以“null”为字符串的结束标志, 对输入字符串的长度不 做检查, 这样导致了缓冲区溢出的第一步的实现成为可能。这类防范方法的一个简单的思路 就是培训程序员, 让他们编写安全的代码, 避免在程序的编写中使用这样的函数, 反过来使 用如strncpy( ) 、snprintf( ) 等替换的版本。静态代码审查则是通过半自动或自动工具, 对已 有的代码进行审查, 发现代码中可能存在的缓冲区溢出漏洞, 报告给程序员修改。很多安全 编程语言自身的特性可以防止缓冲区的溢出, 如类型安全语言Java、ML 等, Kowshik 的 Control- C则通过限制在数组和指针上的操作提供边界安全, 其他还有如Trevor Jim等的 Cylone, George Necula 的CCured等。程序员应尽可能使用这些安全编程语言 。
- 编译器修改 :无论堆溢出还是栈溢出, 根本原因是缓冲区的越界访问,通过编译器修改对每个数组进 行边界检查, 使得缓冲区根本无法溢出, 则能完全地避免该漏洞和溢出攻击。典型成果 有:Compaq C Compiler, Jones & Kelly 的Array Bounds Checkingfor C等。关键数据完整性检 查则试图保护如栈帧返回地址和指针等关键数据, 确保完整性检查在程序关键数据被引用 之前检测到它的改变。因此, 即便一个攻击者成功地改变程序的指针, 也会由于系统事先检 测到了指针的改变, 这个指针将不会被使用。与数组边界检查相比, 这种方法不能解决所有 的缓冲区溢出问题; 但是在性能上有很大的优势, 而且兼容性也很好。
- 库函数修改 :由于动态内存分配函数是作为库实现的, 程序对这些函数的调用是动态加载的。可以利 用库函数修改方法来保护dlmalloc等库的内存管理信息, 防止malloc 库攻击。William Robertson 等人提出在内存块( chunks) 的头部添加校验和, 在释放内存块之前进行校验和 验证的方法来确保内存块的内存管理信息没有被更改。glibc 2.3.5 引入的防止malloc 库攻击 的新安全特性就借鉴了这种方法。
- 操作系统与硬件修改: 一些硬件与操作系统修改的方法同样用来防止堆溢出等缓冲区溢出, 如设置不可执行 的缓冲区( 堆或栈) 防止攻击者执行注入的代码, 加密指令集使得攻击者在注入代码时很难 猜测指令正确的机器码表示。通过栈不可执行( 如Solar Designer 在IA32 体系上的Linux实 现) 可以有效防止一部分基于栈的缓冲区溢出攻击。Pax则是一个Linux 内核补丁, 它通过不 可执行页实现了不可执行栈和不可执行堆,不可执行缓冲区对于需要注入可执行代码这类攻 击的防范是高效的, 但对Return- into- libc 攻击则毫无办法。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Daily Study!