重新认识软件安全

软件安全目前越来越受到重视,日常看到介绍软件安全的文章也越来越多。深感自己对软件安全方面知识的匮乏,最近学习了下,更加发现自己以前对软件安全的理解很浅薄,甚至有很多概念都是混淆的。这里,将自己近期所学的,结合自己的经验和认识,整理了下本文,比较粗浅。
本文包括如下几个小节的问题:

  • 软件安全是什么
  • 为什么会越来越重视软件安全
  • 关于SDL
  • 关于BSIMM
  • 个人怎么做
  • 小结

一、软件安全是什么

以前一提到软件安全我首先想到的是操作系统的漏洞(尤其是windows操作系统),还有杀毒软件、病毒库更新,防火墙以及操作系统加固等,但这些都不是软件安全,这些是属于对应用安全的纵深防御。
我们说的软件安全,是指因为软件本身的问题,被有意或无意攻击后会造成数据泄露、系统崩溃等情况发生。这几年因为软件本身的漏洞发生的事情越来越多了,特别是一些用户数据的泄露。
下面我们通过一个很多人比较熟悉的SQL注入的软件安全漏洞来更直观的介绍下软件安全。SQL注入可以在很多地方进行攻击,我们这里举大家熟悉的登陆功能来介绍。
大部分WEB应用,都有一个登陆界面,让用户输入用户名和密码,服务器程序收到浏览器传过来的用户名和密码,会进行鉴权处理。假设服务器程序是采用直接拼凑SQL语句的方式来查询用户名和密码是否正确,类似如下的代码:

boolean checkUser(String name,String password){
    String sql = "select count(*) from users where name='";
    sql = sql + name +"' and password='"+password+"'";
    ......
}

上面函数中的name和password参数的值是从浏览器传过来的用户输入的信息。 假设用户输入的name和password值都是 tom' or '1'='1 ,这样上述代码拼凑出来的SQL语句就是:

select count(*) from users where name='tom' or '1'='1' and password='tom' or '1'='1'

上述sql语句,只要Users表中有记录,返回的结果就不是0。也就是说即使用户输入的并不是正确的用户名和密码,但服务器可能会验证通过。这就是一种软件本身设计和代码编写不恰当造成的软件安全问题。

SQL注入是WEB应用中一种常见的安全漏洞,也有很多应对方式,最基本的方式就是不要采用拼凑SQL语句的方式,而是采用参数绑定的方式来执行SQL语句。如下面代码方式:

String sql = "select count(*) from users where name=? and password=?";

上面我们通过一个例子来加深了对什么是软件安全的认识。下面我们简单分析下为何软件安全现在越来越受大家重视。

二、为什么会越来越重视软件安全

软件已经成为我们的关键基础设施和日常生活的重要组成部分,已融入到我们的各种产品中,这些年来软件得到了高速的发展(遗憾的是,软件安全并没有像软件本身那样以相同的速度发展)。
近些年,软件安全越来越被重视,个人觉得下面两个原因比较重要。
第一,随着互联网和移动互联网的普及,人们使用软件的方式也发生了很大变化。很多年前,我们可能大部分使用的是一个本地的软件或者一个局域网内软件。因为是在一个有限的范围内使用,那它遭受攻击和破坏的概率就比较小。而现在呢,我们主要是通过web界面或app来使用,只要有网络的地方,都可以使用到软件,这增加了潜在的风险,也为黑客或者不怀好意者带来更多的攻击和破坏机会。

另外一点,是外部环境的变化,目前各个国家对软件安全和隐私越来越重视。典型的如欧盟的GDPR协议的生效,如果说违反了欧盟的GDP协议,处罚是相当的严重,甚至可能导致一个企业遭受重创。还有现在以美国为首的西方国家以安全理由,来封杀中国的通讯设备制造商,未来也可能会有更多的国内高科技企业受影响。对于这个,一方面我们要据理力争;另一方面,打铁还靠自身硬,我们必须有充分的证据来证明我们的软件是安全的。

在这种内外部环境的严峻的压力下,软件安全已经成为一个企业能否长足的发展生存下去的一个核心因素,而不再是可有可无的。这样更多的企业和个人越来越重视软件安全也是必然的结果。

三、几个概念

下面我们来解释下软件安全中几个重要的概念。
1、软件安全和应用安全
软件安全是指如何构建安全的软件,也就说软件本身是安全的。应用程序安全是关于保护软件和该软件发布后运行的系统,是当软件开发完成并上线后才做的事。虽然应用安全举措也非常重要,但我们应该把软件安全放在第一位,从源头做起,提高软件自身的安全性

