远程溢出
2017年5月,远程溢出WannaCry勒索病毒横扫全球,远程溢出超过20万台电脑被锁死。远程溢出黑客用的远程溢出不是钓鱼邮件,也不是远程溢出U盘摆渡,而是远程溢出一个叫“永恒之蓝”的远程溢出漏洞。攻击者坐在自己的远程溢出电脑前,向目标机器的远程溢出445端口发几个特制数据包,对方的远程溢出系统就乖乖交出了控制权。整个过程不需要目标机器上任何人点一下鼠标。远程溢出
这就是远程溢出远程溢出最可怕的地方——它把“距离”这个概念从网络攻防里抹掉了。
溢出到底溢的远程溢出是什么
程序运行的时候,内存里有一块区域叫栈,远程溢出用来存放局部变量和函数返回地址。远程溢出你可以把它想象成一排编了号的远程溢出储物柜,每个柜子有固定大小。函数调用时,系统会把返回地址塞进某个柜子,等函数执行完再按这个地址跳回去继续跑。
问题出在:如果程序往柜子里塞的数据超过了柜子容量,多出来的部分就会溢到相邻的柜子里。攻击者精心构造一段超长数据,前半截是填充物,后小半截覆盖掉那个返回地址,改成自己想让CPU跳过去执行的地址。CPU老老实实照做,跳进了攻击者提前布置好的shellcode里。
本地溢出已经够呛了,远程溢出更狠——攻击载荷通过网络传输,从一台机器直达另一台机器的内存。中间隔着路由器、防火墙、交换机,但数据包只要被目标程序接收并处理,溢出就可能在几毫秒内完成。
一个真实的细节
早年Apache的mod_ssl模块出过一个远程溢出漏洞(CVE-2002-0082)。攻击者发一个超长的HTTP请求,Apache处理SSL握手时没做边界检查,栈上的缓冲区直接被冲垮。远程执行代码,不需要任何认证。那会儿很多服务器管理员一觉醒来,发现机器已经在对外发起DDoS了。
这类漏洞的修补方式通常也简单得让人后怕:在往缓冲区写数据之前加一行长度检查。就一行。但就是这行代码,写漏了,整个系统的安全边界就没了。
为什么它比本地溢出更值得警惕
本地溢出需要攻击者已经能在那台机器上运行代码,门槛高得多。远程溢出直接把门槛砍到零——只要目标服务在监听网络端口,攻击者就能试。自动化扫描工具几分钟能扫完一个B段,找到目标后自动投递exploit,全程无人值守。
更麻烦的是,很多远程溢出发生在协议栈或基础服务里。这些服务往往以root或SYSTEM权限运行,溢出成功后攻击者直接拿到最高权限。没有提权步骤,没有横向移动的铺垫,一步到位。
缓冲区溢出这个概念从1988年Morris蠕虫开始就被广泛讨论,但直到今天,CVE数据库里每年仍有大量远程溢出漏洞被披露。C语言不强制边界检查,这是设计上的取舍,代价就是开发者必须自己盯住每一处内存拷贝。人总会犯错,攻击者只需要找到一个犯错的地方。
写代码的人多检查一遍长度,搞安全的人多盯一眼异常流量。远程溢出不会消失,但至少能让它没那么容易得手。
(责任编辑:热点)














