第2章 全面认识SDL
2.1 SDL概述
从软件工程学角度来看,今天的软件存在安全隐患是不可避免的。而且,今天的软件安全问题不只是一句“只要是人写的代码,就一定会有漏洞”就能够阐述清楚的,存在一定的复杂性。简单来看,软件安全问题可以归因于软件需求日益多样化、规模日渐庞大以及交付周期紧迫等。而深究其理不难发现:今天的软件安全问题主要源于软件生产方式的改变(一般是指采用新的软件开发方法论)和相应的软件项目管理能力的缺失。
而回到软件开发和安全管理实践层面,今天的软件的安全隐患主要来自以下几方面。
1)旧的软件开发方法论并没有将安全属性作为基本要素纳入软件开发过程。因此,在旧的软件开发方法论指导下的软件开发过程和软件产品,要么不采用任何安全措施,要么只能以应急安全管理方式临时应对安全问题,例如上线后才通过人工渗透测试、自动化安全扫描等方式发现安全漏洞并反馈至开发人员修改,或者运营过程中通过应用防火墙、WAF、IDS/IPS等技术进行安全防御。然而,绝大多数的安全漏洞来自软件本身而不是网络,而且将开发与安全割裂开来的做法使得发现的安全漏洞不能及时得到反馈和修复。此外,这种方式需要先将问题软件下线,再将修复后的软件上线,如此将会产生高昂的修复成本。
2)大多数缺少软件开发方法论指导或沿用旧的软件开发方法论的企业在开发软件时并不具备良好的安全意识,且秉持亡羊补牢的想法被动地逐个修复已发现的安全漏洞。组织内部欠缺软件项目安全管理能力。
3)随着构(组)件式开发[1]的提出和推广,纯自研软件产品占比越来越少,引入开源组件已经发展为一种主流的软件开发方式。然而,随着开源组件在软件产品中的占比越来越高,开源组件引入过程中的安全风险、知识产权合规风险越来越高。现实中太多案例说明,开源组件的引入已经成为引发软件安全问题的重要因素。
透过前面在软件工程学视角的一系列分析,我们不难发现传统的应急安全管理方式的不足,并认识到开发安全之于软件的重要意义。对于开发安全来说,安全左移主张在软件开发早期阶段进行相关的配套安全活动(如威胁建模、安全编码、安全测试等),从一开始就赋予产品安全属性,无疑能将安全管理的综合成本降低到较低的水平。而前面章节中提到的SDL包括了将软件安全前置、集成到软件开发阶段的内容。因此,无论作为一种软件安全开发方法论,还是软件安全开发方法论下的一种具体的软件安全开发管理模型,抑或是一种泛指SDL模型、实践以及软件安全开发方法论等的综合性安全开发框架,SDL都是开发安全范畴下最重要的概念之一,对企业践行软件开发安全有着重要意义。
更确切地说,SDL旨在提供一种安全开发过程以及配套的组织、文化、流程和技术等,而这一安全开发过程应当由软件开发安全的最佳实践组成。这些最佳实践主要基于微软SDL、BSI和CLASP等各种相关的安全开发模型和框架,并结合了安全专家在组织内部的应用落地经验。
[1] 来源于杨芙清主编的《构件化软件设计与实现》。其中,所谓的构(组)件化开发实现了更高水平的软件复用,大大提高了软件开发效率,成功克服了“第二次软件危机”。