缓冲区溢出漏洞在实战中真的难以利用了吗?
一文带你了解溢出漏洞
前两天跟一个刚入行的安全工程师聊天,他问我:"现在搞缓冲区溢出是不是已经过时了?听说现在的系统都有各种防护措施,这种漏洞根本没法用了。"我当时就笑了,这不就跟说"现在的小偷都不会撬锁了"一个道理吗?
防护措施确实多了,但...
确实,现在的操作系统都开启了DEP(数据执行保护),编译器默认加了栈保护,还有ASLR(地址空间布局随机化)这些防护机制。但你要说缓冲区溢出没法用了,那可真是太小看黑客们的创造力了。
我去年就遇到过一个真实的案例。某知名企业的内部系统,用的还是他们自己开发的定制软件。表面上看,这个系统部署在最新的Windows Server上,该有的防护一个不少。但仔细一测试,发现他们的程序在解析特定格式数据时,竟然没有开启GS保护!
那些看似无懈可击的系统
还记得去年那个轰动一时的APT攻击吗?攻击者就是利用了一个第三方组件的缓冲区溢出漏洞,绕过了所有系统级防护。关键就在于他们找到了一个没有启用ASLR的DLL文件,然后通过ROP链精心构造了攻击载荷。
你说这些防护措施没用吗?当然有用。但它们就像防盗门一样,只能防住普通的小偷,却挡不住专业的开锁匠。
现实中的缓冲区溢出攻击长什么样?
现在真正能用的缓冲区溢出攻击,往往需要满足几个条件:目标程序没有完全启用安全编译选项、存在可预测的内存地址、攻击者能精确控制溢出数据。
- 某个老旧的业务系统还在用VC6编译
- 嵌入式设备里的定制固件
- 某些为了性能而关闭安全选项的实时系统
上周我测试一个工业控制系统,发现他们的控制软件在处理网络数据包时,缓冲区大小固定为256字节,但协议解析时却没有检查长度。你说这种漏洞在实战中没法用?我当场就给你演示了一遍getshell。
所以,它真的难以利用吗?
说实话,相比十年前那种随便一个溢出就能通杀的情况,现在的确难多了。但难不代表不可能,只是需要更多的技巧和耐心。
就像我常跟团队说的:没有绝对安全的系统,只有不够努力的黑客。缓冲区溢出这个老伙计,虽然年纪大了,但依然在安全攻防的舞台上占据着一席之地。
那天测试完,我在报告里写:"建议升级到支持安全编译的现代编译器版本。"客户的技术负责人看了报告,若有所思地说:"原来我们觉得最基础的安全问题,到现在还能造成这么大的威胁。"

参与讨论
这漏洞现在确实没那么好用了,但说完全没用也太绝对了
去年碰到的工控系统就栽在这上面,协议解析根本没做长度检查
所以现在还能用的溢出漏洞主要在哪类系统里?
嵌入式设备这块确实是个重灾区,很多老固件还在跑
ASLR都能绕?这得花多少功夫啊