跳转至

软件开发

说明

本文是因XX邀请,思度安全整理了思度文库上百份软件安全开发的标准和报告及结合思度安全自身实践,输出的软件安全开发体系系列课程(部分内容还在校对和完善中),希望大家对软件安全开发有个全面的认识,欢迎大家加入我们一起维护软件安全开发知识库。

录制的视频版可以在B站或视频号(思度咨询)上查看

本文大量使用了AIGC + midjourney 等新技术,如有版权问题,请随时联系我们

企业安全开发的原动力

通过思度安全对几十家有软件安全开发需求的企业的调研,总结出目前企业做软件开发主要动力可分为外因和内因两种。外因主要以国家法律法规、行业监管及企业股东/投资人(算外也算内)的要求,内因主要是企业自发的、从节约成本的角度进行安全开发治理 法律法规要求
近年来我们国家在网络安全领域密集发布了网络安全法,密码法,数安法和个保法等法律,网络安全的顶层设计已经非常明确,不做网络安全的企业(出现安全事故)就是违法的企业,可以依据相关法律对企业负责人处以罚款,拒不改正企业可能还会面临暂停相关业务、停业整顿、关闭网站、吊销相关业务许可证或者吊销营业执照,可以说后果是非常严重的。

网安法第21条明确我们国家实行网络安全等级保护制度,网络运营者应当按照网络安全等级保护制度的要求,履行安全保护义务。这条被解读成,"不做等保测评就违法"。
网安法第33条提出了著名的三同步机制,建设关键信息基础设施应当确保其具有支持业务稳定、持续运行的性能,并保证安全技术措施同步规划同步建设同步使用

软件应用的重要性
软件应用系统是企业数字化,信息化的基石,出现问题就可能造成重大信息安全事件,进而导致企业违规或违法。 目前我国国家的网民已经达到90%,大部分人的日常生活和工作,如衣食住行高度依赖网络或者说高度依赖各种的软件应用系统,应用系统一旦出现安全问题,影响是巨大的。

安全合规建设驱动力
在法律法规和行业监管下,越来越多的企业开始重视自身软件安全开发的建设,思度安全在为企业提供安全开发咨询服务的实践中我们公司也接触过很多特别初创的公司(1个安全工程师都没有),都想做安全开发体系建设,深入沟通需求后,发现需求不是直接来自主管单位,而来自投资人/股东,股东们是精英人群,非常的敏锐,意识到没有安全开发这个基础企业在未来走不远的,因此非常重视企业软件安全建设。

最好的安全开发建设方案是与企业各阶段的现状相匹配的
但怎样结合企业自身现状,快速的构造适合当前企业开发框架的安全开发系统,仍然面临巨大挑战,成为企业的安全开发建设的核心痛点,因此思度安全也是做了这套软件安全开发科普系列课程。
这份课程是基于思度安全区团队了解的业界最佳实践、团队成员在甲方建设安全开发体系和为甲方提供安全开发咨询的所有经历,将软件安全开发方方面面的内容,进行高度浓缩和提取出适合每个企业的核心内容,分享给每位读者,目的就是传播安全开发体系建设的基础知识,让企业对软件安全开发的全貌有个全面和清晰的认识,帮助企业从0到1构建适合自身安全开发体系。


研究表明,企业的软件安全开发体系建设越靠近研发项目初始阶段,企业所投入的总成本就越低,这也是安全左移思想的理论基础。

企业的开发包括需求立项、设计、编码开发、测试和发布多个阶段,传统研发运营安全,针对服务应用自身的安全漏洞检测修复,通常是在系统搭建或者功能模块构建完成之后以及服务应用上线运营之后,安全介入,进行安全扫描,威胁漏洞修复。如当前的大多数安全手段,防病毒、防火墙、入侵检测等,都是关注软件交付运行之后的安全问题,属于被动防御性手段。

这种模式便于软件应用服务的快速研发部署,但安全介入相对滞后,并无法覆盖研发阶段代码层面的安全,安全测试范围相对有限。

思度安全为很多企业提供咨询时,都会提到这个痛点,线上的业务稳定性是首位,但经常需要因为修复安全漏洞而更新系统,给业务的稳定性带来了巨大挑战,导致安全团队和研发团队常常敌对。

确实是业务上线修复漏洞,成本是非常大的,这个成本到底有多大,不同公司都给出了自己的计算结果,Gartner认为发布后修复漏洞比测试环节发现和修复漏洞高50倍以上,HP和IBM也都认为发布后修复漏洞成本要高30倍以上。

所以业界在安全开发体系建设的核心理念就是 安全左移,将安全要求、技术攻击,尽可能早的应用到企业开发过程中,早发现漏洞早修复。

从长远看这是在帮助企业降低成本,应该是企业安全开发建设的原动力。

企业开发漏洞产生的原因

软件安全漏洞产生的原因有很多,这里归纳了主要几种
组织文化

大部分的企业都没有安全开发的文化氛围,都没有专职安全人员,进而没有对研发人员有任何的要求,直到安全漏洞出现才开始补救,为时已晚。

制度流程
整个组织没有制定任何的软件安全开发的标准、制度、编码规范,所有研发人员没有参考的依据,进而就没有安全开发的意识。

业务复杂
随时互联网的快速发展,从web1.0到web2.0到web3.0,直到现在比较火爆的AI,软件应用的更新速度真的是快的惊人,因此在效率为先的情况下,更加难以保障软件的安全性。

