SCA安全检测

SCA安全检测

SCA(Software Composition Analysis)软件成分分析,通俗的理解就是通过分析软件包含的一些信息和特征来实现对该软件的识别、管理、追踪的技术。

基本原理

SCA理论上来说是一种通用的分析方法,可以对任何开发语言对象进行分析,Java、C/C++、Golang、Python、JavaScript等等,它对关注的对象是从文件层面的文件内容,以及文件与文件之间的关联关系以及彼此组合成目标的过程细节。由于SCA分析过程中不需要把目标程序运行起来,因此具有分析过程对外部依赖少,分析全面,快捷、效率高的优点。

SCA分析过程:

首先对目标源代码或二进制文件进行解压,并从文件中提取特征,再对特征进行识别和分析,获得各个部分的关系,从而获得应用程序的画像—–组件名称+版本号,进而关联出存在的已知漏洞清单。

特征库里面存在两条路径:来自二进制文件和生成二进制的源代码

二进制SCA检测原理

对于二进制文件来说,虽然很多源代码中具有的信息二进制文件不存在,但对于常量字符串、部分类名称、函数名称以及一些配置信息具备一定的不变性。因此二进制SCA主要从二进制文件中提取这些方面的不同特征,再运用匹配算法进行相似度计算,并根据相似度门限来检测出引用的开源软件名称和版本号。

结合分析二进制代码中的CFG调用图、DFG数据流图等信息进行更加精准的检测。但由于这些分析需要对二进制文件进行指令反汇编,导致分析时间非常的长,分析效率低下,因此这种SCA检测方法不适合对大规模二进制文件进行扫描

优点:

不需要编译大大提升自动化出来水平和提取效率,提取的特征只限于源代码中的特征,提取特征纯度很高

缺点:

针对不同语言类型开发相应的特征提取工具

源码SCA检测原理

由于源代码中包含有丰富的程序信息,因此源代码的SCA检测既有粗颗粒度的检测方法,也有细颗粒度的检测方法。

粗颗粒度检测方法:根据源代码文件的相似度判断。可基于hash的严格匹配,也可根据文本相似度匹配,但存在效率高速度快准确率低的问题

细颗粒度检测方法:通过源代码—>AST抽象语法树—>IR中间代码—>语义分析、CFG调用图、DFG数据流图等来提取相应的数据,再通过机器学习、NLP等来进行代码相似度的检测
具备包管理机制:比如Java、Go,可以通过引用的开源软件包信息来实现开源软件的关联分析,这种方法可以几乎可以100%准确的分析出引用的开源软件名称。

源代码和二进制功能对比

SCA工具

  • SCA工具中有5款支持软件包开源软件SCA检查能力(synopsys/Sonatype/Veracode/Jfrog/GitLab),其他工具只支持源代码SCA检查能力。
  • 5款支持软件包SCA检查工具中,对C/C++、Java、.Net语言支持的比较好,但对Golang、python、JavaScript语言支持能力偏弱,比如:synopsys支持的组件对象中前面3种语言占大头90%+,相应的检测率也高,而Golang语言的组件检出率则低很多。
  • SCA已从主要用作对开源软件的检测向应用程序的典型编码问题检测趋势扩展,比如Veracode工具,它能提供了对诸如缓冲器溢出、命令行注入、死锁、重复释放、整形数溢出、UAF、格式化字符串漏洞,SQL注入等典型编码问题的检测能力。

从SCA原理可以知道影响分析准确性的因素分两个方面:其一是SCA工具支持组件的数量和检测算法,其二是应用程序引用开源软件的方式。因为SCA工具是根据样本组件特征来匹配被测程序中的特征来判断应用程序是否引用该组件的,因此支持组件的数量越多,那么检测率也就越高,支持的组件数量越少,越会导致检测遗漏;另外检测算法和特征设计是否合理也直接影响到分析的准确性和分析效率。

应用程序在引用开源软件时,不同的应用程序即使引用同一个组件也存在引用不同的功能,引用功能的多少也各不相同,这样带来的结果就是在应用程序中包含该组件的特征数量也是大小不同的,引用功能多包含的特征一般也多,引用的功能少包含的特征也少。而应用程序包含组件特征的多少直接影响到SCA工具的检测的准确性,组件特征越少SCA工具检测越困难,因此即使两个不同应用都引用了相同组件,可能一个应用可以检测到,另外一个应用则无法检测出该组件。这种场景对SCA工具检测二进制文件尤其明显。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2024 John Doe
  • 访问人数: | 浏览次数:

让我给大家分享喜悦吧!

微信