缓冲区溢出
此条目可参照英语维基百科相应条目来扩充。 (2020年7月28日) |
缓冲区溢出(buffer overflow),在电脑学上是指针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并取得程序乃至系统的控制权。
“buffer overflow”的各地常用名称 | |
---|---|
中国大陆 | 缓冲区溢出 |
台湾 | 缓冲区溢位 |
缓冲区溢出原指当某个数据超过了处理程序回传堆叠位址限制的范围时,程序出现的异常操作。造成此现象的原因有:
- 存在缺陷的程序设计
- 尤其是C语言,不像其他一些高级语言会自动进行数组或者指针的堆叠区块边界检查,增加溢出风险。
- C语言中的C标准库还具有一些非常危险的操作函数,使用不当也为溢出创造条件。
- 不当的堆积操作可能造成迷途指针,可以透过特殊的堆排布(heap feng shui)取得缓冲区的堆区块(heap chunk),改变缓冲区边界并创造堆溢出的条件。
因黑客在Unix的内核发现通过缓冲区溢出可以控制内核空间劫持控制流程获得系统的最高等级权限,而成为攻击手段之一。也有人发现相同的问题也会出现在Windows操作系统上,以致其成为黑客最为常用的攻击手段,蠕虫病毒利用操作系统高危漏洞进行的破坏与大规模传播均是利用此技术。比较知名的蠕虫病毒冲击波蠕虫,就基于Windows操作系统的缓冲区溢出漏洞。
例如一个用途是对SONY的掌上游戏机PSP-3000的破解,通过特殊的溢出图片,PSP可以运行非官方的程序与游戏。同样在诺基亚智能手机操作系统Symbian OS中发现漏洞用户可以突破限制运行需要DRM权限或文件系统权限等系统权限的应用程序。
缓冲区溢出攻击从理论上来讲可以用于攻击任何有相关缺陷的程序,包括对杀毒软件、防火墙等安全产品的攻击以及对银行程序的攻击。在嵌入式设备系统上也可能被利用,例如PSP、智能手机等。
在部分情况下,当一般程序(除了驱动和操作系统内核)发生此类问题时,C++运行时库通常会终止程序的执行。
作业系统层级的保护
编辑目前OpenBSD、Linux、Windows、Mac OS等作业系统都具有buffer overflow protection(缓冲区溢位保护/记忆体位置重新定向)功能[来源请求],Linux 提供了参数 CONFIG_CC_STACKPROTECTOR 来启用 stack canary 的对内核进行保护[1],这类机制可以用于检测堆叠缓冲区是否发溢出,其他的保护机制基于记忆体位址重新定向,如Linux在4.12版本预设启用核心位址空间组态随机载入(KASLR)[2],在某种程度上可以保护作业系统,但仍还是有办法让溢出的代码到正确的位置上。其作用原理是:记忆体跟处理程序在memory中受到保护。内对外的access memory对象位置会被核心(排程器)随机定向,使其无法正确溢出。
参见
编辑参考文献
编辑- ^ Kernel Self-Protection. kernel.org. [2024-07-17].
- ^ Linux 4.12 To Enable KASLR By Default - Phoronix. [2017-12-25]. (原始内容存档于2022-06-25).
外部链接
编辑- An Overview and Example of the Buffer-Overflow Exploit. pps. 16-21.
- CERT Secure Coding Standards (页面存档备份,存于互联网档案馆)
- CERT Secure Coding Initiative (页面存档备份,存于互联网档案馆)
- Secure Coding in C and C++ (页面存档备份,存于互联网档案馆)
- SANS: inside the buffer overflow attack
- More Security Whitepapers about Buffer Overflows
- (PDF) Chapter 12: Writing Exploits III (页面存档备份,存于互联网档案馆) from Sockets, Shellcode, Porting & Coding: Reverse Engineering Exploits and Tool Coding for Security Professionals by James C. Foster (ISBN 1-59749-005-9). Detailed explanation of how to use Metasploit to develop a buffer overflow exploit from scratch.