在刚刚结束的2019第四届中国网络信息安全峰会上,国家互联网应急中心、区块链安全技术检测中心顾问专家宫云战教授带来了题为“软件源代码安全性测试在区块链领域的应用”主题分享,以下是宫云战在峰会现场的演讲内容实录,未经整理。
国家互联网应急中心、区块链安全技术检测中心顾问专家宫云战教授
大家好,我是北京邮电大学的老师,今天给大家报告一下我们的成果。区块链是我们其中的一部分,严格说我本人不是搞安全的,从上世纪80年代开始,我在科学院念书的时候,当年我们最早把可信计算引到中国来,容错计算专业委员会以可靠计算为主,因为信息安全这些年产生的矛盾突出,我记得当年是上世纪90年代斯坦福大学四个教授,四个老教授平均年龄差不多得90岁写了一篇文章是可信计算的内容,可信计算包括五个方面,国内有很多不同的看法。第一是可靠,第二是可用,可靠性,安全性可能是最重要的两个概念,我本人搞可靠性研究,是软件的可靠性。
我们这几年做系统的过程中,跟美国相关单位交流,我们做的可靠也属于安全的一部分,但是对咱们通常说的安全有点不太一样,当年国家自然科学基金委员会搞了有史以来最大的题目就是可信计算的题目,科技部也搞了一个1.5亿的项目都是关于可信计算的,国内对可信计算的概念也讨论了很多时间,我认为到现在为止大家比较公认就是四个斯坦福教授文章,从方法,从背景还比较有权威性。
我今天报告一下我们做的东西,以这个为前提最后谈一下我们区块链测试的结果。
分这么几个方面,第一个关于源代码测试的原理和概念,我团队是做源代码测试的,我做了大概得20年,源代码测试从90年代中期我们的神舟一号做软件开始,我一直是学测试的,神舟一号的源代码开始,当年的航天部组织我们在北京懂一点儿的人一起参与这个项目,这时候就开始了这方面的研究。
软件的源代码测试肯定是基于软件的源代码学习模式,首先定义一下源代码缺陷什么样,然后对源代码进行测试,测试方法可以是五花八门,各种各样,以及源代码是否有相关的缺陷。源代码技术发展很早,最早从上世纪70年代在英国利物浦大学有一个教授做相关的东西,这是一个雏形。2000年左右出现了很多产品,大概是2001年,2002年,我们和美国有些合作,特点是检测效率比较高,自动化程度比较高,比较好学,也是软件测试的主流方法,特别是美国是必须要用的,国内这两年我们也在推这个事,有几家单位做相关的工具和研究,现在还局限在一些特殊的领域,大部分国内还没引起足够的重视。
这是目前软件测试普通采用的一种办法,一些IT企业把这个方法作为企业核心竞争力之一,这句话是IBM的高层给我讲的,作为他们企业的软件核心竞争力之一。
我们看背景,我们说软件测试,这个图是软件测试的理论基础,或者是工业化基础,卡内基梅隆好多年前做过一个实验,一般的软件工程师平均十行就会犯一个错误,每千行有一百个缺陷,训练之后平均可以减少一倍,每千行可以达到50个缺陷,这是我们做软件措施,我们这个行业在工业化的基础。NASA是全世界软件可靠性最高的单位,20年前我接触他们的工程师给我说,他们要经过30次的测试,非常严格。中国的软件为什么很难走出市场,为什么成不了气候,有很多其他的原因,我也在工信部,科技部讲过好多次,质量是我们重要的原因之一,我们的数据库都有,但没有什么市场。中国的基础软件,2015年只有15个亿左右,占整个中国市场规模的3%左右,非常少,而且大部分都是部队买的。
我看了一下咱们的数据,我大体算了一下,如果说CMM1产生的软件可以达到0.05,CMM5可以达到0.99。
我们说软件要经过很多步的测试,我把软件测试分了四大类,以发现软件BUG为目标的测试也有很多的方法,包括需求,包括设计,包括代码测试,包括性能测试,变异测试等等,很多测试我在美国产的软件里是必须要做的,美国在一九九几年就设定了这些标准,而且很多是强制性标准。我们国家的软件到目前为止,国家标准没有一个是强制性的,军队有几个,就国家来看没有一个是强制性标准,没有强制性标准大家就可测可不测。可以我们开鉴定会的时候,软件测试是必须要拿着东西来的,你做个代码测试,你把缺陷报告拿来,设计报告也要拿来。
这个图是我们团队研究了十几年,十五年的时间,我们一直在做这个图象的事情,这个图象有70个左右的专利,200个论文左右,我们的主要贡献是什么呢?抽象解释不是我提出来的,很早就有,符号执行也不是我们提的,我们只是用。今天下午教育部让我写一篇文章题目就是符号执行。我们技术团队有个最大的贡献是中间两个,循环建模,我们知道传统的循环一直都是不处理,我们有01模型或者00模型,循环一次就完了。比较大的怎么办?里面的东西基本上不做了,我们采用人工智能建立一个统一的计算模型,我带着两个博士做了大概五六年,虽然现在不太好,但至少可以用,我们对循环建立一个计算方法使能够得到检测。抽象内存建模,现在系统越来越复杂,如何从底层建立计算模型,这是我们的贡献,把底层原来不能做的我们都通过一个模型可以统一的做上去。
中间是我们这么多年一直在做的一个事情,测试基本的计算方法,下面是我们做的工具,我们大学做的东西卖出去不是很容易。
软件的缺陷模式,最早做的时候大家都把这个当做不倒翁,包括斯坦福大学做的,我们做的,这在网上都公开了,没有什么好保密的。我们在国内是最早做这方面的东西,和美国差不多,我们和美国交流的时候,这个概念不是我们想出来的,跟美国斯坦福交流了很多,双方交流他们提出来,还蛮有价值的。我们基本上从1997年,1998年就做基本的研究,是国内最早,差不多20年了,最早的单位之一。
美国没这么叫,我们写的书一直这么叫,我们叫软件的缺陷模式。我们分了四大类,一个是故障模式,一旦这个故障被激活,系统就可能发生运行错误或者崩溃,比方说储存器泄露。第二类,关于安全的模式我只是列了一部分,安全的模式比较多,最典型的是最后一个,网站提供了一千多个,我们做了一半,我们现在和公安部也是合作,反正有联系,但是这个产品公安部我们做的还没用过,我们的产品面向于第一类做的比较多一些,第二类不是很多,我们的用户对象大多数在军队,军队对这个问题目前不是特别重视,航空领域用的多一些。CWF网站我们都可以做,而且不是很困难。
第三类叫疑问代码,疑问代码是我们想出来的,代码也没有什么错误,但可能隐藏着什么错误。还有是规则,现在有很多了,一个是国际标准5369,是1999年做的标准,还有欧洲的MISIR标准,像咱们华为有自己的代码标准,还有很多大企业都有标准,美国的工具面向于企业开发的工具,比如说IBM有什么标准,谷歌有什么标准,微软有什么标准,每个企业都有自己的特点。
国内也有其他的工具,我不一一介绍了,我们主要讲自己的工具。coverity是斯坦福大学教授研发,去年被一个大的企业收购了。klocwork在中国卖的最好。Fortify主要面对一些语法类的错误,在中国卖的也不错。我们的工具也做了十几年,我们也有一个自己的思想,卖了大概五六十套。
下面主要报告一下我们的工具,这个工具我们做的13年,我记得是2001年开始,这个工具代码全部是自己做的大概在一百万行左右。目前适应于C++和java,我们误报率30%左右,计算的时候源代码分析要进行全路径的计算,会产生很多漏报,本来是没计算出来,误报本来是,你说不是。我们做了一个实验,误报大概10%左右,每天处理一百万行代码,我说的一百万很保守。目前我们做DTSQT版还有Fortran版,2010年卖出去第一套,目前的版本是9.0,基本上我们这个产品在性价比上可以和上面三个工具相抗衡。
这是我们跟他们的对比,Klocwork,我们当年想让工信部的一个单位给我们统计一下,2012年的时候想把美国的三家公司叫到中国打个比赛,工信部出软件,我们拿钱看谁测的准,结果美国回话说有一个没兴趣,有两个说代理商去,中国的代理商测完美国认不认可,所以这个事就不了了之了,然后我们自己做了一下实验,这个图是C语言的代码,这是测的结果,这个事没有得到Klocwork的认可,我们的数据在我们的网站上,我们做了大量的数据,给大家报告一下。
这是给Coverity做的,我们当年只拿了一个软件,他也不愿意给你用,他主要是面向安全,两家不是很交叉,这个东西也没有什么可比性,但我们大概测出来600多,他测出来这么多,他有一个特点是测的比较准,误报率比较低。我们也可以做得到,刚才瑞星讲的怎么样降低误报,不一样,现在军队的要求是宁可误报一千也不漏一个,做银行软件库比较大就要采取这个策略。
这是跟Fortify的比较,他和我们不是一个档次,这两年好像有很大的进步,咱们国内买了很多,价格稍微便宜一点儿,Coverity得一百万,Fortify是针对语法类的,我们是对语义类的,我们大致做了一个比较。
这是我们测试的结果,给大家报告一下,比如说对当时神舟7的测试结果,这个软件是当年用的过程中也发现问题,后来我们测了一下。对嫦娥2的额测试结果,嫦娥2测的数据故障量还是蛮多的,最后一行是人工确,大家简单看一下,这是发现6个严重故障,3个非法计算等等。这是对天宫1号的测试结果,比如说第一个是一万多行发现28个错误,疑问代码12个。这是对航天五院卫星的测试结果,这次报告的结果得了单位的认可,有单位的盖章,我们两家共同认为这是一个错误。
这个图想说明什么呢?想说明目前开源软件的现状,我们对开源软件做了一个测试,基本上Java每千行有一个到两个缺陷左右,安全漏洞java有一个左右,这是大致的情况,目前开源软件基本上故障率会达到一个左右,这还是不错的。
我测了一下安卓4.0,大家都比较熟悉,总共加起来有一千七百多万条代码,我们总共测出来18100多个故障,平均每千行一个左右,美国的软件我们测了这么多,大部分都是控制在一个以内,所以美国人做软件确实比中国要好不少,我们测的大概是102个小时,我们这个数据我们网站里也有。
这是我的总结,我们对于国产软件大概测了5亿行代码左右,这是统计的,没统计的就算了,大概每千行5-6个故障,美国的软件测了几千万行,大概是一个左右。我们曾经大概是二千零几年的时候给美国合作,给波音公司的软件做过测试,确实做的比较好,故障率很低。当年我们合作的时候是我们测出来一个两家公司共同确认,一个故障一千美元,代价还是非常大。我记得波音公司有一个软件,没有做过统计,测了大概不到半年时间,波音付给那家公司三四百万美元,波音公司的软件非常大,这是一个软件的情况,我们总结的软件的情况,中国软件的规模还是比较大的,2020年计划达到一亿,我不知道能不能做的到,但是我们的基础软件基本上是寥寥无几,基本上可以忽略不计。这几年发展的市场比较好一些,未来能不能完全替代美国的东西,现在还不好说,包括我们的芯片,包括我们的操作系统,包括我们的数据库,这些核心技术不掌握的话,我觉得信息安全是句空话,芯片、操作系统、数据库,这个核心技术没有的话,信息安全只能是内部安全的问题,谈不到和美国的问题,我们的操作系统,芯片基本上都是美国的东西,这是一个非常大的问题。
从前年开始我稍微侧重了一下区块链,也测了几个,第一个测了一下EOS,基本上是故障有6个,总共有11个故障在里面,还有疑问类,倒没有安全类的,区块链的安全大家都比较重视,这是北京的一家公司做的,做的还不错,他们也是投入了很大的精力,基本上故障类得到13个措施,这个得到他们的确认,安全类的5个,疑问类的是32个,这些故障得到他们的认可。
这个是另外一家公司,因为涉及的数量比较多,我们只是测试结果,没有进入确认。比如说故障49,安全类的349,疑问类的312,说明这个单位的代码开发可能有些问题,可能新手比较多,刚毕业的学生比较多。
总而言之,目前源代码测试,无论是可靠性测试还是安全性测试,现在都是一个必不可少的步骤,我今天来做这个报告,是希望引起我们在座的重视。也可能大家有人知道,有可能有人不知道源代码测试的问题,至少目前我们知道美国的软件现在在全世界是独树一帜,可能全世界加起来都不如美国,美国软件的质量也是能够感受得到。你比如说这几年出现的软件质量问题,系统安全问题,虽然咱们国内下了很大功夫,但效果不是特别的理想。