应用安全测试
近年来,由于网络边界愈发模糊、新型攻击手段层出不穷,软件安全的重要性也愈加突显,越来越不容忽视。应用安全测试(Application Security Testing,简称AST)作为保障软件安全的核心手段,自然也取得了快速发展。Gartner在2017年6月的《全球信息安全预测分析报告》中指出:“预计2021年之前,应用安全测试领域的市场将保持14.3%以上的综合年度增长率(CAGR),这是所有信息安全环节中增长率最高的部分” 。
代码作为构建各种应用、系统的基础组件,其安全问题是软件安全的根源性问题。因此,AST领域中有多类技术都可以应用在代码安全保障中,例如静态应用安全测试技术(Static Application Security Testing,简称SAST)技术、动态应用安全测试技术(Dynamic Application Security Testing,简称DAST)技术、软件成分分析(Software Component Analysis,简称SCA)技术等。
随着开发模式的不断演进和信息安全趋势的变化,对代码安全保障技术提出了规模化、自动化、智能化的要求,从而实现软件的快速、安全、自动的发布。未来数年中,代码安全保障技术将会走向何方,以下是我们根据该领域现状分析归纳出的几项趋势和技术发展方向。
基于人工智能的代码安全分析
由万物智能互联而产生的数据洪流,催生了当今人工智能的飞速发展。作为分析、挖掘数据价值的创新方法,人工智能可以充分利用、释放数据的价值,从而带来前所未有的增值效应。随着软件的复杂度不断提升,软件的代码数量也在迅速增加,从代码中抽象出的数据也越来越多,同时安全测试往往又是对复杂数据的分析。如此看来,代码安全对于人工智能而言,似乎是一个完美的应用场景。
虽然利用人工智能技术辅助安全和风险管理者进行代码安全治理的路线目前尚不十分明晰。但是,一些世界顶级的安全厂商,已经开始使用人工智能在代码安全领域开展一些研究和尝试。例如对于SAST产品而言,虽然其应用十分广泛、价值不可否认,但是其误报率较高的问题一直受到业界的诟病。引入人工智能的技术后,可以使用SAST工具的结果作为输入,以训练缺陷模式从而发现误报;然后系统会输出某个置信水平内的误报列表(或排除误报的列表);为了进一步的改进,可以通过结果的审计,识别出新的误报并反馈到训练集中,计算出新的模型。随着这种算法的迭代进行,新的信息不断被纳入到预测算法中,以期持续的改进。IBM的SAST产品提供了针对扫描结果的智能查找分析(IFA),以消除误报,噪音或利用概率低的结果。360代码卫士团队也在进行将人工智能技术应用于代码安全分析的研究,以期在其产品的后续新版本中提供相应的功能。
虽然人工智能、机器学习乃至深度学习作为近年来大热的技术方向,让人难以区分其价值的真实成分和炒作成分。但是不得不承认,人工智能技术和传统代码安全技术的结合,是AST领域的重要发展趋势之一。
面向安全的软件代码成分分析
Forrester Research 2017年的一份研究则表明,为了加速应用的开发,开发人员常使用开源组件作为应用基础,这导致80%-90%的代码来自于开源组件。而VeraCode在《软件安全报告(第7版)》中指出,大约97%的Java应用程序中至少包含一个存在已知漏洞的组件。由此可见,随着开源组件在现代软件中使用比率的持续增长,以及日益严峻的组件安全问题,开源(或第三方)组件的发现和管理已经成为AST解决方案中关键性甚至强制性的功能之一。
软件代码成分分析(SCA)技术是指通过对软件的组成进行分析,识别出软件中使用的开源和第三方组件(如底层库、框架等等),从而进一步发现开源安全风险和第三方组件的漏洞。通常,SCA的检测目标可以是源代码、字节码、二进制文件、可执行文件等的一种或几种。除了在安全测试阶段采用SCA技术对软件进行分析以外,SCA技术还可以集成到MSVC、Eclipse等IDE或SVN、Git等版本控制系统,从而实现对开发者使用开源组件的控制。
SCA技术和其他AST技术的深入融合,也是代码安全技术发展的趋势之一。当使用单一SAST技术扫描某个项目的源代码之后,你可能会得到开发人员的反馈:“检测结果中有90%是开源代码的问题,我处理不了”。而当SAST融合了SCA技术之后,开发人员拿到的结果将是开源组件中的已知漏洞信息和实际开发代码中的SAST扫描结果。
面向DevSecOps的代码安全测试
由于敏捷开发和DevOps的开发技术趋势,传统应用安全的形态不断发生着变化。很多具体的技术路线仍然在不断演进,但是对于自动化、工具化、时间控制的要求越来越明显了。面向DevSecOps的代码安全测试,并不是一门全新的技术,但是几乎所有的传统安全测试技术,都会因为DevOps而产生变化,演化出新的产品形态。
由于开发运维的一体化,原本开发人员的一次普通Tag或Merge操作,也被赋予了更多的含义。提交代码中的安全问题,可能就意味着一次失败的发布。因此,代码安全的需求也被前置到了前所未有的程度。能够在代码编写的同时,发现代码中的安全隐患,从而在第一时间内修复,成为了DevSecOps的基本需求。因而IDE插件、轻量级的客户端快速检测模式,也成为了下一代代码安全产品的标配。
由于持续集成、持续部署在DevOps中的大量应用,自动化的、快速地代码安全测试也势在必行。因此,代码安全产品需要与Jenkins、Bamboo等持续集成系统,Bugzilla、Jira等生命周期管理系统进行集成,实现有效的自动化;同时,提供针对代码安全基线的检测,以及增量分析、审计信息携带等功能,从而在少量或没有人工参与的情况下,尽可能快速地、有效地保证软件的安全性。
交互式应用安全测试
SAST产品,通常从源代码层面对程序进行建模和模拟执行分析,但是由于缺少一些必要的运行时信息,容易产生较高的误报;DAST产品虽然能够通过攻击的方式,发现一些确实存在的安全问题,但其对应用的覆盖率很低。
交互式应用安全测试(Interactive Application Security Testing,简称IAST)技术,是解决上述问题的一个新的尝试。关于IAST,Gartner分析师给出的定义是:“IAST产品结合了DAST和SAST的技术,从而提高测试的准确率(类似于DAST对于攻击成功的确认),同时对代码的测试覆盖率达到与SAST相似的水平”。 IAST在其准确度、代码覆盖率、可扩展性等方面,有着独到之处。但又受限于它自身的技术路线,无法在所有场景中替代DAST产品。
IAST产品的解决方案通常包含两个部分:应用探针和测试服务器。应用探针会部署于被测Web应用所在的服务器,从而捕获来自于用户代码、库、框架、应用服务器、运行时环境中的安全信息,并传输给测试服务器;测试服务器会对收集来的安全数据进行分析,得出漏洞的信息进而生成报告。另外,值得一提的是,基于这种应用深度探测与分析的技术,还能够实现实时的应用层攻击的自我防护,阻断对诸如SQL注入、跨站脚本等漏洞进行的利用和攻击,这就是实时应用程序自我保护(Runtime Application Self-Protection)技术。
(本文作者:360企业安全集团代码安全事业部技术总监 章磊)