SCA软件成分分析工具可以通过静态和动态有两种技术方式实现:
- 静态分析:通过对源代码或二进制程序进行分析,从而识别被检测项目中包含的开源组件,开源组件本身包含的已知漏洞、组件版本信息、许可证信息等便可以查询得到;
- 动态分析:在被检测程序执行状态,通过探针等方式获取加载的开源组件信息,再获取对应的漏洞、许可证信息等。
静态分析方式又可以分为两类:
- 类包管理器技术,一般是通过各种开发语言的包管理器(例如maven工程的POM文件解析)、工程属性文件等获取项目依赖的开源组件,或间接依赖的开源组件。
- 同源分析技术,通过库中代码生成hash和被检测项目采用相同粒度(包、文件、函数/方法,最细的可以定制代码行级)的hash,通过hash匹配或相似匹配方式,找到开源组件名称及其对应的版本。
静态分析方式,对被检测项目不产生侵入性,且可以与SAST工具一起进分析,覆盖已知漏洞或未知漏洞(SAST检测的是已知漏洞类型的未知漏洞/缺陷),SAST对于程序词法、语法分析的结果,有利于分析SCA检测出的开源组件的可达性。基于类包管理器技术研发的SCA产品,由于开源组件之间相互依赖的关系很多,不可避免的增加了检测结果中开源组件的数量,以及安全漏洞的数量,对于开发团队来说,都是一个不小的负担。采用同源分析的SCA工具,其依赖的源库必然很大,才能达到更准确的覆盖,往往一个开源组件有几十个版本,针对不同操作系统、不同架构有很多分支,再考虑代码指纹生成的粒度,则需要存储海量代码生成的指纹,其检测精度一个方面依赖库的大小、指纹数据多少,另一个方法就是目的与源的匹配算法。
动态分析方式,基于编译生成的二进制程序,有的厂商也称为二进制检测。比较适合无法拿到源代码的甲方企业,测试团队或测评机构等。具有较高的精度,但是需要完整的项目部署。在进行功能测试、性能测试等测试期间,可以同步完成SCA检测。但是受限于功能测试或操作程序功能的广度和深度,导致一些边缘功能可能遗漏,而代理漏报。对于二进制程序采用静态分析方法,不管采用逆向工程技术,还是二进制程序中特征代码指纹的提取,都可能由于中间有损的处理过程,导致检测结果的精准度降低。
通过上面的简单分析,小伙伴们应该了解了每种分析方式的优缺点,也了解到为什么有些产品安装需要很长时间拷贝库,而有些产品二进制检测与源代码检测方式检测结果为什么有差异了。