缺少有效的安全工具
思度安全团队在给客户做软件安全开发咨询时,经常听到客户抱怨,我们购买的静态代码扫描工具根本没有办法使用,误报比漏洞还多,确认就需要耗费大量时间。动态扫描器会产生脏数据,对业务或测试有影响。没有一种工具能够检测出来所有的安全漏洞。

其他
除此之外还有其它的原因如供应链问题 目前研发大量采用第三方开发过的组件,对第三方组件没有有效的安全测试即使用,如21年底爆发的 Log4J2远程代码漏洞, 影响了全球所有的公司。

人员意识
但这些原因可能都是表象,最最核心是企业人员安全意识与能力存在缺失,整体研发团队没有意识到安全研发的重要性,没有经历过巨大的、 沉重的安全事件,其实真的很难体会到安全的重要。经常隔岸观火的看哪哪个公司数据泄露了,哪哪个公司网络被攻击或中了勒索病毒,只有事情发生在自己身上,才会知道有多疼。

思度安全团队很多成员都见证过,当一个企业开始重视软件研发安全,从企业顶层也就是CTO以上级别开始来改造企业的开发流程,真的可能只需要半年的时间,效果就会凸显,就能打好基础,比如高危漏洞要在一周内修复,新系统或重要大变更的系统要进行安全测试后才能上线等,新研发工程师入职时,要进行安全培训等。

软件开发安全漏洞事件举例


首先我们看一下 OWASP TOP 10给出的漏洞排行榜,Open Web Application Security Project (OWASP) , 大家可能都知道,是国外知名的应用安全开放社区,成立于2001年12月1日,至今已经有20多年的历史,在全球各国都有分会,我们国家的大部分省份都有owasp的分会。owasp对外免费开放了,应用程序工具、标准、前沿的研究、及安全库等,是世界范围内公认的权威机构。

其中 OWASP TOP 10 是 owasp的一个项目,从2003年发布第一版,每2~3年就更新发布新版。从owasp 2021年发布的Top 10可以看出,常见的安全漏洞排名 第一是 失效的访问控制,比如api接口没有对访问者的身份进行校验或校验不充分存在绕过等,就返回了敏感数据给客户端。

排名第二 漏洞是 加密机制失效,主要是敏感数据以明文方式在网络中传输,或者使用默认密码进行加密等

排名第三漏洞 是注入漏洞,注入类是应用系统常见的,也是最古老的一类漏洞,长期占据在owasp top 10的榜首,主要是指sql注入、xss、命令注入等漏洞,对于owasp top 10的每种漏洞,我们后面会详细介绍,这里就不一一列举了。

应用系统的安全漏洞,也是近年来,安全事件频发的主要原因,我们可以看到右边的国内外商业巨头,如百度、腾讯、阿里、谷歌、苹果、亚马逊等在历史上都出现过因开发漏洞而导致的安全事件,影响也是巨大。


大家经常在新闻上看到各种信息泄露事件,很多都是因为软件开发中的安全漏洞所引起的,尤其是存有用户大量信息的网络运营者,一旦出现安全漏洞,影响是非常大的。 这里我们列举了几个大家熟知的安全事件

第一个是 微博5亿用户绑定手机号在暗网出售 ,或因通讯录接口遭暴力破解

"近日,暗网出现一则出售“5.38亿微博用户绑定手机号数据”的交易信息。经安全圈人士验证,部分测试数据属实。" 对此,微博安全总监罗诗尧回应称,这些手机号是2019年通过通讯录上传接口被暴力匹配的,内部发现后第一时间已报警。 多个安全监测平台监控到,有暗网用户于3月4日发布了一则名为“5.38亿微博用户绑定手机号数据,其中1.72亿有账号基本信息”的交易信息,售价1388美元。其中绑定手机数据包括用户ID和手机号,账号基本信息包括昵称、头像、粉丝数、所在地等。

第二个补天漏洞响应平台再次爆出中国电信某系统的重大漏洞

2015年10月,补天漏洞响应平台再次爆出中国电信某系统的重大漏洞。通过该漏洞可以 查询上亿用户信息,涉及姓名、证件号、余额,幵可以进行任意金额充值、销户、换卡等 操作。10月29日上午10点,该漏洞已得到中国电信厂商确认。

第三个乌云平台连续披露了两个携程网安全漏洞

2014年3月,乌云平台连续披露了两个携程网安全漏洞,由于携程开启了用户支付 服务接口的调试功能,导致携程安全支付日志可被任意读取,日志泄露包括持卡人 姓名、身份证、银行卡类别、银行卡号、CVV码等。

主流安全开发框架

第一开发框架是微软的SDL,微软大家都不陌生,日常用的windows操作系统,Office办公软件都是微软公司的产品。微软在2000年左右开始做软件的安全开发,是已知世纪上最早做软件安全开发的公司。提出了著名的SDL安全开发周期模型。思度安全软件安全开发公开课系列 还会详细学习SDL这个开发框架。

第二个开发框架是DevSecOps, DevSecOps是Gartner 在2012年提出的概念,简单介绍一下Gartner公司,是全球知名的信息技术研究和咨询公司,其业务范围涉及技术市场、IT管理、企业治理与风险以及 IT基础设施等领域,可以说Gartner引领了安全的发展方向,很多新的技术趋势都是由Gartner成功预测,Gartner一个新的报告,可能就诞生很多新型安全公司。

