漏洞利用 2017年5月12日,漏洞利用英国一位22岁的漏洞利用安全研究员在Twitter上发了一条推文:“哦,WannaCry用的漏洞利用是EternalBlue。”这条消息发出后不到24小时,漏洞利用全球150个国家的漏洞利用20多万台电脑被勒索软件锁死,医院取消手术,漏洞利用工厂停掉产线,漏洞利用加油站排起长队。漏洞利用而EternalBlue这个漏洞利用工具,漏洞利用原本是漏洞利用美国国家安全局开发的。 漏洞利用这件事,漏洞利用本质上是漏洞利用把系统设计者没预料到的行为组合起来,达到攻击者想要的漏洞利用效果。听起来很抽象,漏洞利用但拆开看就三步:找到系统里一个逻辑或实现上的漏洞利用缺陷,构造能触发这个缺陷的输入,然后让这个缺陷替你干活——通常是执行任意代码或者读取敏感数据。 拿最经典的栈溢出来说。程序在栈上分配一块缓冲区存用户输入,如果没检查长度,输入超长字符串就会覆盖掉函数返回地址。攻击者把返回地址改成自己shellcode的起始位置,函数返回时CPU就跳过去执行攻击者的代码了。1988年的Morris蠕虫用的就是这个思路,虽然它只是让程序崩溃,但已经足够让整个互联网瘫痪好几天。 现代漏洞利用远不止栈溢出。堆溢出、释放后使用、类型混淆、整数溢出、竞态条件——每一种都有对应的利用手法。释放后使用特别有意思:程序释放了一块内存,但没把指针置空,攻击者想办法让这块内存被重新分配,填入可控数据,然后通过那个悬空指针去操作它。浏览器里这类漏洞特别多,因为JavaScript引擎要频繁分配释放对象,时序稍微没处理好就出问题。 漏洞利用的难度取决于目标系统的防护机制。ASLR让地址随机化,攻击者得先泄露一个地址;DEP让栈不可执行,攻击者得用ROP链把代码片段拼起来;CFI检查间接跳转目标,攻击者得找合法目标绕过去。这些防护不是单独存在的,它们叠加起来,让一个简单的栈溢出利用从写几行汇编变成需要几周甚至几个月的研究。 但防护再强,漏洞利用也没消失。2016年苹果的Pegasus间谍软件利用了三个iOS漏洞,从WebKit渲染漏洞到内核提权,整条链子设计得非常精巧。2021年Log4Shell出来的时候,攻击者只需要发一个带有特定字符串的HTTP请求,就能在目标服务器上执行任意代码。这个漏洞的利用复杂度极低,但影响面极大——因为Log4j几乎无处不在。 我观察到一个现象:很多漏洞利用的突破点不在代码本身,而在人与人之间的信任边界。浏览器信任来自HTTPS网站的内容,操作系统信任已签名的驱动,用户信任弹窗里的“确定”按钮。攻击者经常绕过技术防护,直接攻击这些信任关系。钓鱼邮件里带个恶意附件,比找零日漏洞容易多了。 漏洞利用的攻防是一场持续的军备竞赛。防御方加一层防护,攻击方就研究怎么绕过。但有意思的是,很多漏洞利用技术最初都是安全研究员为了证明问题存在而开发的,后来被恶意攻击者拿去用。EternalBlue是这样,Pegasus的漏洞链也是这样。工具本身没有善恶,看谁在用、用来干什么。 如果你对漏洞利用感兴趣,别一上来就啃《漏洞利用艺术》这种大部头。从CTF的pwn题开始,用gdb调一个简单的栈溢出,看着EIP被覆盖成0x41414141,然后一步步构造ROP链拿到shell。那个瞬间你会明白,漏洞利用不是魔法,它是对系统底层行为精确到字节的理解和控制。 |