漏洞检测方法如何选?详解源代码与二进制 SCA 检测原理
摘要:本文探讨的是 SCA 具体的检测原理,源代码 SCA 检测和二进制 SCA 检测有哪些相同点和不同点,在进行安全审计、漏洞检测上各自又有什么样的优势和适用场景。
本文分享自华为云社区《源代码与二进制文件SCA检测原理》,作者:安全技术猿。
1、源代码与二进制的关系和特点
SCA(Software Composition Analysis)软件成分分析,通俗的理解就是通过分析软件包含的一些信息和特征来实现对该软件的识别、管理、追踪的技术。SCA 具体的检测原理又是如何实现的,源代码和二进制文件的 SCA 检测又有哪些相同点和不同点,下面内容就来回答一下上述疑问。
对应编译类型的语言(C/C++/Go/Rust),都是遵循:源代码—>编译—>链接—>二进制文件的过程。影响二进制文件的因素包括不同的 CPU 架构(ARM、X86、PPC、MIPS…),不同的操作系统(Wndows、Linux、iOS、Android…),不同的编译优化选项(O0~O3),即使是同一套源代码,最终编译生成的二进制文件之间也是差别非常大的。注:上述影响因素不涉及 java 语言
从上面可知源代码和二进制文件之间存在巨大的差别,源代码是基于高阶语言来编写,是给人看的,人看了很方便理解其中语句的语义;而二进制是由流(指令流或字节流)来构成的,是给计算机“看”的,对人来说是非常不友好,不好理解。
源代码包含了变量符号类型、函数名称、类名称、代码逻辑结构等大量丰富的代码信息,相反为保留二进制文件的紧凑性,编译生成的二进制文件中会丢弃掉很多运行时用不到的信息,只保留程序正确运行必要的信息,比如被丢弃的信息有变量类型、变量名称等符号信息,可能被保留的有类名称、函数名称等信息,一定会保留的有常量字符串数据。另外为了保证程序的正确运行,还会有保留一个相应的配置信息,比如 jar 包中的 manifest 信息、POM 信息、maven 信息、资源文件等。基于这些特点源代码 SCA 和二进制 SCA 的检测原理也存在很大的不同。
2、源代码 SCA 检测原理
由于源代码中包含有丰富的程序信息,因此源代码的 SCA 检测既有大颗粒度的检测方法,也有细颗粒度的检测方法。
2.1 大颗粒度检测方法:
根据源代码文件的相似度来判断属于什么组件和版本;文件相似度可以基于 hash 的严格匹配方法,也可以根据文本相似度匹配方法;这种匹配方法的优点是效率高,匹配速度极快,确定是也很明显,基于 hash 的容易漏报,基于文本相似度的准确率低;
2.2 细颗粒度检测方法:
经过源代码—>词法分析—>Token 提取—>语法分析—>AST 抽象语法树—>语义分析过程来提取相应的数据,再通过机器学习、NLP、CFG 调用图、DFG 数据流图等等匹配算法进行代码相似度的检测,这种基于语义的代码相似度检测与基于文本相似度检测相比准确率高;
2.3 具备包管理机制的语言:
比如 Java、Go,可以通过引用的开源软件包信息来实现开源软件的关联分析,这种方法可以几乎可以 100%准确的分析出引用的开源软件名称。
3、二进制 SCA 检测原理
虽然好多源代码中具有的信息在二进制文件中不存在,但是对于常量字符串、部分类名称、函数名称、以及一些配置信息还是存在的,并且这些信息具备一定的不变性,即受 cpu 架构、不同编译优化选项的影响很小,因此二进制 SCA 主要从二进制文件中提取这些方面的不同特征,再运用匹配算法进行相似度计算,并根据相似度门限来检测出引用的开源软件名称和版本号。
结合分析二进制代码中的 CFG 调用图、DFG 数据流图等信息进行更加精准的检测,但由于这些分析需要对二进制文件进行指令反汇编,导致分析时间非常的长,分析效率低下,因此这种 SCA 检测方法不适合对大规模二进制文件进行扫描。
4、源代码 SCA 和二进制 SCA 功能对比
可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/b5da94d0a86bc0d0623fe3be4】。文章转载请联系作者。
评论