国务院印发的《“十四五”数字经济发展规划》中指出数字经济是继农业经济、工业经济之后的主要经济形态,是以数据资源为关键要素,以现代信息网络为主要载体,以信息通信技术融合应用、全要素数字化转型为重要推动力,促进公平与效率更加统一的新经济形态。规范健康可持续是数字经济高质量发展的迫切要求。我国数字经济规模快速扩张,但发展不平衡、不充分、不规范的问题较为突出,迫切需要转变传统发展方式,加快补齐短板弱项,提高我国数字经济治理水平,走出一条高质量发展道路。
软件作为信息技术基石,如何从软件开发层面保障数字经济高质量发展成为当下软件开发者需要思考的问题。从信息安全角度出发,软件漏洞是造成安全问题的一大根源。绝大多数系统和应用漏洞源于在软件开发的需求分析、总体设计和代码编制等过程中引入的缺陷。
软件产生安全漏洞的原因有很多,如
-
软件开发周期短,工作量大,无暇顾及安全;
-
软件设计时缺乏安全设计;
-
软件开发人员缺乏安全编程经验;
-
功能越来越多,软件越来越复杂;
-
软件模块复用,可扩展性/灵活性要求高;
-
互联网环境下攻击挑战越来越多;
但其根本威胁只有两项,或来自于软件内部存在漏洞,或来自于外部攻击威胁。
从开发环境与开发人员侧分析,软件开发者通常缺乏安全开发的动机,开发者收到的要求通常是在短时间内满足某某业务功能;同时公司也缺乏对开发者的专业安全知识教育,同时在流程与工具,没有为软件开发安全提供有力支撑。
CMMI(Capability Maturity Model Integration,即能力成熟度模型集成)提出对软件每千行的代码缺陷率如下:
等级 | 千行缺陷率 |
---|---|
CMMI1 | 11.95‰ |
CMMI2 | 5.52‰ |
CMMI3 | 2.39‰ |
CMMI4 | 0.92‰ |
CMMI5 | 0.32‰ |
但实际能通过CMMI5认证的组织在全国甚至全球范围寥寥无几。所以在组织编写代码过程中,存在大题代码缺陷(BUG)是事实,当然这些缺陷并不一定都会造成信息安全问题,但极有可能是信息安全问题发生的根本原因。
作为开发人员,在面对安全的攻击时往往会把解决安全事件的希望寄托在安全厂商的安全设备或安全服务上,但是他们忽略了一点——安全厂商所提供的设备或服务,通常是基于已知漏洞的防护,而面对未知漏洞或较新的漏洞,设备和服务较难发现。同时依托于安服设备或服务,从本质上也没有改变软件存在安全漏洞的事实,只是针对攻击行为做了阻断或告警防护。所以要想从本质上改变软件存在安全漏洞的现状,必须要对软件做出修改或打上补丁。此时开发人员的工作量会显得非常巨大。分析攻击产生的原因,分析软件中漏洞是如何被攻击者利用对开发人员而言都存在一定困难。因为开发人员没有经过专业的安全训练。
举一个简单的例子:比如某攻击者通过公司OA网站的后台上传页面,上传了一个WebShell。在这个攻击过程中,作为研发人员优先解决什么问题?是防止攻击者破解或盗用管理员账号,还是防止从后台上传WebShell。在整个事件处理的视角,在公司层面可以优先使用一些安全设备防止攻击者破解或盗用管理员账号,但这些工作是属于网络安全部门职责,作为研发人员,我们要从本质上解决问题,首要防止上传WebShell。其次可以根据网络安全部门要求,加强对网站登录的账号管理,如登录时,是否有安全的验证码,防止暴破,OA管理员是否强制要求使用高强度密码。而作为网络安全人员,则要分析OA后台密码被盗用的其他可能性,比如网站是否使用了安全的传输协议,防止窃听。所以想要解决安全漏洞,从本质上还是要回归到开发人员对漏洞代码的修复。
再举一个例子,比如下面的代码
当攻击者传递恶意参数id,会导致SQL语句的执行。如传递参数
id=1' and SELECT user() -- +
后台就会执行
select name from users where id =1' and SELECT user() -- +;
这样会查询当前数据库连接的用户名。如果攻击者构造更多的恶意语句,甚至可以将数据库所有的内容都dump下来,也就是我们俗称的“脱库”。此类的问题,发生过程是在代码中,虽然我们今天有WAF防火墙可以防止SQL注入攻击,但是并不能改变我们的代码存在SQL注入漏洞的事实。并且一旦发生了SQL注入,导致数据或信息泄漏,对公司的影响是非常巨大的。此时再来从研发侧修复漏洞,或使用安全防护设备来阻断攻击,都为时已晚。
所以,作为软件开发人员,从开发过程中就需要考虑安全问题,可以参照安全的编码规范,从管理角度,引入以安全为导向的软件开发生命周期管理。典型的模型可以参照微软的SDL模型。
安全开发生命周期(SDL)是侧重于软件开发的安全保证过程。SDL(Security Development Lifecycle)或S-SDLC(Security -Software Development Life Cycle)即软件安全开发生命周期,是指在软件开发的各个阶段(规划、设计、编码、测试、发布、运营等)增加一系列的安全活动,确保软件安全隐患能尽早识别并及时消除。也是在今天非常多的开发安全中提到的安全左移。美国国家标准与技术研究院(National Institute of Standards and Technology,简称NIST)也指出,在软件发布以后进行修复的代价是在软件设计和编码阶段即进行修复所花代价的30倍。下面我们分别从软件开发的不同阶段的安全活动进行简单讲解。
-
在软件开发的全过程中,有必要进行开发安全意识的培训,比如我们这篇文章目标也是在此。
-
在规范阶段,我们可以进行风险评估;
-
在设计阶段,我们可以进行威胁建模
-
在编码阶段,我们需要约束编码规范、使用SAST静态扫描代码、使用开源组件分析工具进行开源组件的安全审计;
-
在测试阶段,我们可以引入DAST或IAST等扫描手段,进行充分的安全测试;
-
在发布阶段,我们可以引入基线管理、补丁管理、渗透测试等手段提高安全性;
-
在运营阶段,我们可以引入安全防护设备、应急响应机制加强最后的闭环过程。
同时,在今天还有非常流行的DevSecOps模型。DevSecOps 是“开发、安全和运营”的缩写,在软件开发生命周期的每个阶段自动集成安全性 - 从最初的设计到集成、测试、部署直至软件交付。这里强调的是自动集成,因为我们今天的开发模型有很多场景下是一种敏捷开发,版本迭代周期很短。在这种场景下,我们对开发安全的自动化集成能力就非常重要。比如我们可以使用SAST静态代码扫描系统,对接代码托管仓库,只要代码发生更新,SAST就能自动化的实现扫描,自动生成扫描报告发送到相关人员邮箱,以减少该版本的代码中的缺陷。如下图:
通过本文,希望各位开发者,能加强自己的安全开发意识,从软件开发层面为我国数字经济高质量发展保驾护航!
本期作者:
黄浩,深信服教学教研中心副主任,深信服安全服务认证专家(SCSE-S)
产业教育中心资深讲师,CISSP认证注册信息系统安全师,中国计算机学会会员,暨南大学网络空间学院校外实践指导老师,深圳大学专业学位研究生校外导师,深圳信息职业技术学院产业学院副教授;对企业网络安全框架设计、业务逻辑安全与防御体系有深刻认识;擅长DDoS攻击防御、操作系统安全防护、密码学、企业安全架构、取证溯源、应急响应等多个方向的课程。