2、代码质量与代码安全
安全的代码不一定是高质量的代码,高质量的代码也不一定是安全的代码。
传统的保证质量的软件开发方法、过程和工具,并不能实现软件的安全性。软件的安全性需要通过专门的方法、过程和工具和保证。当然并不是它们之间没任何关系,有很多方面是可相互借鉴和互通的。
软件质量和软件安全的判定标准也是不同的,衡量软件质量的标准主要体现在易用性、可重用性和可维护性。而衡量软件安全的标准是机密性、完整性和可用性。

3、bug和漏洞
bug,中文称为缺陷,是软件开发中的一个通用术语,意思指软件错误。在所有的bug中,有些会被攻击者操纵,成为安全漏洞,如同我们熟知的微软操作系统中的各种漏洞。
在软件安全中,我们感兴趣的是漏洞,即安全缺陷。漏洞通常是错误的副产品,而不是错误本身。比如SQL注入问题,错误的SQL代码会导致出现漏洞,被人输入刻意的数据导致安全问题出现。

4、攻击
软件安全问题大多是遭受有意或无意的攻击形成的,因此我们在在考虑软件安全时,无论是开发或测试,我们需要以黑客的思维来思考。对于开发,我们要思考,如果有人这么攻击,我们的代码有没有问题。对于测试,我们要思考,我如何攻击,可以发现安全问题。有点类似我们开发中的异常保护和异常测试。

5、隐私
隐私保护是软件安全中非常重要的一块内容,尤其是欧盟的GDPR协议的发布,引起了软件行业对隐私保护的重要。

四、关于SDL

我们都知道,要想做好一件事,最好需要有系统的方法或模型。在我们软件开发中,我们有“软件开发生命周期模型”,如瀑布模型、迭代模型等,我们依据模型有序的来进行我们的软件开发;我们要开发高质量的软件,同样有很多系统的方法来指导我们如何提高质量。
同样,我们要开发高安全的软件,一样离不开系统的方法来指导。这其中,最有名的就是微软公司提出的SDL模型,SDL的英文全称是Security Development Lifecycle(安全开发生命周期)。SDL表示一个安全的开发过程,2004年,微软的SDL作为强制策略成为微软软件开发生命周期(SDLC,Softwarwe Development Lifecycle)中的一个组成部分。后来SDL这一术语也被其他软件公司使用,各大公司纷纷推出了自己的SDL模型,一些第三方和标准化组织也发布了自己的SDL模型。也就是说,SDL已成为一个通用的术语,但各家公司都发展了自己的SDL,当然微软的SDL依然是最有名、被借鉴最多的方法。
SDL用来指导如何开发安全的软件。简单的说,它由一系列的活动阶段与最佳实践组成。比如各家的SDL都对安全编码、静态/动态代码分析、代码审查都有要求。本文不详细介绍SDL。但我们必须要知道的是,要使用SDL(无论是使用微软的SDL,或者自己改进后的SDL),最重要的一件事是要将SDL中的活动映射到软件开发生命周期(SDLC)的活动中,无论你是选择瀑布开发还是敏捷开发。举个例子,如果你选择的是瀑布开发,你需要知道在计划阶段引入哪些SDL的安全活动和最佳实践。

五、关于BSIMM

BSIMM(The Building Security In Maturity Model)全称是构建软件安全成熟度模型,是美国 Cigital 公司(已被Synopsys收购)于2008年发起的安全研究项目,是2009年3月正式提出的。BSIMM的核心目的就是对组织所实施的“软件安全举措”进行量化。
BSIMM的版本一直也在演进,目前最新的版本是BSIMM9,即BSIMM的第9代版本,是2018年10月发布的。现在主流使用的是BSIMM8版本,即BSIMM的第8代版本。
BSIMM8将软件安全划分为4个领域、12个实践模块、113项活动(其中BSIMM9增加到了116项活动),以衡量软件的安全性。
目前,全球各大公司都引入BSIMM,对产品的整体安全能力进行评估,包括安全标准策略、安全培训、安全架构、安全测试等,制定有针对性的安全计划,持续提升安全成熟度。

BSIMM8的4个领域分别是:

  • 治理:该领域中的实践活动旨在帮助组织、管理和评估软件安全计划。人员培养也是该领域的核心实践活动。
  • 智能:该领域中的实践活动旨在汇聚企业知识,用于在整个企业中开展软件安全活动。这些集体智慧既包括主动安全指导,又包括组织威胁建模。
  • SSDL触点:该领域中的实践活动与特殊软件开发工件和流程的分析和保障有关。所有的软件安全方法中都包含这些实践活动。
  • 部署:该领域中的实践活动与传统的网络安全和软件维护组织有关。软件配置、维护和其他环境问题都将对软件安全产生直接影响。

BSIMM8的每个领域又由若干个实践模块组成,一共12个实践模块,分别如下:

