作者简介:陆宝华,国内知名网络安全专家,研究方向为信息安全等级保护、工业控制网络安全、智慧城市网络安全体系框架等。曾任工业控制系统信息安全技术国家工程实验室专家委员;贵阳市攻防演练技术总策划,攻防演练风险管控平台总设计师;贵阳大数据安全靶场顾问;福州市政府特聘网络安全专家;第一届、第二届和第四届数字中国建设峰会网络安全保障专家组组长;雄安新区网络安全首席顾问。编写著作三部,发表各类文章百余篇,授权发明专利三项。
二十多年前,笔者亲自办过两个案件。
第一个,当时某计划单列市的政府某部门的服务器,向国外的邪教网站发送邪教的材料和文章,被上级部门监控到了,案件不需要太多的侦查,很快就破案了。是为这个政府部门开发软件的企业的技术总监干的,他利用远程登录到系统后台,使用政府服务器,发送了相关反动数据。后经查实他本人是邪教组织的重要成员。
第二个,还是这个城市的交警的违章罚款系统,被人非法使用,删除了大量的违章人员的数据。侦查也不困难,是为交警开发软件系统的企业的技术核心人员,与检车线上的检车员相互勾结,由检车员向违章司机收取罚款,然后电话告诉这个技术人员,他远程后台删除。
这两个案件,都是由软件企业为政府系统开发的软件上预留了相应的后门而导致的。虽然案件过去二十多年,但是,对于今天来说仍有警示作用。
首先,这两个软件上线时,只做了功能检测,而没有相应的安全检测,实际上这俩当事人,都考虑了可能会有安全检测这个环节,他们提供的用于测试的软件(仅为功能测试)与安装运行的软件并不是一个版本。
这就出现了两个问题,一是没有进行安全检测,二是即使是进行了安全检测,由于安装的版本与被检测的版本并不一致,给了作案人员可乘之机。
同时也说明了两个问题,一是上线的软件一定要进行安全检测,二是一定要保证软件的检测版本与安装运行版本必须保持一致。
实际上,这两起案件都是预留了远程登录的接口,算是后门,技术上不高明,更不复杂,并且作案人没有专业黑客的本领,否则作案人把作案活动的痕迹都打扫干净,那案件侦破难度将大幅提升。
对于第二个方面,国际标准ISO15408中的第三部分,“分发与操作”中,就有明确的规定,说心里话,没经过这两起案件时,虽然记住了相关的要求,但是对相关的意义的理解还不是那么深,正是革命导师所说“感知了的东西,我们并一定理解它,而理解了的东西,我们一定会更深刻地感知它。”
实际上,除了这两个案件之外,在笔者的工作中,还发现过某企业为政府开发的网站,普遍存在同样的漏洞,实际上这个企业就是想降低成本,把一个带有明显漏洞的软件模块直接拿来用,为多家单位开发了网站。
应该说,近年来由于各种管理机制的不断健全,软件开发企业的行为也得到了规范,故意预留后门和不经安全检测就将一些模块拿来用的现象已少有发生,但是并没有杜绝。
2019年底,为确保雄安新区某局的重要业务系统软件的安全,我通知开发商(国内一个相当著名的企业),要对他们的软件进行安全检测。该企业得到通知后,高度重视,充分准备,自行做了软件的黑盒安全检测和白盒代码审计工作。但在2020年4月份检测工作实际开展过程中,通过使用一个国内厂家的灰盒安全测试工具进行检测,软件中一个不算大的模块,查出四个高危和七个中危漏洞,吃惊之余,软件开发商与工具提供商就检出漏洞进行了充分沟通,最终对检测结果非常认可。
黑盒检测,很难照顾到全面,往往是一条线打进去了,也就认为检测到了问题,没打进去也就认为相对是安全了。白盒看上去很全面,但是代码审计不是那么容易做的。并不是说这两个检测不重要,而是说这样的检测是不够的。灰盒检测,通过“插桩”技术实现交互式的检测,发现的确定性问题更多、定位也更精准。建议是这三种检测都应该做,特别是对安全性要求较高的应用程序,灰盒一定要做。
软件的安全,是网络空间安全的生命线,一个系统,没有软件,也就没什么用处,当然也就没有数据,更谈不是系统的服务功能。也就不用谈安全了。那么,我们建系统干嘛呢?
十多年以来,软件定义一切的口号叫得很响,并且也确实在稳步地推进,软件定义一切是必要的,可如果软件本身不安全,那所定义的一切,还有安全可言吗?
软件安全,应该分为系统软件安全、中间件安全和应用程序的安全。系统软件,就那么几家,中间件的开发商也不算多,这种检测的机制和能力,不是我们各个单位所具有的。
系统软件和通用中间件的开发商,往往有很庞大的检测队伍和机制,相对来说检测的能力很强大,但仍然会时不时曝出一些漏洞,有些漏洞甚至已经成为了一些网络战的工具。而应用程序的开发商,缺少这种检测能力,软件本身的安全性实际上更差。用软件定义一切,恰恰不是由系统软件决定的,应用软件是定义这一切的决定因素。
应用软件的安全检测,是我们保障安全的关键所在。笔者一直认为,对于由他人的侵害所导致的安全问题(我们就叫它“人祸”吧),解决的根本方法是“保证正确的授权操作”。这里包含了三层意思,一是操作需要授权;二是授权必须正确;三是正确的授权操作机制必须有保证。
对应用程序来说,这三个方面往往都需要考虑:
授权机制,可以通过操作系统等系统软件来实现,但是,这些系统软件很难将访问控制的颗粒度做得很细,建立一个主体,对应一个客体的访问授权机制。一个应用,对于操作系统来说,就是一个客体,而所有有权访问这个客体的人,操作系统都得放行。这就需要在应用程序中建立更细颗粒度的访问控制机制(授权操作机制)。所以说,软件安全并不仅仅是查漏洞,如果安全机制没有真正的建立,那么就等于把前面打开,随便进入了,那么就不需要什么黑客技术了。
应用程序要不要建立安全机制,实际上要结合系统来分析,当操作系统等系统软件能够完全解决授权操作的问题时,当然不必在应用程序中再画蛇添足,并且操作系统等系统软件更底层,解决安全问题会更可靠一些。当操作系统不能细粒度地建立这种访问控制机制时,就需要在应用程序中来建立,与操作系统一起把“正确的授权操作”机制建立起来。
软件安全的另一个方面,当然就是保障问题了,要解决好“正确的授权操作”机制,不会被破坏,不会被绕过,不会因各种因素而失效的问题。漏洞显然是第一大问题,这也是人们一提安全,就关注漏洞的原因。
前面说,漏洞的检测可以是黑盒,也可以是白盒,更可以是灰盒,如果进行联合检测,就会使漏洞水平大大降低。
除了漏洞之外,还有一个需要解决的保证因素:隐蔽信道检测问题。隐蔽信道,在计算环境中有存储隐蔽信道和同步隐蔽信道。在网络环境中,隐蔽信道会更复杂。对于应用程序来说,主要面向的计算环境,所以要从同步隐蔽信道和存储隐蔽信道入手进行检测。当然检测还是要考虑面向更高的安全等级的系统,GB 17859中规定对于安全第四级(结构化保护级)以上级别才考虑隐蔽信道问题。所以,更多的软件保障问题,还是针对漏洞。
对于漏洞的检测,实际上,我们还有很长的路要走,这是因为漏洞没有办法穷尽,并且一个漏洞修补之后,很可能会产生新的漏洞。状态机转换的原理,对于软件的漏洞检测是非常重要的,可惜开发是有很大难度的。人工智能的出现,或许对软件的漏洞检测会提供更好的帮助。
除了安全检测工作,还要考虑所检测的软件与安装的软件版本号必须一致,也就是说安装的应用程序,必须是经过检测并且是合格的软件。要保证这一点,实际上并不难,一是可以将检测过的程序进行哈希,并将哈希值和算法交给使用单位,使用单位可以对安装的程序进行哈希后,进行比对。还可以由检测部门直接将检测合格的程序交由用户单位。
最后,建议读者认真地读一读ISO15408,尽管难懂,但是管用。