2017年RSA峰会之后,DevSecOps开始成为世界热门话题。看名字,就可以理解,是将安全Sec加入到Dev研发和Ops运维中。后面内容咱们还会详细学习DevSecOps这个开发框架。

关于微软的SDL和Gartner DevSecOps, 其实有很多不恰当的说法,比如DevSecOps是SDL的进化版或提升版。在我们理解两者是基于不同的软件开发模式,SDL是基于瀑布开发模式,DevSecOps是基于DevOps更加敏捷的开发模式。这个有很大的历史背景,早期微软的产品,主要是windows,office等PC端软件,迭代比较慢,开发周期长,首先要保证软件安全和质量,所以都是基于瀑布开发模式,进而就形成了SDL安全开发框架。而随着Web2.0为技术驱动的互联网业务快速发展,特点就是小步快跑,快速迭代,可能一天就有成百上千次迭代,传统的瀑布模式已经无法满足这种业务的需求,进而敏捷和DevOps开发模式诞生了,比较有代表的就是国际巨头亚马逊电商业务,十多年前,就使用DevOps,代表事件整个研发中心,没有一个测试工程师,研发基本上都是全栈,能够独立开发,自己测试,自动化上线部署。而DevSecOps是基于DevOps等敏捷开发模式而产生的,所以说两种的适用的业务场景是完全不同的。 SDL和DevSecOps核心理念都是将安全管理和技术,融入到软件开发模式当中,进而打造安全的软件系统。

在这样的安全开发框架下,我们国内也有很多安全公司专注在软件安全开发领域,(如图所示排名不分先后):

第一个是 默安, 是2016年4月成立,总部在杭州,专职做开发安全,有自己的 雳鉴系列安全开发产品。

第二个是悬镜安全-北京安普诺信息技术有限公司 ,起源于2014年成立的北京大学网络安全技术研究团队 著有夫子ASOC敏捷安全赋能平台 。

第三个是深圳 开源网安 ,开源网安是中国软件安全行业创领者,主要来自owasp 中国会员团队创建的。

其实很有很多专注安全开发的安全公司,如杭州的孝道科技,比领科技 等,而且除初创安全公司外,传统的安全公司如绿盟、启明、天融信、360、奇安信 都有软件安全开发解决方案和相应安全产品。


默安科技的雳鉴系列软件安全开发解决方案的主要产品有雳鉴SAST,IAST,SCA,DSMP等

第一个 静态应用安全检测系统(SAST)专注于解决软件安全开发流程(SDL)中研发阶段的代码安全问题。在不改变当前研发流程和组织架构的前提下,将SAST平台与代码仓库(如SVN/GIT)无缝对接,实现开发阶段的代码安全漏洞生命周期闭环管理,以最小的代价帮助企业和组织实现源代码安全的自动化检测、漏洞周期管理、安全质量分析,实现源代码安全的可视化管理。 从图中可以看到,研发在自己的电脑上开发完代码,提交到代码仓库,雳鉴SAST利用在代码仓库的hook功能,自动的触发新代码的安全扫描,拉取代码到本地,进行安全检测,将发现的安全漏洞存储在数据库中,在雳鉴SAST的web管理平台,用户将能看到详细的漏洞代码,适合研发自己使用的平台。

第二个 雳鉴IAST 专注解决软件安全开发流程(SDL)中测试阶段的应用安全问题。雳鉴IAST使用基于测试工程师的测试请求和基于在代码插桩两种技术的融合架构,采用被 Gartner 评为十大信息安全技术之一的IAST技术,结合SAST和DAST的优点,做到检出率极高且误报率极低,同时可定位到API接口和代码片段,在测试阶段无缝集成,可高准确性的检测应用自身安全风险,帮助梳理软件成分及其漏洞,可以说IAST是现在甲方首选的软件安全测试工具。

第三个雳鉴SCA,主要进行软件成分分析。主要原因第三方组件已经成为各种行业应用软件的重要组成部分。 研发人员在开发过程中习惯性地大量使用三方组件提高开发效率,一个三方组件又会依赖其它更多组件,多级依赖关系最终形成一个复杂的树状结构,这种结构对于应用软件的研发人员和使用人员来说都是不可知、不可控的。即使开发人员受过严格的安全培训,写出了绝对安全的代码,也可能因为某个间接引用的未知组件引入严重的安全漏洞。 SCA主要是帮助客户管理应用中第三方组件所带来的安全、质量以及许可证合规性等方面的问题,避免第三方组件带来的风险。

第四个是雳鉴DSMP研发安全管理平台,和原来用的jira等项目管理系统是一致的,只不过DSMP在开发项目管理的基础上,集成了很多安全的工具。 能够实现开发安全工具的一体化管理,统一收集与分析安全风险和漏洞数据,并通过严格的流程管控完整的风险缓解过程,确保关键风险闭环,应对项目数量多、安全工具杂、安全数据乱等问题,打造坚实的“研发安全中台” 。

这个就是默安的雳鉴系列软件安全开发解决方案的介绍,更多内容大家可以到默安官方网站查看。


悬镜在软件安全开发的解决方案 主要有自动化建模平台,源鉴SCA,灵脉IAST,云鲨RASP等
首先,夫子ATM 自动化威胁建模平台,是针对开发早期需求分析、架构设计阶段,对整个项目进行建模分析,尽可能在早期发现安全风险,节约改造成本。主要方法是根据项目的系统架构,识别组件的安全边界(新开发的系统,已有内部组件,已有外部组件),跟踪用户的数据量,确认各个操作流是否有适当的安全措施,如身份鉴别,访问控制,输入校验,日志审计等。

