编码开发的相关技术,在安全实现层面,仍需要结合所选择的编程语言,考虑其安全编码过程。一般来说,安全实现的过程通常会分为以下三个步骤。
1、安全编码培训
指专门针对某种编程语言所易发的安全缺陷或高危函数所做的编码赋能培训,也可以作为安全培训活动中的一门课程来实施。
安全编码培训的内容通常依赖于开发应用程序或API所使用的编程语言,如果是Java语言,Spring Security官方文档是一个优质的资源,可以根据实际需要,将其中相关的章节摘抄出来,作为培训的案例。除此之外,各个企业内部的安全编码规范也是一个很好的培训资料。另一方面,每一个企业或团队,历史安全缺陷记录都是很好的参考资料,将排名靠前的安全编码案例进行分析、分享是安全编码培训很好的培训方案。案例分析时,对造成API漏洞的原因做详细剖析,以加深编码人员对漏洞原理的理解。
2、安全编码
指编码开发人员根据安全编码规范开展编码的过程。
很多企业或团队内部都有自己的编码规范或安全编码规范,但往往仅仅是规范文本,很难以在实施工作中执行,这样的安全编码规范实际上没什么用。一个好的安全编码规范实践其实是遵循PDCA循环的,除了编写规范文本并定期修订外,在编码过程中也要采用工具进行编码规则的检测,比如阿里的代码规则检测工具P3C、SonarQube的安全插件。通过编码规范检测或静态检测,将编码规范纳入日常编码的活动中进行闭环,才是安全编码规范真正要起到的作用。
3、静态检测
指对编码人员所提交的代码进行静态代码检测,以发现编码过程中的安全缺陷,并迭代改进的过程。
静态检测是安全编码中很重要的一环,尤其是在编码开发人员安全编码能力不足的情况下,静态检测从事后验证的视角,有效地保障编码实现的安全性。静态检测通常根据开发语言的不同会选择不同的工具,或者说,同一种静态检测工具,因开发语言的不同,检测效果会有比较大的差异。所以企业在采购静态检测工具时,需要结合企业使用的开发语言,选择合适的代码静态检测工具。
一般来说,选择代码静态检测工具时,主要的参考指标如下。
- 支持的开发语言:虽然很多检测工具都宣称能扫描多种开发语言,但所支持的开发语言检测的效果到底怎么样,这需要企业自己去做横向比较。
- 漏报率:通常使用含有已知漏洞的应用程序,比如WebGoat、DVWA之类的漏洞学习平台,来验证静态检测工具的漏报率。比如已知漏洞是1300个,实际扫描后只发现了75个,则漏报率为25%。
- 误报率:是指在发现的漏洞中,不是漏洞而误报为漏洞的比例。比如报告出漏洞是100个,实际验证后发现了25个不是漏洞,则误报率为25%。
- 运行环境与配置:是指静态检测工具运行的操作系统环境、机器配置、内存等,有的静态检测工具只允许运行在Windows环境下,有的静态检测工具则在Windows、Linux、UNIX下均可以;有的可以;与CI/CD集成,有的则不可以,这是在工具安装时需要考虑的。
- 报告格式:是指检测结果所提供的展现形式,一般有HTML、Word、PDF、Excel格式等。
- 报告内容:是指是否支持根据不同的漏洞等级或检测规则导出不同的报告结果数据。
- 性价比或购买方式:是指付款和使用方式,比如同样的费用下使用期限是多久、维保多久、是否支持API调用、是否可以支持同时多个用户并发等。
从目前的静态检测实践来看,大多数企业在使用两种或两种以上的静态检测工具做交叉检测,以减低漏报率。