从推特蠕虫事件中学习到的五条安全经验

2010年8月14日,一名来自日本的软件开发人员正人鬼怒川报告在推特的自动网址链接功能中存在脚本漏洞。根据当时的报告,推特修复了这一问题,但在九月份服务升级后,该问题似乎又出现了。

综合测试覆盖率是开发人员用来确保代码质量的一种措施。这就意味着在测试驱动开发过程中,程序员必须在开始编写代码之前就建立好测试模式,然后才能编写代码来满足测试的要求。在实际工作中,不那么极端的测试覆盖率可能更常见,对于具体的开发项目来说,它们的效果或许更好。而对于推特代码库维护工作之类的重大项目来说,至少应用某些类型的测试覆盖措施是很重要的,尤其是在进行回归测试和对新代码进行检查以防止重新出现以前修复过的错误时。

通常情况下,以前的错误再次出现说明在版本控制方面的管理非常不到位。对于版本控制系统来说,防止以前的错误重新出现是最基本的功能。对于那些不了解其作用的人来说,版本控制软件就象一种经过高度优化的备份措施,可以在软件开发过程中进行消除可能导致问题出现的更新返回到原来版本,保证项目中的所有开发人员都了解最新的情况,合并不同独立分支开发导致的变化以及对补丁进行管理之类的工作。如果新代码与旧代码的合并方式不正确,就可能出现不同步的问题,从而导致以前的补丁出现问题,或者在版本控制过程中出现管理不善的情况,或者由于采用的是人工而不是自动化方式对版本进行控制,以前修复过的错误都可能很容易被重新引入新代码中。

鬼怒川发现同样的错误再次出现,于是就开发了一个概念工具,它可以将“tweets”或者推特信息以彩虹色显示出来。当时,他没有意识到这会成为严重的缺陷,但在其它人也了解到这一漏洞后,他们也开始利用相应模式了。不久以后,就出现了tweets开始自动回复任何将鼠标移动到链接上的用户的情况。它从一个简单的搞怪行为变成了病毒。很快,该漏洞已经进化到可以感应鼠标在浏览器网页内的全部活动了,现在,只要在浏览器窗口内出现鼠标就可能被病毒利用。

由于该病毒是直接针对推特网站处理网络地址的方式,所以并没有影响到RSS速递、第三方客户端以及利用其它方式而不是推特标准网络界面阅读和发送tweets信息的应用。

从这起事件中,我们应当得到几点很重要的教训:

1、对所有输入信息都要进行审核,在其它条件相同的情况下,坚持提供审核模式已经被证明总是有效的。

2、对输出信息进行详细检查,以确保它不会以在网络浏览器客户端里鼠标悬停效果之类令人惊讶的方式影响到最终用户。

3、在软件开发过程中应用版本控制措施,防止由于源代码管理不善出现的潜在错误。

4、采用自动化测试套件,防止出现回归和其它可能被开发人员忽略的错误。

5、不要低估已知漏洞可能带来的影响,尤其是在它落入可能比你更危险的人手里时间。

从自己犯下的错误中学习经验,永远是一个好主意。而从其它人的错误中学习,则是更好的主意,这样你自己就不会犯下同样的错误。