游客发表
1988年11月2日晚上,罗伯里斯利用康奈尔大学计算机系的特莫统漏研究生罗伯特·莫里斯在麻省理工的实验室里敲下最后一行代码,然后按下了回车键。种系他本意是罗伯里斯利用想写一个能测量互联网规模的程序,结果这个程序在几个小时内感染了约6000台Unix机器,特莫统漏占当时整个互联网的种系十分之一。他利用的罗伯里斯利用漏洞,核心是特莫统漏Sendmail的调试后门和finger服务的缓冲区溢出——两个看似不起眼的系统缺陷,却被他用一段蠕虫代码串成了致命链条。种系
先说Sendmail。罗伯里斯利用这个邮件传输程序在1980年代几乎统治了Unix网络。特莫统漏莫里斯发现,种系Sendmail的罗伯里斯利用调试模式(debug)允许远程用户直接执行命令,而默认配置里这个后门是特莫统漏开着的。他写了一段伪SMTP会话,种系通过发送包含特殊指令的邮件头,让Sendmail把控制权交给他。更绝的是,他没有直接利用这个后门做坏事,而是让蠕虫在目标机器上复制自身——这反而让攻击更难被察觉,因为邮件服务看起来只是正常处理了一封奇怪的信。
另一个漏洞在finger服务上。finger是一个能查询用户信息的程序,监听在79端口。莫里斯利用的缓冲区溢出攻击,在今天看来属于教科书级别的经典手法——他往fingerd的输入缓冲区塞入超过预定长度的字符串,覆盖了栈上的返回地址,然后让程序跳转到他注入的shellcode里。那时候的C语言程序员普遍不检查字符串长度,所以这种漏洞像筛子一样到处都是。但莫里斯的高明之处在于,他用了两种不同的攻击方式:如果Sendmail路径失败,就用finger路径;如果finger服务也没开,他还会尝试通过rsh和rexec这些信任关系漏洞横向移动。
真正让这次攻击失控的原因是程序自身的逻辑缺陷。莫里斯在蠕虫里设计了一个“防重”机制:每个被感染的机器会随机决定是否继续传播,但判断条件写错了——他本想让蠕虫在已感染的机器上停止,结果却让它在部分机器上疯狂复制,导致系统负载飙升,最终瘫痪。这就像你写了段代码想避免死循环,结果条件判断写反了,反而加速了崩溃。
这事后来闹到了法庭。莫里斯被判三年缓刑和一万美金罚款,但更深远的影响是,它直接促成了1988年11月成立的CERT(计算机应急响应小组)——世界上第一个专门处理网络安全的组织。我有时候想,如果莫里斯当年只是把这段代码锁在硬盘里不发出去,他可能就是个普通的编程高手;但他按下回车的那瞬间,把整个互联网的脆弱性暴露在了所有人面前。
现在回头看,Sendmail和finger早就退出了主流视野,但缓冲区溢出至今仍是攻击者的最爱。只是莫里斯当年靠的是单线程的蠕虫和朴素的漏洞利用,如今的黑客面对的却是堆栈保护、ASLR和沙箱。但本质没变——只要有人写代码,就会留下缝隙;只要有人研究代码,就能找到缝隙。莫里斯不是第一个这么干的人,但他恰好是第一个让全世界都看到后果的人。这大概就是“技术中性论”最讽刺的注脚:工具本身没有善恶,但按下回车的手指,永远有选择。
友情链接