本次分享介绍了安全问题的成因可分为设计不当、实现不当、使用不当三类。设计类安全问题的数量相对较少,但形式变化无穷,而且一旦出现往往影响深远,解决成本巨大。同时,如果能在设计阶段就能引入安全考量,不但能减少设计出来的安全问题,也可以缓解其它类安全问题带来的风险。
以下为于旸演讲实录大家好!刚才听了李海波博士关于语音信息处理的回顾和展望的精彩演讲,我就在想:虽然说今天我们看人工智能没有达到科幻小说期望的那样,有的时候还是“人工智障”的状态,不能像《:太空奥德赛》中的HAL那样能够真正成为站在我们身边的伙伴,但在某些场景中,已经能够做一些事情了,例如下围棋、语音识别,等等;不过我相信,在真正匹敌人类智慧的所谓强人工智能出现之前,很多工作还是只有人类才能完成。
另外,第一次工业革命、第二次工业革命并没有消灭人类的工作,计算机出来的第三次工业革命之后,也没有消灭人类的工作。没有计算机就不会有程序员这种职业、也没有腾讯,今天在座各位的工作都是计算机技术带来的。我相信人工智能的发展,一定会让人类世界有一些变化,但也会创造出一些新的岗位。
在信息安全领域,很重要的一类工作是发现安全问题。最近这些年,自动化技术,包括一些人工智能技术在这个领域的引入,帮助我们发现了越来越多的安全问题。以前很繁复的工作,现在可以用一些相关技术帮我们减轻很大工作量。不过今天要分享的不是这方面的内容,今天要讲的内容是目前阶段暂时还难以用AI技术处理,并且在未来很长时间内也一直需要由人去做的部分。如果有一天这部分内容也可以通过AI来做,那就说明匹敌人类的强人工智能已经出现了。
今天我讲的题目叫“代码未写,漏洞已出”。在一般的认知当中,安全漏洞是写代码的时候写出来的。但实际上在所有安全漏洞中,有一类问题不是这样,这就是设计类的问题。它数量可能没有实现上的问题那么多,但这类问题一旦出现,影响深远而且巨大。最重要的是修复可能非常困难。房子哪块砖用的质量不好可以换掉,但是最初房子的建筑图纸画错,这个问题就不是换几块砖能解决的。
这张照片大家看出什么问题了吗?是一个密码锁,大家一看就能猜出这个密码很可能是“”对吧。如果没有真正把这个锁投入使用,一把新锁拿到你面前问设计有什么问题,你可能也想不到这个地方不该用油漆。坏的设计就像这样,本身会形成安全问题。而好的设计不仅仅可以做到自身安全,同时即使在实现阶段或其他的环节有人犯错误的时候,好设计可以降低这些问题的危害。做到这两点,就是一个在安全角度上看真正的好设计。现实中,真正好的设计是不容易做出来的。
我们说这类安全问题属于设计不当,而设计不当又分两种。一种是单点设计不当,就是在设计当中某一个局部有一个小问题。还有一些问题是耦合性问题,多个点的耦合问题。多点耦合是相对的,因为单点问题往往也需要和其他点配合来最终形成危害,只是从大的方面看,更多问题出在内部。多点耦合问题又分系统内的耦合问题,以及设计的系统和其他系统间的耦合问题。除了系统和系统之间的耦合,还有一个常常被忽视的是系统和人的耦合。因为人其实也是系统,你的用户也是一个系统。
下面举几个比较有代表性的例子。首先我要强调的是,安全意识有时代背景。下面谈的这些问题,不全是设计者的错误。有些设计过去可能不被认为是安全问题。但时过境迁,一些新的安全攻击思路出之后,这种设计就不安全了。不能以今天的标准去苛求过去。比如岳飞,他是民族英雄,但当年也镇压过农民起义。今天我们提到岳飞还是说民族英雄,而不说*阀。
这是Java6.0消息摘要类中的一个函数,用来验证HMAC等数据。在这个函数本身设计的时候,这种写法可能还不被认为有太多问题,在座各位看这个函数可能也觉得没什么问题。但如果我们用刚才的这个函数去验证一个重要数据,假设digesta是我们掌握的密钥,用户传递的密钥是digestb,实际上用户可以用逐字节穷举的方式很快探测出真正的密钥。我们看这个函数是怎么验证比较的呢?它是一个字节一个字节比较的。第一个字节不正确,它立即就会返回失败。如果第一个字节是对的,就比较第二个字节。所以,如果用户传递过来的密钥第一个字节是对的,和第一个字节是不对的,这个函数返回的时间会有一个微小的差异,整个指令执行周期会多一点。在这种情况下,攻击者本来要把所有数据都猜对才可以破解出这个密钥,而这是几乎不可能的。但是现在他可以一个字节一个字节猜,一下子把猜解速度提高无数倍。
所以在看安全问题的时候,时间这个维度很重要。我们看安全问题,常常更多看数据上的东西,时间维度往往容易被忽视。在计算机中处理的数据,除了