软件供应链安全——闭源软件中的组件检测与版本检测技术
本文主要介绍软件供应链安全的检测技术的具体细节,针对闭源软件即不开放源代码的软件中的组件源代码进行检测,对于检测技术,分为组件本体识别和组件本体的版本识别两个部分,其中,组件本体识别需要用到二进制代码相似性检测和复用性关系相结合的方式,版本检测需要用到全局和局部参数特征值。
一、闭源软件中复用开源组件检测
组件复用型漏洞
定义:因复用含有漏洞的组件(第三方库、开源框架等)而引入的软件漏洞
现有检测方法:
组件复用型漏洞的检测
核心技术: 闭源二进制软件的开源组件复用检测
对于源代码与二进制代码间的复用检测受到复杂的复用关系影响,即检测复用时对简单的复用可能有用,如zlib.dll与zlib库,而对多层调用就失去了效果。
主要用到的方法如下:
因此,识别问题不仅仅时简单的代码相似性检测问题,需要识别复杂关系,因此,复用检测的工作变成了流行的代码相似性检测+复用关系识别:
现有工作准确率不高的原因:
- 没有符号信息,完全依赖于代码特征比对
- 使用的代码特征太少,很多代码无法提取到有效特征
原因:代码特征普遍受编译优化影响大,无法使用 - 没有考虑复杂复用情况,从而引入大量误报漏报
解决方案:
- 补充抗编译优化的代码特征,并为新特征设计合理的匹配算法和权重算法
- 对复用类型进行划分,针对不同类型进行针对性识别
1、代码特征选择
常用代码特征与新增代码特征评估:
2、代码特征提取
二进制代码特征提取方法:基于IDAPython提取导出函数、字符串、switch/case、if/else
结合编译信息的源代码特征提取方法:
源代码特征提取方法:基于clang和llvm开发特征提取工具
特征所对应代码片段:
3、代码相似度计算
4、复用类型划分
- 单一复用
1 bin -> 1 src
- 混合复用
1 bin -> N src
- 部分复用
N bin <- 1 src
- 嵌套复用
1 bin -> 1 src -> N src(嵌套复用是假式复用,应被去除)
二、闭源软件中复用开源组件版本检测
在检测复用组件的基础上,检测复用组件的版本,因为不同版本的影响的漏洞有限
从待检测二进制文件中提取代码特征,和预先准备好的从源代码中提取的特征进行比较,现有工作如下:
局限性:
版本敏感特征选择
选择的核心标准:不同版本之间的区分度拉满
全局特征:
区分度公式:
举例如下:
函数级别特征:
粗匹配
全局级别特征匹配方案 -> 粗匹配阶段:
特征匹配方案:精准匹配——全局级别特征在编译前后不发生变化
精匹配
函数级别特征用来定位函数,整个函数作为一个整体,所以采用基于相似度的识别方案。
具体的匹配算法:
参考文献
《软件安全原理》——霍玮
转载请说出处:from 信安科研人