摘要:本文探讨的是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功能对比

可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务

点击关注,第一时间了解华为云新鲜技术~

漏洞检测方法如何选?详解源代码与二进制SCA检测原理的更多相关文章

  1. 物体检测方法(1) - YOLO 详解

    最近遇到一些卡证识别的检测问题,打算先把理论知识梳理一下,随后还会梳理一版代码注释. 以前的region+proposal来检测的框架,这一系列速度和精度不断提高,但是还是无法达到实时.存在的主要问题 ...

  2. cloudemanager安装时出现failed to receive heartbeat from agent问题解决方法(图文详解)

    不多说,直接上干货! 安装cdh5到最后报如下错误: 安装失败,无法接受agent发出的检测信号. 确保主机名称正确 确保端口7182可在cloudera manager server上访问(检查防火 ...

  3. Kubernetes服务pod的健康检测liveness和readiness详解

    Kubernetes服务pod的健康检测liveness和readiness详解 接下来给大家讲解下在K8S上,我们如果对我们的业务服务进行健康检测. Health Check.restartPoli ...

  4. .NET Excel导出方法及其常见问题详解

    摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...

  5. cloudemanager安装时出现8475 MainThread agent ERROR Heartbeating to 192.168.30.1:7182 failed问题解决方法(图文详解)

    不多说,直接上干货!   问题详情 解决这个问题简单的,是因为有进程占用了.比如 # ps aux | grep super root ? Ss : : /opt/cm-/lib64/cmf/agen ...

  6. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  7. C#类、对象、方法和属性详解

    C#类.对象.方法和属性详解 一.相关概念: 1.对象:现实世界中的实体(世间万物皆对象) 2.类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装 继承 多态 4.对象的三要素:属性 ...

  8. 第三十五节,目标检测之YOLO算法详解

    Redmon, J., Divvala, S., Girshick, R., Farhadi, A.: You only look once: Unified, real-time object de ...

  9. PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明

    PHP函数篇详解十进制.二进制.八进制和十六进制转换函数说明 作者: 字体:[增加 减小] 类型:转载   中文字符编码研究系列第一期,PHP函数篇详解十进制.二进制.八进制和十六进制互相转换函数说明 ...

随机推荐

  1. 《基于SD-SEIR模型的实验室人员不安全行为传播研究》

    My Focus:基于SD-SEIR模型的实验室人员不安全行为的传播; 建模与实验仿真 Title: Study on Porpagation of Unsafe Bhavior of Laborat ...

  2. SpringBoot:Spring容器的启动过程

    一.简述 Spring的启动过程就是IoC容器的启动过程,本质上就是创建和初始化Bean的工厂(BeanFactory),BeanFactory是整个SpringIoC的核心,Spring使用Bean ...

  3. linux中的strip命令简介

    转载:https://blog.csdn.net/qq_37858386/article/details/78559490 strip:去除,剥去     一.下面是man strip获得到的信息,简 ...

  4. 在c中使用正则表达式

    今天学习编译原理的时候,用c写一个简易的文法识别器实验遇到了一个问题:要用正则表达式去识别正则文法里面的A->ω,A->Bω, 其中ω属于T的正闭包,也就是说我们对正则文法的产生式进行抽象 ...

  5. 【高并发】深入解析Callable接口

    大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...

  6. TDSQL | 在整个技术解决方案中HTAP对应的混合交易以及分析系统应该如何实现?

    从主交易到传输,到插件式解决方案,每个厂商对HTAP的理解和实验方式都有自己的独到解法,在未来整个数据解决方案当中都会往HTAP中去牵引.那么在整个技术解决方案中HTAP对应的混合交易以及分析系统应该 ...

  7. 地表最强IDE ——Visual Studio 2022正式发布

    地表最强IDE--Visual Studio 2022昨天正式发布啦! 堪称宇宙第一IDE工具集的Visual Studio,在经过不断更新优化之后,新版本就要与大家见面了.本次新版本发布,有许多令人 ...

  8. SQL告警,执行时间长?教你写一手好 SQL !

    博主(编码砖家)负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟.导出日志后分析,主要原因竟然是没有命中索引和没有分页处理 . 其实这是非常低级的错误, ...

  9. go的变量、常量以及判断变量的数据类型

    1.定义变量 p.p1 { margin: 0; font: 12px "Helvetica Neue"; color: rgba(69, 69, 69, 1) } span.s1 ...

  10. centos7.2安装nginx

    1 安装相关编译环境 yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-level yum openssl o ...