常见开源代码扫描检测技术分析

**本文内容基于作者个人对相关技术的理解,难免有偏颇遗漏之处,敬请各位指正。本问中的观点仅代表作者本人!**

开源代码检测的目的和方法

目前,开源代码可以说是无处不在,几乎所有的软件中都有开源代码的身影。在现在的软件编程中,代码引用极为常见,很少有哪个编程人员敢说自己编写的软件中的每一行代码都是自己写的,基本所有的软件都会或多或少的引用外部代码,这些外部代码中大部分都是开源代码(OSS)。
使用开源代码的好处很多,但也会带来风险,为了更好的使用开源软件,发挥开源软件的价值的同时又避免其带来的风险,就要对使用的开源软件进行一定的管理,而开源软件管理的基础就是要弄清楚你使用了哪些开源软件,而要弄清楚软件中究竟用了哪些开源代码,通常是件很难的事情。为了发现软件中存在的开源代码,以及由这些开源代码引入的风险,需要对软件代码进行检测。如果想全面准确的找到软件中的开源代码和风险,用人工的方法是不可能的,一般都会使用检测工具来进行这项工作(因为开源代码的总规模是个天量,没有人能知道所有的开源代码,而且现在的软件产品的代码规模通常也很大,用人工方式去阅读所有代码也是不现实的)。
要实现有效的开源代码检测,对检测工具的要求至少有以下几个方面:

  1. 全面、准确发现软件中的开源代码
    这是基础的要求,只有全面准确的检测出软件中的开源代码,才谈得上分析其中的风险。要实现这一点,不仅需要全面准确的开源软件数据,还需要好的检测技术和分析算法

  2. 准确、详细的开源代码风险信息
    检测出开源代码的同时,还要能分析和展示这些开源代码的风险信息,这需要开源代码检测工具的拥有全面准确的开源软件数据

  3. 持续跟踪并发现新的风险
    每个开源软件都是在不断变化的,其风险也不是固定不变的,开源代码检测工具还要能够持续的发现新的风险,这其实是对开源检测工具的数据更新能力的要求。

开源代码扫描检测技术简介

前面已经说过,开源检测工具的优劣主要和三方面相关,即:开源软件数据的准确性与全面性、分析检测的技术、数据更新能力。在数据的准确性与全面性、以及数据更新能力方面,各款工具都标榜自己的知识库是最全、最大、最领先的,也都说自己的数据更新非常及时等等。因为缺乏详细的数据进行对比,所以本文先搁下这些方面不谈,只讨论一下开源代码的检测分析技术。
目前存在两种主流的扫描检测技术:代码特征分析比对技术代码依赖关系分析技术。在具体分析这两种技术之前,我们先举个例子:

比如有一种饮料,我们想知道其中都含有哪些化学成分,我们可以通过解读饮料包装上的成分表去了解,也可以通过对饮料本身做各种化学实验分析去得到。在开源代码检测分析中,代码依赖关系分析技术就类似于成分表解读的方式,而代码特征分析比对技术就类似于化学分析的方式。

技术一:代码特征分析比对

代码特征分析比对技术的本质是比对两份代码中是否有相同的部分,该技术时对软件源码中的每一个代码文件进行分析和比对,该技术其实不只用于检测代码中是否有开源代码,也可以用于代码同源检测等领域。其工作的基本原理如下:

代码文件A 	--(特征提取)-->		特征a
代码文件B	--(特征提取)-->		特征b
如果a=b,则A和B的内容一致,即:A=B。

这和我们用MD5值验证下载文件的完整性的方法是类似的,只是检测工具在进行代码特征比对分析时要批量处理文件、批量比对和展示结果。

另外,不同的工具其特征提取的方法也不相同,有些只提取整个代码文件的特征,这种方式只能分析出

“A=B 或者 A≠B”

而有些工具不仅提取整个代码文件的特征,还对其中的代码片段提取特征,从而不仅能分析出

“A=B或者 A≠B”

还能分析出

“A中的部分内容 = B中的部分内容”,
也就是“A≠B,但A和B中存在相同的代码片段”。

在开源代码扫描检测中使用代码特征分析比对技术时,如果想获得好的效果,取决于以下几个方面:

  • 代码特征提取技术
    如何提取一个代码文件的特征、提取的粒度如何,会直接觉得比对结果的准确性和精确度。
  • 代码特征比对技术
    对两个代码文件的特征进行比对的方式,会影响到比对结果的全面性、比对的效率、以及后期对结果进行筛选和确认的难易程度和准确程度。
  • 代码特征库的质量
    代码特征库就是用来比对用户代码特征的数据源,数据源的全面性和准确性,决定了比对结果的全面性和准确性。
  • 代码特征提取与比对的效率
    在保证全面和准确的前提下,尽量高的比对效率也是非常重要的。

技术二:代码依赖关系分析

代码依赖分析技术是基于分析软件中依赖的外部组件列表来分析软件中使用的开源代码,该技术是针对整个软件进行分析的(或者说是对软件中记录依赖关系的文件的内容进行分析,比如Java 代码中的.pom文件),而不是针对每一个代码文件进行分析,其工作原理如下:

软件A 
--> 找出A中的依赖关系列表文件 
--> 读取依赖关系列表内容(B,C,D) 
--> 得出软件A中引用的开源软件(B,C,D)

不同的检测工具在实现时也有所差别,有的工具不仅能分析出A 中列出的直接依赖的开源组件,还会对依赖的外部开源组件进行递归分析,得出类似于下面这样的结果:

软件A,依赖:
-> 软件B,软件B又依赖:
	--> 软件E
	--> 软件F
-> 软件C,软件C又依赖:
	--> 软件G
-> 软件D

代码依赖关系分析技术的效果主要取决于:

  • 对代码中引用外部组件方式的识别能力
    各种语言代码对外部组件的引用方式是不同的,工具要支持对更多种类语言的代码进行识别和分析。
  • 递归分析的能力
    只分析出软件中直接依赖的外部开源组件往往是不够的,需要对这些外部开源组件进行递归依赖分析,最终找出软件中引用的全部外部开源组件。
  • 对代码伪装的甄别能力
    代码依赖关系表是易于伪造的,在有些应用场景下(比如检测机构对送检的软件产品进行评测),如何去伪存真是一个难题。

两种技术的对比

上述的这两种技术各有利弊,需要根据您的具体需求和应用环境来选择。这两种技术各自的特点对比如下:

  • 代码特征分析比对技术

    优势:
    1、分析的准确性高
    2、能发现直接引用的开源代码片段
    3、不容易被欺骗
    
    不足:
    1、分析速度相对较慢
    2、经常会比对出多个结果,结果的筛选和确认有一定难度
    
  • 代码依赖关系分析技术

    优势:
    1、分析速度快
    2、分析结果唯一,不用筛选和确认
    
    不足:
    1、无法识别直接引用的代码片段
    2、容易被欺骗
    

以上对这两种技术的对比分析,是基于这两种技术本身的特点来说的,分析的是这两种技术本身的差异,而非使用这些技术的开源代码扫描检测工具之间的差异。使用不同技术的开源代码检测工具之间,因其在技术水平、开源软件数据库质量等方面存在差异,其检测能力也存在差异,不能简单的说使用某种技术的工具就一定优于使用另一种技术的工具;即使是使用相同技术的两种检测工具之间,其检测能力通常也有不小的差别。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值