目录
安全测试的重要性
安全测试方法
AST工具
SCA工具
到底用哪种工具?
随着DevOps的发展,企业应用迭代的速度得到了大幅提升。但同时,安全如果不能跟上步伐,不仅会抵消DevOps变革带来的提升,拖慢企业数字化转型进程,还会导致漏洞与风险不约而至。2012年,Gartner提出了DevSecOps的理念,将安全防护流程有机地融入传统的 DevOps 流程中,为研发安全提供强有力保证,安全工具是支撑研发阶段安全要求落地的重要保障。
在Forrester 2020年发布的调查报告统计《The State Of Application Security, 2020》中显示,在 480家全球企业已经确认的外部攻击中,针对Web应用程序是位于首位,占比39%,攻击 Web 应用程序主要指基于程序的 SQL 注入、跨站脚本或者远程文件包含攻击。针对软件漏洞攻击占比30%,主要指对于安全漏洞的利用攻击。
安全测试是 DevSecOps 实践的关键部分,软件程序经过各种方法的测试以保证质量。安全测试是一个专业领域,拥有自己的一套工具和实践,旨在暴露这些漏洞。
安全测试工具分为两类:自动化安全测试工具和手工安全测试。而自动化安全测试工具现在市场细分已经非常完善,有诸如SAST、SCA等等工具。手工安全测试一般则指的是渗透测试。
1.SAST简介
超过50%的安全漏洞是由错误的编码产生的,开发人员一般安全开发意识和安全开发技能不足,更加关注业务功能的实现。想从源头上治理漏洞就需要制定代码检测机制。
SAST是一种白盒测试技术,通常在编码阶段分析应用程序的源代码或二进制文件的语法、结构、过程、接口等来发现程序代码存在的安全漏洞。是在开发阶段对源代码进行安全测试发现安全漏洞的测试方案。
SAST一般优势:
①代码具有高度可视性,检测问题类型更丰富
②测试对象包括WEB应用程序、APP
③不需要用户界面(UI),漏洞发现更及时
SAST一般劣势:
①代码理解局限性、区分开发语言
②不能确定漏洞可利用性,漏洞分类不明确
③不能整合测试问题,集成系统的漏洞发现不了
2.DAST简介
DAST是一种黑盒测试技术,是目前应用最广泛、使用最简单的一种Web应用安全测试方法。在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定该Web应用是否易受攻击。
安全工程师常用的工具如AWVS、AppScan等就是基于DAST原理的产品。
通用实现流程:
DAST一般优势:
①攻击者视角,可发现大多数高风险问题
②无需源代码,测试对象范围较广
③支持当前的各类主流编程语言开发的应用、第三方组件、第三方框架
DAST一般劣势:
①覆盖范围有限,覆盖率依赖于Explore的结果,对于AJAX页面、CSRF token页面、验证码页面等无法扫描
②测试对象为HTTP/HTTPS的web应用程序,无法测试APP
③无法定位漏洞的具体位置,不适合DevOps环节集成使用
3.IAST简介
IAST是2012年Gartner公司提出的一种新的应用程序安全测试方案,通过代理、VPN或者在服务端部署Agent程序,收集、监控Web应用程序运行时函数执行、数据传输,并与扫描器端进行实时交互,高效、准确的识别安全缺陷及漏洞,同时可准确确定漏洞所在的代码文件、行数、函数及参数。IAST相当于是DAST和SAST结合的一种互相关联运行时安全检测技术,属于灰盒测试技术。
IAST的实现模式较多,常见的有代理模式、VPN、流量镜像、插桩模式,本文介绍最具代表性的2种模式,代理模式和插桩模式。
A.代理模式:在PC端浏览器或者移动端APP设置代理,通过代理拿到功能测试的流量,利用功能测试流量模拟多种漏洞检测方式对被测服务器进行安全测试。
通用实现流程:
B.插桩模式:在保证目标程序原有逻辑完整的情况下,在特定的位置插入探针,在应用程序运行时,通过探针获取请求、代码数据流、代码控制流等,基于请求、代码、数据流、控制流综合分析判断漏洞。插桩模式具体实现有2种模式,Active 插桩和Passive 插桩。
a.Active插桩通用实现流程:
b.Passive 插桩通用实现流程:
IAST一般优势:
①漏洞准确率高,误报率极低,漏洞信息详细度高
②支持测试AJAX页面、CSRF token页面、验证码页面、API孤链、POST表单请求等环境
③测试过程无感知、漏洞发现快
IAST一般劣势:
①只能在具有虚拟运行时环境的语言上执行,例如JAVA、C#、Python、NodeJs,不支持C、C++、Golang等语言
②每次更新Agent需要重启webserver,部署成本较高
③无法测试业务逻辑漏洞
4.SAST/DAST/IAST应用场景分析
5.SAST/DAST/IAST产品技术分析
1.SCA简介
SCA工具用于检测并跟踪代码库中的所有开源组件,以帮助开发人员进行管理。高级的SCA工具可以使管理开源代码和开源组件的整个过程自动化,从选择、发出警报甚至到自动阻止。SCA还提供了关于所发现的开源漏洞的具体信息,以便开发人员可以轻松的修复这些漏洞。
2.SCA主要工作项
①开源漏洞管理
②开源许可证管理
③SBOM
3.SCA实践层级
一般来说,SCA工具可以划分为4个等级。
①成熟的包管理器
我们使用的许多语言都会有比较成熟的包管理器,我们可以基于它的依赖配置文件去识别组件。比如说Java我们最常用的maven,它的依赖管理文件一般都是pom.xml,go一般则是go.mod。
②没有包管理器
但像C/C++这样的语言,它没有像maven这样统一的包管理器,SCA识别起来就会有些困难。目前业界一般的做法是进行哈希指纹匹配,但这就需要提供SCA的公司必须有一个庞大的组件库以及版本的特征库,这样才能实现软件成分分析。
③开源代码片段(源代码SCA)
前两种情况都是建立在开发者比较懒的前提下的,也就是说他们直接、完整的引入了一个开源组件。但在很多时候,开发者可能看到某一个代码片段写的不错,就copy过来。这个代码片段可能来自github甚至CSDN,行数不等,变量定义不明。这个时候传统SCA的依赖分析(dependency check)就无法完成对这些代码片段的识别了,需要更进一步的源代码同源或二进制同源分析才行。目前一般的SCA工具只做到了依赖分析,但泛联新安的CodeAnt已经支持精准的源代码同源和二进制同源分析。
二进制分析SCA
相比于之前的白盒测试,我们在实际应用中还有很多黑盒的场景,比如说一些可执行文件以及安装包这些怎么去识别。这就是二进制分析要做到的事情了。
比较项 |
源代码SCA |
二进制SCA |
备注 |
检测对象 |
源代码 |
二进制 |
|
检测效率 |
高 |
高 |
|
检测准确率 |
较高 |
高 |
与目标程序引用开源软件功能多少直接相关 |
嵌套组件检测能力 |
弱 |
强 |
二进制SCA不会遗漏所有引入的开源软件功能特征信息 |
检测语言种类 |
多 |
少 |
二进制SCA只支持能够编译出指令流或字节流二进制文件的语言 |
文件格式 |
简单 |
复杂 |
源代码都可看作文本格式,二进制文件存在pe、elf、coff、jar、apk等等 |
文件特点 |
一个开源软件包含N个源代码文件 |
一个二进制文件包含N个开源软件 |
|
检测阶段 |
开发 |
测试 |
|
检测绕过 |
存在 |
不存在 |
源码在构建环境中引入的或链接静态库引入的开源软件可以绕过源代码SCA检测 |
样本特征构建难度 |
低 |
高 |
|
人工确认分析难度 |
低 |
高 |
④SBOM
高级SCA工具可以自动化生成SBOM,但SBOM在本质上只是一张列表,它提供充足的可见性,却不传达任何风险信息。成熟的SCA工具在生成SBOM的基础上,通过完整的依赖关系图厘清问题组件的影响范围,通过漏洞风险等级优先级排序给出有效的专家处置建议,这样才能真正将SBOM与相关风险关联起来,最大程度的帮助用户解决开源与软件供应链安全问题。
SBOM基本元素:
1.Author name作者名
2.Supplier name供应商名
3.Component name组件名
4.Version string版本号
5.Component hash组件哈希值
6.Unique identifier特殊标识符
7.Relationship依赖关系
SBOM示意图(SPDX格式):
应用安全不是一个简单的二元选择——要么有安全、要么没有。应用安全更像是一个滑动的尺度,提供额外的安全层有助于降低事件的风险,希望能达到组织可接受的风险水平。因此,应用安全测试减少了应用的风险,但不能完全消除它。然而,可以采取一些措施来消除那些最容易消除的风险,并加强使用中的软件。以下简要介绍几种常用的应用场景与工具选择标准:
1.我是开发人员。毫无疑问,SAST可以解决开发人员90%的困扰,它能在code阶段进行静态检测,并有效检出漏洞与缺陷,帮助开发者更好的编写代码并实现代码的可见性与安全性。
2.我是运维/测试人员。在代码已经封装完毕后,DAST和IAST才能最大限度的发挥它们的价值。代码封装宣告着开发阶段告一段落,接下来最重要的问题是实际使用时是否存在新的问题,动态检测工具DAST和IAST是最好的助力。
3.我介入的DevOps流程太多。IAST是近几年的新兴技术,它结合了SAST和DAST的很多优点,兼容了静态与动态检测的多重优势,可以在开发、测试、生产阶段都起到不俗的效果。但要注意一点:IAST的核心技术是插桩,但并不是每种语言都有成熟的插桩技术,目前Java、Python、PHP、Go对插桩技术都有不错的支持。但其他语言则弱了很多,这会直接导致检出成功率的大幅下降。
4.我可以访问应用程序的源代码。不要犹豫,SAST是最好的起点。虽然DAST和IAST也可以在运行时检测漏洞,但既然你有权限访问源代码,何不采用最直接的办法呢?
5.我无法访问应用程序的源代码。此时DAST变成了最好的选择。
6.我不关心源代码,但我的软件中有大量第三方依赖与开源组件。此时SCA是最好的选择,SCA工具致力于管理开源组件和依赖,检测开源漏洞,提高合规性水平。
7.我想维护企业的软件供应链安全。来试试UniSCA软件供应链管理平台吧!
参考资料:让代码安全变轻松,简单好用的开发安全平台-CodeAnt