其次是源鉴SCA-软件成分分析,依靠独有的IAST运行时插桩技术,通过成分分析、依赖分析、特征分析、引用识别等多种技术组合能够精确识别软件中的开源组件漏洞信息,并进一步确认漏洞的真实有效性,使开发人员避免面对数量巨大的误报和无法利用的漏洞,帮助他们区分优先级,将有限的修复精力集中在真正重要的漏洞上。

再次是悬镜灵脉IAST,内置的轻量级AI插桩程序,能够自动化地进行漏洞验证,并定位漏洞代码的位置。解决了传统工具SAST和DAST的高误报的,现在的IAST都宣称为零误报。确实来说,误报要不其它工具低的多。

最后说一下悬镜云鲨RASP,RASP是运行时应用安全保护,顾名思义就是应用在线执行过程中进行保护,类似web安全的防火墙WAF功能,区别是,WAF部署在网络边界,容易被绕过,同时与后端的nginx/tomcat等存在解析http协议不一致的问题,导致防护功能被攻击者绕过。而尽管业务上线前做过很多安全测试,但无法穷尽所有的安全漏洞,而随着业务上线,组件中的新的安全漏洞也被不断的被爆出,线上业务稳定为主,天天因安全漏洞进行系统变更,代价是非常大的,因此RASP应运而生,来解决waf被绕过和需要频繁因安全问题变更业务的难题。

核心技术与IAST基本上是一致的,都是通过插桩来实现检测和阻断攻击请求,但由于是线上业务需要重视性能损耗,所以RASP也在不断的探索中,现在像阿里云上基本都提供了相关的功能和服务,甲方企业可以进行一些尝试。
除此之外悬镜还有很多关于开发的产品或服务,如安全开发实训,安全度量,应急响应等服务。


下面我们来看看开源网安的软件安全开发解决方案

第一个是开源网安S-SDLC平台,一款软件研发安全全流程管理平台,通过整合软件安全开发需要的 流程、方法、工具、知识库等经验,内置了庞大的威胁数据库和安全需求库,对甲方爸爸现有开发流程进行差距分析,全面挖掘软件开发从架构设计到部署运维各个阶段的安全风险,构造安全开发能力,在流程管理方面帮助企业SDL的实施过程中实现量化管理,赋能企业的IT项目团队快捷交付安全、可靠的软件。

第二个是开源网安的DevSecOps平台,与SDLC平台基本类似,将安全开发需要的工具、方法集成到了DevOps CI和CD整个流程中。

第三个是开源网安模糊测试平台(SFuzz),是基于模糊测试技术自主研发的黑盒安全检测产品,专注于面向文件格式和网络协议的模糊测试,通过向目标程序输入基于模型智能生成的测试用例,高效检测出各种软件、硬件系统中的未知漏洞。可以说fuzz是软件漏洞挖掘首选方法,很多漏洞都是通过Fuzz触发的,进而进行深入的分析漏洞原因。

第四个是应用自我防护平台(RASP),是通过在应用程序运行过程中采用插桩技术,实现无需人工干预、无感知、高精准检测和防御外部攻击的安全产品。RASP可以快速地将安全防御功能融合到正在运行的应用程序中,像“抗体”一样使应用程序具备自我保护能力,从而自动实现免疫对应用程序的外部威胁,实时检测并阻断攻击行为。前面咱们也介绍过RASP的产生背景与WAF防御的区别,确实RASP将是线上安全防御的趋势,并且势不可挡。

关于开源网安的软件开发平台主要介绍这几个,更多的平台大家可以到开源网安官方网站查看,最新的产品。

软件安全开发建设思路


思度安全认为要想做好软件安全开发必须要通过制度流程、技术工具,将安全文化融入到企业当前的开发流程中,逐步的提升企业研发体系相关人员的安全意识和能力,进而提升软件系统的安全性。

组织文化
第一个就是组织安全开发文化,很多中小企业都处在安全开发说起来很重要,做起来就是次要,忙起来就不要了,更有一些企业来提安全开发都不提,只在等出现安全事件后,才想进行补救,但很多的安全事件是一失万无,是根本没有办法补救的。

所以组织文化建设是安全开发的第一个步,而且是重要一步,要从组织层面建立 决策层,管理层、执行层和监督审计机构,对应起来就是从企业的董事会,CXO级别作为整体的决策层,管理层应由研发中心,质量中心,运维中心、人力资源中心、法务、财务等的总监构成,很多人很难理解为什么涉及到很多职能部门? 因为会涉及到人员处罚,需要人力、财务,如果触发法律则还需要法务部门把关。执行层就是具体安全工程师,研发工程师、测试工程师和运维工程师等,执行具体安全开发任务,监督层就是类似内部审计、安全检测员等人员,负责确认安全开发的执行情况。

制度流程
组织机构可能是实体机构也可能是虚拟的联合小组,只有在研发工作的开始或者关键节点才会做出决策或组织相关会议,那日常工作主要是靠组织机构下制定的组织内权威制度和流程来具体执行,所以软件开发的制度流程是组件软件安全建设的重要内容。

