本系列文章主要是围绕《GB/T 38674—2020 信息安全技术 应用软件安全编程指南》标准的解读展开。主要有以下三部分:第一部分是软件安全的重要性;第二部分是对安全开发国家标准的解读;第三部分是软件安全测试对软件安全开发的推动。本文我们先一起来了解一下软件安全的重要性。
我们先一起来看几个漏洞案例。第一个是“携程泄密门”事件,2014年3月22日,国内知名漏洞报告平台乌云网公布了“携程安全支付日历导致用户银行卡信息泄露”的相关信息。
携程将用于处理用户支付的服务接口开启了调试功能,使所有向银行验证持卡所有者接口传输的数据包均直接保存在本地服务器,导致很多用户敏感信息被泄漏。
泄露的信息包括用户的:持卡人姓名、身份证、所持银行卡类别(比如,招商银行信用卡、中国银行信用卡)、卡号、CVV码(信用卡背后的一组数字)以及用于支付的6位密码。
这个事件对携程造成了很严重的影响,股价断崖式下跌。也警示了我们,在做互联网软件开发的时候,一定要注意针对黑客入侵这方面的防护。
第二个案例是超级网银的一个漏洞案例,根据某网络安全公司提供的一起案例,安徽省陈女士在网购衣服时,被骗子诱导进行了“超级网银”授权支付操作,短短24秒内,其银行账户中10万元就被洗劫一空。
对此,该网络安全公司认为,“超级网银服务的风险主要在于客户授权环节。多数超级网银的授权并不需要验证双方的身份和关系。陈女土输入白己的账号、密码之后,即授权他人可以从自己的账户里进行跨行转账。”
并指出超级网银的四个漏洞:对双方身份和关系无需验证、操作过于简单、没有转账额度限制、个别银行解除授权操作复杂。对于超级网银被指安全漏洞,各大银行纷纷出面否认。
某行相关负责人表示,为了防范风险,某行已经通过验证网银盾等安全工具以及短信验证码等增强认证措施,在超级网银授权前会有风险提示,授权时也会通过短信验证码增强认证。
这样的一个操作在银行方面看来是客户的个人行为,但是我们面对的客户群体是不同层次的,有些人对软件的使用非常熟练,但是有些人对于软件的使用非常陌生,操作起来比较困难,如果有人帮助他们操作,他们可能会非常乐意去配合,却不会考虑到安全层面的问题。
所以我们在设计软件的时候,需要替用户把安全问题都考虑进去。
在现实生活中,我们在建造楼房的时候,会设计起居室、客厅、卫生间等,以满足我们生活的需求。通常还需要一个门,这个门往往是有锁的,来满足我们的安全需求。我们在软件设计的过程中,也要设计这样一个“门”,为客户做好更加周全的保障。
第三个案例是前段时间比较热门的Apache Log4j开源日志的漏洞,可以执行任意代码。
这个大家应该都知道,这是一个第三方的组件。这个事件就提示我们,在使用第三方组件的时候,也要考虑其安全性,也要从代码层面去进行安全审计,确认我们使用的第三方组件是不是存在安全漏洞。
谈起软件安全的重要性,我们再一起看一下软件行业这几次比较大的危机,第一次“软件危机”是在20世纪60年代,当时的软件开发是单打独斗型的——个人设计、个人开发、个人使用的场景。
随着硬件资源技术的提升,对软件的要求也越来越高,软件的功能越来越复杂,对软件开发的要求也越来越高。最早期的这种开发模式没有管理,沟通起来成本也比较高,比较混乱。
这个时候,各大软件厂商和国际标准化组织就提出了“软件工程”的概念,用“工程”的概念来管理软件行业。产生了软件需求分析、软件设计、软件开发、软件测试以及软件交互这样闭环的工程,大大节省了管理成本。
第二次软件危机是在20世纪80年代左右,当时的编程语言是一些底层语言,像汇编、C语言之类。要想做一个程序,代码行数是比较多的。
后来IBM做了一个操作系统,4000多个功能模块,开发了100多万条的指令,每年投入5000人,耗费了数亿美元。但是整个程序依旧延期交付,交付后也产生了很多缺陷。易用性、可靠性、可维护性都比较差。
为了解决这样的现状,就出现了面向对象语言,C++/java/C#。代码的可移植性、模块化、代码的简洁性等方面都有了很大的提升。
第三次软件危机发生在21世纪的前十年,这个时候电脑已经比较普及,软件也已经比较丰富,各种病毒也随之而来了,像蠕虫、木马等。
在这样的背景下,微软提出了软件安全开发生命周期管理的概念,也就是SDL。软件的很多问题是在设计和开发环节产生的,他们倡导对软件开发人员进行安全培训。
SDL有几个设计的核心原则,攻击面最小化、基本隐私、权限最小化、默认安全、纵深防御、威胁建模等,这些理念都是比较好的,大家如果感兴趣的话可以去查一查、学习一下。
从软件的第三次危机开始,行业就开始关注安全层面了。接下来我们一起看一下安全问题的根源:主要是系统与人的因素。
从系统方面来看主要原因有:复杂应用系统代码量大、开发人员多、难免出现疏忽;系统屡次升级、人员频繁变更,导致代码不一致;历史遗留系统、试运行系统等多个Web系统共同运行于同一台服务器上;开发人员未经过安全编码培训;定制开发系统的测试程度不如标准的产品等。
从人的方面来看,开发者本身会更关注系统的功能,考虑的更多是能不能按期交付、开发进度与成本如何平衡,客户是否满意等问题,很容易忽略安全性的问题。
下面这张图是我从国家漏洞库中截取的一个漏洞趋势分布图。大家可以去看一下这个漏洞库,它会发布一些最新的漏洞,以及如何修复等最新信息,尤其是测试人员可以及时关注一下,看一下自己现在的系统有没有相应的问题。
软件安全问题产生的内因有:软件规模增大,功能越来越多,越来越复杂;软件模块复用,导致安全漏洞延续;软件扩展模块也会带来的安全问题
软件安全问题产生的外因有:互联网发展对软件安全的挑战,这个大家都是有目共睹的。
第二方面是开发环境和开发人员对软件安全的挑战,首先开发者缺乏安全开发的动机,由于市场和业务要求将交付期和软件功能做主要因素,用户方没有提供安全方面的压力。
现在随着国家对安全的要求越来越严格,也出台了很多的相关法律和标准,用户方在需求阶段可能会提出要求,所以开发者的安全开发意识也在日益增强。
另外,开发者缺乏相关知识也是一个挑战,软件开发的技术本身就日新月异,变化非常快,开发人员都是在不断的学习,再去学习安全方面的知识,会缺乏时间和精力。
缺乏安全开发工具也是一个挑战。这点需要公司层面或项目组层面去考虑的事情,是从上往下推进的一个事情,非开发人员一己之力可以解决。
以上就是软件安全问题产生的外因。接下来我们针对软件安全开发的国家标准进行解读。