领域 实践模块
治理 1. 战略和指标(SM)
2. 合规和策略(CP)
3. 培训(T)
智能 4. 攻击模型(AM)
5. 安全功能和设计(SFD)
6. 标准和要求(SR)
SSDL触点 7. 架构分析(AA)
8. 代码审查(CR)
9. 安全测试(ST)
部署 10. 渗透测试(PT)
11.软件环境(SE)
12. 配置管理和安全漏洞管理(CMVM)

每个实践模块可分为不同的级别(一共3级,最低1级,最高3级),每个级别又由若干项活动组成。也就是说BSSIMM的成熟度等级并不是一个单独的等级,而是其12个实践都有自己的等级。整个BSSIMM8共包括113项活动

下面我们以第一个实践模块“战略和指标(SM)”来举例说明它的不同级别下包含的活动项。如下面表格:

活动描述 活动名
第1级
公布流程(角色、责任和计划),按需演进。 SM1.1
设立宣传岗位,开展内部推广。 SM1.2
培养高管的危机意识。 SM1.3
确定门控的位置,收集必要的工件。 SM1.4
第2级
对内发布相关软件安全数据。 SM2.1
通过异常情况评估与跟踪来实施门控。 SM2.2
创建或扩大辅助小组。 SM2.3
确定指标并使用它们来赢得预算。 SM2.5
要求相关人员签发安全证明书。 SM2.6
第3级
使用带组合视图的内部跟踪应用。 SM3.1
执行对外推广计划。 SM3.2

作为一个组织,其安全成熟度模型,就看其实施的BSSIMM各实践模块的活动项的满足程度,显然要达到高级别,其低级别的活动项必须先满足。
BSSIMM的好处是提供了一个清晰的框架及具体的活动项,可以让不同企业可根据自身情况,选择相应的实践活动,以持续提升软件安全水平。同样,也可为企业评估自己的安全成熟度的程度提供了依据。

到此,我们已经介绍了BSIMM和SDL两个安全开发模型,那它们有啥区别?我们该如何选择呢。软件安全开发模型从大类上可分为两类,一类是指导性模型,另一类是描述性模型。指导性模型以微软SDL为代表,这类模型的最大特点就是它已经规定好事项,你需要怎么做下去才是符合这个模型的一个事件。BSIMM是描述性模型,它不是告诉你如何往下做,而是描述了你正在做哪些事情,或者已经做了哪些事情。
在实际应用中,在SDLC(软件开发生命周期)的时候,建议使用SDL,并将SDL映射到SDLC中,应用SDL中的最佳实践从而来实施安全开发。之后再用BSIMM来评估开展地怎么样,做地好不好,哪里还有缺失,或者哪点做地比较好。BSIMM相对比较独特的一点,就是它可以用来评估各种各样不同的指导性模型。此外,为了保持数据新鲜度,BSIMM会更加频繁地更新自己的模型,保持与时俱进的状态,所以我们看到BSIMM模型的版本一直在升级,BSIMM本身对于一些新趋势或者新技术的获取非常敏锐,包括现在流行的敏捷开发和容器技术的应用,BSIMM可以很好地适配敏捷的趋势。

六、个人怎么做

上面我们对软件安全的一些基本概念,以及SDL模型和BSIMM模型做了简单介绍。那么,我们站在一个研发人员的角度,如何去看待和实施软件安全。这有几点建议:
1、彻底扭转以前对软件安全的认识,认识到软件安全不是可有可无的,而是不可或缺的关键属性。
2、要想开发出高安全的软件,仅是思想上认识还是远远不够的,关键还得能力上具备。对于普通的研发人员,一些基本的软件安全知识和技能是必须要掌握的。对于想将软件安全作为一个职业方向的研发人员,比如想成为软件安全架构师,这需要更多的学习和实践。
3、需要知道常见的软件安全漏洞和解决方案,各种调查数据显示,这么多年来,排在前10位的安全漏洞问题并没有发生太多的变化。这意味着,我们只需在自己开发的软件中将一些排名靠前的常见安全漏洞避免掉,我们的软件安全性就得到了一个很大的提高。
4、在软件安全开发中,我们要以黑客的思维去思考。
5、工具在软件安全开发和测试中会起到非常大的作用,我们要会使用一些常用的软件安全辅助工具(如漏洞扫描工具)。
6、要对业界流行的安全模型熟悉,如SDL和BSIMM模型,并知道如何将这些模型中的实践和活动融入到开发过程中。

七、小结

本文对软件安全的基本概念做了简单介绍,并介绍了SDL和BSIMM两个模型,然后对如何实施软件安全给出了一些粗浅的建议。
总结下,就是我们需要重新认识软件安全,真正的重视、敬畏安全问题,像对待质量一样对待软件安全,并如同提升软件开发各个领域内的能力一样,不断提升个人的软件安全方面的技能。

你可能感兴趣的:(重新认识软件安全)