研发的安全制度是国家网安法三同步要求与组织软件研发的有机结合,是日常解决研发团队内部纷争的重要依据,是研发团队统一的行动指南。具体包括软件安全开发的总体要求,有些企业也称为软件安全开发方针或软件安全开发总纲、软件安全开发管理规范、软件安全开发操作指南和作业指导,以及相关模板和表单等。是一个完整的4级软件安全开发管理制度体系。

流程是指软件研发的各个核心阶段,比如立项、架构设计、编码、测试、上线等阶段要加入安全管控措施,俗称卡点。

技术工具
指与制度流程相配套并保证有效执行的技术和工具,可以是独立的系统平台、工具、功能或算法技术等。这个我们在前面课程介绍主流开发框架时,有介绍过,常用的静态代码扫描工具SAST,动态代码扫描工具DAST,交互式代码扫描工具IAST及软件成分分析SCA等,每一个分类都有适合的业务场景,很难说孰优孰劣,并且每类技术都有很多产品,商业的或者开源的,甲方爸爸在软件安全开发建设时,要不断的测试,寻找到与企业业务场景,编码习惯等高度匹配的工具,加以改良,才能达到事半功倍的效果,否则就会出现,产品买了,钱花了,用不起来,只成为摆设,成为了资源的巨大浪费。

人员能力
上面的建设组织文化、制定制度流程、选择技术工具都需要研发团队去执行,这里说的研发团队是大研发,上到CXO下到具体的工程师,所以说人员意识与能力是整个安全开发的核心,建设的重中之重,但怎样才能真正提升研发人员的意识和能力? 是一个非常复杂的问题。

大研发团队成员复杂的很,有多年资深架构师或开发工程师,有出入职场的新人或实习生,甚至还有其它厂商的外包研发人员。 针对不同背景的研发人员,需要制定不同的解决方案,总体上 思度安全提出三安原则,就是知安、守安和怕安。
首先组织制定了安全开发制度和流程,要让所有的研发人员知道,要正式发布相关的安全开发管理制度,对研发人员进行培训或组织学习,在理解制度要求的基础上签收制度,在制度发布系统如内部办公OA,点击确认,表示了解和知道企业的具体安全开发要求。

其次在具体的研发过程中,比如编码、上线等核心环节,要严格按照安全开发制度进行执行,要有闭环的检测方案,可以通过人工review或者通过sonar ,SAST,DAST,IAST这些技术工具来确认研发人员是否遵守了相关安全研发制度要求。

最后是害怕安全,随着业务系统的高度复杂及人性的懒惰特性,日常研发经常变成,安全说起来重要,做起来次要,忙起来不要。无论我们在实际的企业安全开发建设过程中,还是为甲方爸爸提供安全开发咨询服务,都会遇到这样的情况,而且出现这种问题的不仅仅的职场研发新人,资深研发工程师可能都会出现这种问题。所以最后一条安全开发措施就是处罚,根据不同的违规情况进行对应的处罚规则,可以是通报、可以是罚款、甚至对于屡教不改,明知故犯的人直接应该进行开除,只有这样安全开发才会制定起来红线,真正的走入每个研发团队成员的心中。

持续改进
最后说的是持续改进 安全开发建设之所以难,原因是它是长期建设的过程,需要持续长期的坚持和改进。 主要原因,安全研发体系中的基础元素人员、技术、漏洞都是随着时间的推移在变化的。自然安全开发防御体系就要对应进行变化,实现由静态防御变成动态防御。
比较典型的案例是微软21年被lapsus$ APT组织攻破,导致部分源代码被泄露的例子,我们前面讲安全开发框架时,说过微软是最早开始做软件安全开发的公司,提出了SDL开发框架,但并不意味着微软CSO首席安全官就能睡个安稳觉,仍需要不断改进整体的安全开发体系,适应变化的安全开发环境。

我们来看一下软件安全开发的核心原则

可能让由经验的听众有所失望,软件安全开发并没有什么新的高深的新理论,所有的原则基本上都是安全建设体系最基本的原则,比如默认安全,最小化、纵深防御,已经说了几十年,今天说起来仍然没有过时,可谓是经久不衰。

但对于这些原则,每个人都有自己的理解,当说到具体的原则时,很少有过多的解释和交流,都是一句你懂得,一带而过。上次给某个集团做软件开发安全咨询项目,要写安全开发管理制度,写道这个默认安全想给权威定义,翻遍了互联网发现也没有找到一个确切的权威的定义。 所以思度安全致力去做安全基础知识的传播者,就是想不断搞清楚每个看似比较基础的安全知识,达到业界的阶段性的共识,并且将相关基础知识从理论落到实际项目中。思度安全一直认为安全基础才是安全开发建设的核心。
所以我们还是希望对每个原则做一些具体的学习分享

第一个 默认安全:通过正确配置软件所依赖的组件,以及在系统运行环境中添加的安全防护措施,来减少系统漏洞的数量,提高漏洞利用门槛,降低漏洞的危害,以确保应用程序初始状态下处于安全状态。

默认安全认为是相对企业编码人员而说的,比如研发不需要考虑安全,只写业务代码是理想状态,因此默认安全的架构、第三方组件、第三方函数,或者底层的安全函数,都是对研发来说的默认安全,如果生产环境waf,rasp能防护所有开发漏洞,那么这些对研发人员来说都是默认安全。

第二个 最小化 表现在功能和权限上,引入的第三方组件要尽可能关闭多余功能,开启基础的安全配置和防御措施,这些要在深入了解组件的基础上才能实现,需要耗费大量的时间。

微软SDL概述

