漏洞简史:为什么一个漏洞值100万美金
黑客这个词很容易被误解。它翻译自「Hacker」,最早将自己视为黑客的一批人,是20世纪60年代麻省理工学院搞软件开发和电子工程学的学生。他们都很聪明,对已有技术和规...
黑客这个词很容易被误解。
它翻译自「Hacker」,最早将自己视为黑客的一批人,是 20 世纪 60 年代麻省理工学院搞软件开发和电子工程学的学生。他们都很聪明,对已有技术和规则不屑一顾,恶作剧和电话线路入侵是黑客文化的一部分。苹果公司的两名创始人史蒂夫·沃兹尼亚克和史蒂夫·乔布斯在 80 年代也是两位电话线路入侵者,可以说,家酿计算机俱乐部和之后出现的家用电脑其实都算是黑客文化的产物。
转变发生在 1983 年,一群年轻黑客非法入侵公司、政府和学术机构,并开始试探性地进入互联网先驱 ARPA 网,他们被捕后美国新闻界想不出一个名字去称呼他们,于是就用他们自称的黑客。
从那一刻起,黑客一词就包含两种含义:一种指靠自身努力不断进取的天才程序员,另一种是电脑入侵者。随着计算机和互联网的成熟,防护计算机可以赚钱,于是一批人开始从事网络安全工作,并称自己为白帽黑客。白帽指过去牛仔片中那些彪悍的男主角,这些人开始将电脑技能用在真理和正义的一方。(以上关于黑客历史的内容摘自《掘金黑客》一书。)
tombkeeper 是中国白帽黑客中一位响当当的人物,多数时候人们叫他 TK,真名是于旸,现在是腾讯玄武实验室负责人。他在互联网安全峰会 CSS 上讲了漏洞的历史:漏洞很久以前就被发现并被利用,但安全人员真正反击回去是 20 年前。
以下根据他的现场演讲编辑:
冷战时的计算机入侵
1986 年,克格勃的一个人从一所西德学校通过德意志联邦邮局再通过一条卫星线路接入了美国国家实验室,这个实验室从事与核技术相关的研究,克格勃的这个攻击者接入实验室后利用了一个 Emacs 的漏洞,获得了主机权限,然后在机器中搜寻核技术相关资料。
这听上去仿佛是电影中的场景,而且你绝对不会想象这发生在 1986 年。这个攻击者被抓住的原因很有意思,因为在 1986 年的时候,计算机还是那种大型机,每一个人按照使用时间付费,最后管理这个大型机的科学家,在给他的领导报帐时候发现有 0.75 美元的使用费对不上,最后查帐把这个攻击者查出来了。
有人很早就意识到计算机安全问题,但没有引起足够重视
再把时间往回推,在 1972 年,James P Aederson 说了这么一段话:
函数的代码没有正确地检查源地址和目的地址,允许用户覆盖部分系统数据。这可能被用来向系统中注入代码,从而使用户获得机器的控制权。
——《计算机安全技术规划研究》James P. Anderson
非常准确而清晰的描绘了内存破坏类的成因及危害。我们今天谈论和计算机安全有关的各种各样的概念,在 1972 年的这份规划当中已经写的非常清晰了。
但意识到安全问题和让别人感知风险之间有很大差距,他当时的规划没有引起足够的重视。
病毒攻击来临时,人们对此毫无概念
直到 1988 年,Morris 蠕虫在数小时内感染了 10% 的机器,世界感觉到了这件事的威力。这是世界上最早的经由互联网传播的计算机病毒之一。
这个截图就是当时电视上报道这件事时的一个新闻原始截图。从这个播音员的着装风格可以看出那个年代的风格,当时人们对这类事件的认识非常不准确。他们用的词是 Virus,这就是当时大众对这个事情的认识。
(Morris 蠕虫病毒爆发时,世界对计算机病毒还没什么概念,怎么称呼它都不是一件容易事。)
即使在这样全球性的事件后,多数程序员认为缓冲区的溢出只会导致程序崩溃,只有非常少的人知道相关技术是什么,这些技术仍然悄悄地在地下室中流传。
一篇文章让大家开始了解缓冲区溢出
从 1988 年再往后七年,到 1995 年,世界上才出现第一篇公开描述缓冲区溢出相关技术的文章,这个时候搞技术的人可能才第一次有机会去了解这些东西。
这篇文章叫《How to write Buffer Overflows》,作者 mudge,他的真名是 Peiter Zatko。在这篇文章之前,没有攻和防两个方向,是单方向的大屠杀,被攻击方毫无还手之力。
James 在 24 年前写下的那段话在此时才真正被人们广为接受,攻防双方在那个时候展开较量。1995 年到今天 2015 年整整 20 年。
(Peiter Zatko,世界上第一篇公开描述缓冲区溢出相关技术的文章作者,左边是他 2009 年加入美国国防部时拍摄的照片,右边是早年照片。)
一开始大家认为漏洞只能在 Unix 系统上实现,因为 Windows 系统还不确定,直到 1988 年 1999 年出现两篇文章讨论了 Windows 区溢出才知道不是这么回事。
防守技术从缓慢进化到快速更新
1997 年 Sun 公司在 Solaris 2.5 当中借助 SPARC 处理器的新特性,实现了禁止在堆栈上执行代码,让冯诺伊曼结构在逻辑上变成了某种程度的哈佛结构,这个处理器第一次在逻辑上可以把代码和数据存储区分开。
同一年 StackGuard 技术诞生,软硬两类技术在一年诞生了。
个人电脑真正用上这样的防御技术是在 2003 年,由 AMD 引入,同年,微软在新版 Visual Studio 中增加了类似 StackGuard 的保护机制。
从 1995 年到 2003 年,防守技术的发展并不是特别快。03 年之后攻防双方的较量进入白热化状态。
从服务器到个人 PC,之后战火又烧到移动端。以安卓为例,在攻击压力之下,安卓在 09 年引入 ProPolice,接下来每一年都引入若干种新的防御措施。
漏洞史上最高收购价——100 万美金
到今天无论是攻击技术还是防御技术,都已经进入综合、融合、协同、多维的阶段,单点严防死守的思路基本不被业界人认同。我们有一个很常说的话,没有什么东西是一招鲜吃遍天。
现在对于漏洞的防御思路是首先尽可能减少漏洞的出现,但完全禁止是做不到的,那怎么办?在假设我们没办法完全禁止漏洞出现的前提下,想办法让漏洞的利用过程变的困难,让利用过程变的不稳定,成功率下降,攻击的成本提高。
这两天有一个新闻,美国一家专门收漏洞卖给政府和军方的公司刚刚给出漏洞收购史上最高价——100 万美金。这个漏洞是只要你用苹果手机浏览一个网页然后这个手机会被别人完全控制。这个漏洞看上去很可怕,但另一方面,它的成本非常高,所以这种技术不太有人用来侵害普通人。这就是这么多年防御方不断努力的结果,把一个漏洞的价钱抬到这么高。
第二个叫全时对抗。软件的整个生产过程,从设计阶段到开发、编译和运行,安全都会介入。从设计时安全思路进入,开发时相关工具介入,编译时使用安全特性的编译软件,然后在运行启用相关的安全工具,这个是全时对抗。
另外就是多维协同,多维协同不只是着眼于技术层面,不只是用自身力量,而要考虑内部和外部的力量,通过业界合作和社区建设,用咱们的话说就是打人民战争。为什么要变成这样呢?因为形式已经不一样了。
It isn't a bunch of kids anymore. These are people who do this for a living.
这件事再也不是儿戏。有人以此为生。
兰德公司研究员马丁·C·利比基讲了这样的话,以前安全就是一些小孩闹着玩,今天不是这样了,有一些人干这个是为了生活,他就指这个吃饭,所以已经变成一件非常严肃的事。
回顾过去 20 年,实际上我想说的是我们要想一想下一个 20 年安全应该怎么办,这也是需要在座的各位大家一起努力的。