数字经济时代,几乎每个行业都较大程度依赖于软件,任何威胁到软件的事物,实际上都会给我们的财产和生命造成直接或间接的威胁。因此,我们在软件生命周期中不仅需要考量软件质量与研发效能,还需要同步嵌入软件安全思想及配套安全活动,在不影响软件开发和迭代速度的情况下有效保障软件安全。
为了更好地理解安全在软件生命周期中的意义,本节将沿用SDLC 5阶段加以说明。一般认为,安全在软件生命周期中至少应该包括以下方面:在每个阶段有必要的安全考虑及采取相应的安全防护措施,在各个阶段进行风险点发现、预案设计、实施等的记录与跟踪监测。如此,即使无法杜绝安全风险,也能做到尽量避免或减少安全隐患。
准备阶段的安全活动主要包括两方面。一方面是团队人员安全意识和安全能力的培训,确保每个人对软件安全有一定认知,并担负起责任。安全培训贯穿软件生命周期中的各个阶段。通常,大型企业主要是通过构建安全培训体系,持续为开发团队提供不同阶段、不同主题的内部安全培训;小型企业则主要依赖外部供应商的不定期培训。另一方面是和软件需求分析、架构设计相关联的威胁建模。“从源头开始进行风险治理”是新时代安全开发的一个基本原则,而需求分析和架构设计时即准备阶段则是构建安全可信的软件的最佳时机。该阶段的安全目标主要是对各环节中出现的安全风险及时进行预判、发现和处置,以提升风险处理效率。在项目选型的时候,开发团队需要全面考虑开发语言本身及软件架构是否有明显漏洞,此外,对于安全接口设计、数据结构等都要进行相关风险评估。
在准备阶段,安全活动包括但不限于以下几方面。
1)安全培训:企业内部或聘请团队为开发人员进行针对性的安全培训,详细介绍软件产品可能存在的关联隐私和合规要求,普及安全标准、行业标准、国家标准及当下业内的一些最佳实践经验,避免因疏忽造成不必要的安全问题。
2)确定安全标准:规范安全要求,可以通过检查清单或者安全基线的形式,明确各岗位人员的职责和行为标准。
3)情报准备:提前调研和准备业内权威机构的官方、开源和第三方漏洞库,为后期相关阶段的漏洞情报做储备。
4)攻击面分析:分析软件各个部分可能出现的攻击风险。
5)应对策略选择:提前准备安全事件处置标准和相应预案。
6)威胁建模:在需求分析和架构设计过程中有针对性地进行适合组织落地实施的软件威胁建模和漏洞关联分析等安全活动。
7)设计审核:确定质量安全规范。
8)物理安全:建立硬件设施安全管理制度,定期检查保养,保证硬件基础设施防盗、防火、防灾,并进一步保障设备固件、网络系统等核心设施不受干扰和攻击。
在开发阶段,绝大部分的安全活动是围绕着如何实现安全开发展开的,其中包括保证组件合规与制品库统一,基于最小攻击面原则进行代码编写,及时修复已知漏洞等内容。在开发阶段,开发人员需要确保编码安全,测试人员则应确保及早发现并阻止或缓解代码威胁。
在开发阶段,传统的安全活动包括但不限于以下几方面。
1)确保环境安全:严格控制第三方和开源组件的来源,统一制品库,对已知的开源组件、框架及时进行漏洞修复、更换无风险版本或更新升级等,避免源头的污染。
2)建立安全编码规范和安全测试标准:建立安全编码规范,对开发人员进行相应的安全培训,并通过引入相对安全的开发框架等,帮助开发人员尽可能高效地写出更加安全和可靠的代码,避免引入各类潜藏的高危安全漏洞及严重代码缺陷,进而降低代码维护成本并方便代码审查等后续工作开展。建立统一的安全测试标准,旨在确保测试工作尽可能地覆盖各种潜在的安全漏洞,从而提高软件安全属性,而不仅仅是将关注点放在软件业务功能的实现上。
3)模糊测试:一种通过对目标软件系统提供无效或非预期的输入,继而监测软件系统是否异常(如崩溃、断言、故障等),以发现如内存泄漏等异常缺陷的软件测试技术。模糊测试是一种相对较新但并不复杂的软件测试技术,其原理非常简单,在测试过程中用一个随机坏数据(即Fuzz)攻击目标程序,进而观察哪里出现了异常。模糊测试能够发现软件程序中的重要漏洞,比如与数据库或共享内存相关的漏洞。由于是利用超过可信边界的随机数据进行测试,其相较于其他通用软件安全测试技术,有时甚至会收到意想不到的检测效果,特别是对畸形文件及复杂协议有着较好的检测效果。
4)静态应用安全测试(Static Application Security Testing,SAST):一种传统的代码安全测试技术,侧重软件程序的结构测试、逻辑测试和代码测试,主要覆盖通用漏洞、缺陷及代码不规范等问题。作为在编码阶段主要使用的代码安全测试技术,SAST需要从语义上理解程序的代码、依赖关系、配置文件。
SAST主要特点如下。
·相比黑盒漏洞扫描 技术,SAST技术介入时间更早,可以较好地辅助程序员做安全开发,可通过IDE插件形式与集成开发环境结合,实时检测代码漏洞。漏洞发现越及时,修复成本越低。
·测试对象相比黑盒漏洞扫描技术更为丰富,除Web应用程序之外还能检测App及二进制程序的漏洞。
·较高的漏洞误报率。一般,商业级的SAST工具误报率普遍在30%以上,误报在一定程度上会降低工具的实用性,需要花费更多的时间来清除误报。
·检测时间较长。利用SAST技术扫描代码仓库,稍微大型的项目需要数小时甚至数天才能完成,这不利于持续集成和持续交付。
5)代码审计:这里的代码审计,主要是指安全专家人工检查软件源代码的安全性,以审查和指导修复潜在的安全漏洞。这一步骤是传统软件开发安全活动中主要的漏洞发现和消除手段。
为了确保在软件上线前就发现安全漏洞,尽可能避免安全事件发生,相关人员在软件上线前就应当进行严格的评审和必要的安全测试,确保目标软件产品安全、可靠,并持续提升软件系统的安全防护性与稳定性。
在部署阶段,对于目标软件产品,开发团队必须进行最终安全审查(Final Security Review,FSR)。最终安全检查,即针对目标软件产品在上线前所做的最后一道安全审查。最终安全检查是一种相当复杂的基于软件安全需求的评估方法,旨在回答一个问题:从安全角度来看,这个软件准备好交付给用户了吗?最终安全审查能够为开发团队和管理者提供软件产品的总体安全情况,其结果在一定程度上反映了软件产品发布和交付用户后能够抵御攻击的能力。
在部署阶段,安全活动包括但不限于以下几方面。
1)建立测试环境:对软件产品模拟真实环境测试,以便软件产品达到真实运行情况下的要求。
2)进行全面的安全审计:对软件产品进行全面的安全审计。不同于前面的代码审计,这里的安全审计主要针对软件产品架构设计等进行安全性检查。
3)黑盒漏洞扫描:对准生产环境下部署的软件产品进行黑盒漏洞扫描。黑盒漏洞安全测试,即动态应用安全测试(Dynamic Application Security Testing,DAST),也是一种主要的软件安全测试技术,侧重软件产品的功能测试。使用该技术,开发团队无须了解软件程序的内部逻辑结构,也不需要掌握软件产品的程序代码,仅需要知道软件系统的输入、输出和相应功能即可。DAST技术适用于大部分的软件。
4)渗透测试:一种站在黑客的角度、通过授权模拟攻击的方式对目标软件系统进行针对性漏洞挖掘的深度安全测试技术,主要用来验证现有软件系统防御机制的有效性。假定软件系统已经全方位开启相关安全策略,渗透测试应当能够客观地验证出当前系统安全策略的有效性,帮助识别软件系统的漏洞和缺陷并进一步评估软件系统的安全风险情况。
5)全面扫描:该技术不仅对软件系统进行身份识别和权限、攻击面分析,也检验数据是否符合管控要求。
6)现场维护:要求开发人员参与对软件系统的维护,以便查漏补缺;对变更操作的时间、IP、人员等进行详细审查。
由于运营阶段的安全挑战主要源于安全软件爆出新的漏洞及突发安全事件,故本阶段的安全活动不仅需要安全人员和运营人员的有效协调配合,还需要开发团队持续做好软件产品的后期维护工作。
在运营阶段,安全活动包括但不限于以下几方面。
1)安全监控:对项目运行当中的活动日志和异常情况及时更新,对数据库、中间件和系统状态进行持续监控及上报。
2)变更处理:对需要升级或版本更迭的产品,及时提醒用户,设置合理的备份与回退机制,通过多终端测试后,采用蓝绿发布等方式柔性发布,做好应对策略。
3)技术支持:通过对工单进行分析和对用户进行回访,及时分类、归档,同时对问题进行排期解决,最后将问题及时更新在系统的知识库中。
4)事件响应:一旦出现安全问题,快速进行问题定位、漏洞分析和修复处理,同时做好漏洞修复、版本更新、负载过度等安全事件的应急预案。
为了避免产品和用户的敏感数据流入社会和确保数据符合国家相关法规要求,废弃阶段的安全活动主要包括对服务和数据进行下线和销毁处理。
在废弃阶段,安全活动包括但不限于以下几方面。
1)服务下线: 根据日程安排服务下线,关闭服务器或相应云端环境,避免因遗漏让攻击者有机可乘。
2)合规与隐私保护: 严格依照法律法规,将涉及用户隐私内容的设备进行清除或物理销毁(依照数据留存最小化原则)。