前面咱们讲过微软SDL是世界上已知第一个软件安全开发框架,它是微软软件安全治理的结晶,是一个事实上的软件安全开发参考指南,后来的亚马逊,思科,vmware、淘宝、腾讯等企业的安全开发体系都衍生如此。

所有学习和讲解软件安全研发的课程都会讲到微软的SDL,咱们思度安全也是持续的跟踪和学习微软的SDL体系,从微软比尔盖茨2002年发布著名的TwC memo,到2022年微软SDL实施20周年的分享,几乎所有公开的材料,思度安全都研究过,确实是非常有价值,任何想做软件安全开发的企业都可以从微软20年SDL的发展历程中获得收益,这也是一份软件安全开发的防坑指南。

思度安全软件安全开发系列将用一个专题版块来讲述这段激情澎湃的发展史。 思度安全将微软sdl 20年的发展汇总了一张图,微软SDL以安全是每个人的工作为前提,通过三个核心、五个功能、十六个必选活动,将安全以工程化的形式融入到软件开发各阶段,并且在全世界100多个国家/地区的微软团队,成百上千微软产品开发流程中落地,全面提升了微软产品的安全和合规性。


安全开发周期,即Security Development Lifecycle (SDL)是微软提出的从安全角度指导软件开发过程的管理模式。SDL不是一个空想的理论模型。它是微软为了面对现实世界中安全挑战,在实践中的一步步发展起来的软件开发模式。

微软SDL背景一 业务飞速发展


微软SDL背景,是PC业务在世界范围内取得了巨大成功。 1952年,IBM推出“IBM 701”型巨型机,该机即被誉为“世界上第一台商业电子计算机”。此后,IBM陆续推出了IBM 650、IBM System/360、AS/400等一系列具有开创性的巨型机,为商业计算机领域的发展作出了重要贡献。直到上世纪70年代,IBM蓝色巨人公司都是科技人才梦寐以求的工作场所。

1976年,史蒂夫·乔布斯和斯蒂夫·沃兹尼亚克共同创建了苹果公司,罗恩·韦恩在成立前的一段时间也曾参与公司的创建,但最终决定退出了创业团队。在苹果公司成立后,乔布斯主要负责市场营销和品牌推广等业务,沃兹尼亚克负责技术开发和产品设计,两人合作推动了苹果公司在个人电脑领域的发展。乔布斯和沃兹尼亚克共同开发了著名的 Apple II 电脑,该产品被认为是开创了个人电脑革命,并为苹果公司在计算机市场上奠定了基础。

1979年乔布斯第一次访问美国施乐公司 PARC实验室,这里开发了图形视窗和弹出菜单,这个就是个人PC桌面系统的前身,这个发明已经躺在实验室里面整整6年,当乔布斯看到这个发明时,难以抑制自己的喜悦,开始跳来跳去嚷道”为什么你们不用这个做点什么?这些东西太棒了!它将是革命性的”。

因此苹果公司与施乐公司达成战略合作,允许苹果员工进入PARC实验室两次,就是这两次

1984年,苹果推出了第一台Macintosh电脑,这是个人计算机领域的重要里程碑。Mac计算机风格独特,采用独有的操作系统和用户界面,具备先进的图像和音频处理性能,为数字媒体和创意设计领域带来了巨大变革。而随着Mac计算机的不断升级,它也逐渐发展成为面向个人用户的高端计算机。

而苹果推出的Mac操作系统是垄断的,不对外开放合作,为了使用mac操作系统,比尔盖茨还曾写信给苹果高层,希望可以获得授权。苹果内部高层也是分崩离析,创始人沃茨和乔布斯也是去去离离。 在这样大的历史背景上,微软公司相对稳定,后来大家都知道了,比尔盖茨也做出了自己的桌面操作系统 windows,与mac并驾齐驱,由于其开放性,用户更加广泛。

微软SDL背景二 外部威胁攻击

随着微软windows系列操作系统取得的成功,用户越来越多,不仅PC端也包括服务器 Server系列操作系统的IIS等组件,可以说在web1.0时代,IIS几乎是独占服务端市场。 就是在这样的背景下,全球的黑客都在研究windows系统,找漏洞,发现了大量堆栈和堆缓冲区溢出漏洞。 如果你是微软早期用户,可能都受到这些病毒的侵害。

“红色代码”病毒是2001年7月15日发现的一种网络蠕虫病毒,感染运行Microsoft IIS Web服务器的计算机。其传播所使用的技术可以充分体现网络时代网络安全与病毒的巧妙结合,将网络蠕虫、计算机病毒、木马程序合为一体,开创了网络病毒传播的新路,可称之为划时代的病毒。如果稍加改造,将是非常致命的病毒,可以完全取得所攻破计算机的所有权限并为所欲为,可以盗走机密数据,严重威胁网络安全。

“红色代码”蠕虫采用了一种叫做“缓存区溢出”的黑客技术, 利用微软IIS的漏洞 进行病毒的感染和传播。该病毒利用HTTP协议, 向IIS服务器的端口80发送一条含有大量乱码的GET请求,目的是造成该系统缓存区溢出, 获得超级用户权限,然后继续使用HTTP 向该系统送出ROOT.EXE木马程序,并在该系统运行,使病毒可以在该系统内存驻留, 并继续感染其他IIS系统。Code Red 在向侵害对象发送GET 乱码时,总是在乱码前加上一个后缀为.ida的文件名,表示它正在请求该文件, 这是红色代码的重要特征。

尼姆达病毒(Nimda)是典型的蠕虫病毒,病毒由JavaScript脚本语言编写,病毒通过email、共享网络资源、IIS服务器、网页浏览传播,修改本地驱动器上的.htm,.html和.asp文件。此病毒可以使IE和Outlook Express加载产生readme.eml病毒文件。该文件将尼姆达蠕虫作为附件,不需要拆开或运行这个附件病毒就被执行

微软SDL背景三 9.11事件


2001年9月11日,美国遭受了“9·11”恐怖袭击。恐怖分子在两栋世贸中心大楼中分别撞飞了两架波音737客机,导致两栋世贸大楼坍塌,近3000人丧生。然而,除了人员和物质损失外,此次恐怖袭击还给美国的商业運營带来了很大的影响。

飞机撞击造成的直接影响。飞机撞击世贸大楼和五角大楼时,造成了涉及到这些地方的很多公司的业务系统直接被摧毁,其中包括一些在世贸大楼内的公司设备和服务器等基础设施被摧毁,导致这些公司无法访问其应用程序和数据,从而重大影响了其业务正常运转。这直接影响了许多行业,包括金融、保险、航空、运输和旅游等。同时,许多公司被迫关闭其纽约市场的分支机构,由于市区被封锁和交通被中断,许多公司的业务被迫关闭。

网络和电信基础设施受损的影响。在9·11事件中,电信和网络基础设施受到了重大影响,许多电话线路、互联网带宽和Wi-Fi网络在攻击期间失去了连接,这进一步影响了在线交易、电子邮件、电话、语音和数据通信等服务。

数据备份和恢复计划没有做好导致的影响。很多公司在遭受“9·11”事件影响时,发现他们没有做好数据备份和恢复计划或计划存在缺陷,这使得许多公司的数据丢失或无法恢复,导致业务陷入长期停滞或瘫痪。

“9·11”恐怖袭击对美国多个行业、公司的商业运营和信息系统产生了严重影响,通过了解这些影响,让包括微软在内的公司认识到业务系统的可用性,也是今天说的业务连续性是至关重要的。

微软SDL核心里程碑Bill Twc memo

前面咱们讲到,在有大量公开病毒如红色代码,妮姆达病毒攻击微软的服务,给用户造成了巨大损失,又有震惊世界的9.11事件,导致很多服务停服,在这样大的历史背景下,微软已经深刻意识到自身提供软件和服务的重要性,一旦出现安全问题,对用户来说是灾难,将直接影响用户的信任。

因此在这样的历史时刻,微软的高层经过认真的考虑,最终以Bill TwC memo 发出了解决方案,指明了前进的方向。 微软的SDL顶层设计 正式确立。

Bill 就是微软创始人 比尔盖茨

TwC是微软公司的安全计划,全称为“Trustworthy Computing”,即“值得信赖的计算”。

Memo:备忘录

Bill TwC memo 就是比尔盖茨 发布的一封内部全员邮件,宣布了TwC计划。

整个TwC计划,讲述了微软前十年的.net战略的成就,概括说,TwC宣言/备忘录,可以用三个词 可用性、安全性和隐私 进行概括。

可用性:"我们的产品应在客户需要时随时可用。由于支持冗余和自动恢复的软件体系结构,系统中断应该成为过去。自我管理应允许在几乎所有情况下,在无需用户干预的情况下恢复服务。"

安全性:"我们的软件和服务代表我们的客户存储的数据应受到保护,不受损害,并仅以适当的方式使用或修改。安全模型应该易于开发人员理解并构建到他们的应用程序中。"

隐私:"用户应控制其数据的使用方式。信息使用策略应该对用户明确。用户应控制何时以及是否接收信息,以充分利用其时间。用户应易于指定其信息的适当用途,包括控制其发送的电子邮件的使用。"

可用性、安全性这个大家都比较好理解,因为有9.11和各种公开病毒,那为什么会有隐私这个词? 因为在美国信息安全发展的比较早,早在1974 年,美国就通过隐私法案(Privacy Act),要求保护个人的隐私和经济利益不受政府机构的侵犯。所以到2002年 TwC计划时,该法案已经有近30年的历史,美国的公民当时就已经非常重视个人隐私,任何公司一旦出现将个人隐私信息泄露,将直接导致失去用户的信任,进而失去用户,最终可能都会破产,历史上最有代表性的 就是 美国 安然 公司 财务造假,导致公司破产,这也是2002年美国 发布萨班斯-奥克斯利法案 的主要原因。

所以微软想让自己的产品和服务,走的更远,服务更多用户,就必须考虑在可用、安全的前提下,进一步保护用户的隐私,是非常有战略前瞻性的。

在TwC计划中,比尔盖茨 将可信计算 比作日常的电力、水服务和电话服务,坚信可信计算将成为每个人生活当中不可或缺的一部分。20年后的今天我们在来看这个比喻,发现确实如此,虽然完全的可信计算,还未到来,但计算机、手机确实是 大部分人生活中的不可或缺的一部分。

其实 在TwC计划发布前的几年里,有大量的黑客攻击微软的产品,给世界范围内的微软用户造成了重大影响和巨大经济损失,微软的安全工程师也是在极力的做出努力,对抗攻击,修复漏洞,他们还出了本书 中文名字叫《编写安全的代码》,但就是在这样的努力下,其实也没有使得微软的安全开发得到质的改变。 依然是漏洞太多太多,修复不过来 。

而将TwC计划 做为微软SDL的里程碑或者说开端,体现了它的重要性,更加说明了在组织内,顶层设计是至关重要的,现在我们国家发布的 网安法、数安法、个保法都要求采取一把手负责制,由组织领导层成立信息安全小组,统筹组织内部信息安全工作,原因也在于此,只有组织的领导层高度重视,制定制度流程,提供相关的人、财、物资源,才能真正推动艰难的事情落地。

这一点给任何想做信息安全的组织以巨大的启示意义。

微软SDL主要发展历程

微软SDL巨大成果

微软SDL的代价

几乎所有讲SDL的视频资料很少有人会讲到SDL带来的流血和牺牲,在软件开发建设的中期,推行SDL,道路是非常艰辛的,阻力是非常大的。
这张图片是子柳写的《淘宝技术这十年》,里面在采访 当时OceanBase项目负责人(正祥-阳振坤) OceanBase是分布式关系型数据库,已经在蚂蚁集团的核心系统中全面取代了Oracle数据库,“微软的研发模式比较重,流程和审核机制非常严格,每一行代码都要审核很多遍”。 在这样安全为先的情况下,导致了有更多选择的牛人选择了离开,这也是这场变革重最大的代价。

所以企业是否做SDL,什么时间做SDL,怎么做SDL,做到什么等级,这个尺度是企业SDL总舵手要认真思考的,正所谓做SDL 但做好SDL并非易事。

微软SDL主要内容

微软SDL核心理念

前面介绍过微软SDL产生的历史背景(微软的windows操作系统实现世界领先,导致应用服务如windows操作系统,IIS web服务器,office办公软件 都遭受了全球黑客的攻击,各种针对微软产品的病毒不计其数,非常严重,如红色代码、尼姆达等,给微软的用户造成了巨大损失,导致微软产品出现了信任危机)同时,在国外,尤其是美国是非常重视个人隐私的,早在1974年美国就发布了隐私法案,所以微软SDL确定的核心目标是安全与隐私,也不难理解。

安全性:用比尔盖茨的话说”我们的软件和服务代表我们的客户存储的数据应受到保护,不受损害,并仅以适当的方式使用或修改。安全模型应该易于开发人员理解并构建到他们的应用程序中。”

我们将其翻译过来,就是两道防御,第一道防御层 就是减少安全漏洞数量,通过SDL,安全编码,让研发团队尽可能不编写出常见的安全漏洞,web应用就是没有SQL注入、XSS等,pc产品就没有栈溢出、堆溢出等安全漏洞。

但是漏洞或者说脆弱性可以说是应用的基本属性,是客观存在的,彻底消灭可以是美好的目标,但完全消灭基本是不可能。因此微软第二道防线就是在漏洞利用上下功夫,添加防御措施,禁止漏洞的利用。

这也是一种思路的转变,一个漏洞的完整生命周期包括漏洞编写->漏洞发现/挖掘->漏洞分析->漏洞利用->漏洞报告->漏洞修复等,如果没有办法完全杜绝漏洞的产生,那可以在漏洞的其他环节下功夫,就是漏洞的利用,比如针对web漏洞,在网络边界部署waf,应用内部部署RASP,在PC软件编译时,开启GS,DEP,ASLR等安全选项,以应对软件出现安全漏洞时,禁止被利用或大大提升漏洞利用的难度。 延申一下,思度安全从这一点上深有体会,对于安全问题要着眼全局/问题的整个生命周期,单点对抗对于成本和产出可能是不成比例,得不偿失。

隐私:比尔盖茨的话说“用户应控制其数据的使用方式。信息使用策略应该对用户明确。用户应控制何时以及是否接收信息,以充分利用其时间。用户应易于指定其信息的适当用途,包括控制其发送的电子邮件的使用。”,理解起来比较简单,符合法律法规的要求 同时要保护个人隐私 。

前面说的是微软SDL的目标,思度安全认为的微软SDL的核心是 Security is everyone’s job,这也是微软SDL官方上的第一句话,就是安全是每个人的工作,思度安全将其定义为人人安全理念。 要想做好安全开发需要整个大的研发团队每个人共同努力才能实现的,无论PM,架构师、研发工程师、测试工程师、安全工程师、运维工程师等共同努力,才能把安全做起来。
具体怎么落地 微软SDL,核心是定义安全角色和安全职责,其实比较明确,架构师负责安全设计、研发工程师负责安全编码、测试工程师负责质量与安全基础测试,安全工程师负责深度安全测试、运维工程师负责线上环境的安全基线,正确配置安全防护措施。

前面也说到,来自业务进度压力,新员工的进入,导致整个团队安全意识随时间在不断的递减,所以需要不断教育,不断有外部新的安全研究团队加入研究漏洞和新的攻击技术被挖掘,整个研发团队要持续跟踪技术,及时发现问题、寻找解决方案,持续改进。

总结一下: 微软SDL核心思想就是 人人安全理念,是每个企业希望去实现的,但需要做的工作却是非常巨大的。

微软SDL完整实施流程

微软SDL-培训

微软SDL-需求分析

微软SDL-威胁建模

微软SDL-威胁建模工具(上)

微软SDL-威胁建模工具(下)

微软SDL-安全编码

微软SDL-安全测试

微软SDL-发布与响应

参考文档

微软sdl 学习笔记
比尔 盖茨备忘录
威胁建模

Back to top