「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展与软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

1. SCA的发展背景及趋势

随着软件开发的复杂性不断增加,软件项目中使用的第三方组件和开源软件数量也大幅增加。然而,这些第三方组件往往存在潜在的安全漏洞和法律风险,因此对软件成分进行全面分析变得至关重要。SCA技术因此应运而生,成为软件开发生命周期中必不可少的一环。

Synopsys发布2024年开源安全和风险分析报告OSSRA中指出,有96%代码仓库包含开源代码,84%代码库包含至少一个已知开源漏洞,其中74%包含高风险漏洞。关于Synopsys 2024年发布的更详细的开源风险洞察报告可以点此下载(访问密码:6277)。

在这里插入图片描述

当前,越来越多的企业和开发团队开始重视软件成分分析,将其纳入到软件开发过程中,并寻求自动化和智能化的解决方案。SCA技术的趋势包括但不限于:

  • 更加精细化的组件识别和关系分析
  • 持续集成和持续部署(CI/CD)中的集成
  • 与软件漏洞数据库的整合

2. SCA技术原理

SCA技术的核心原理包括对软件源代码或二进制文件进行扫描,识别其中使用的第三方组件、库和框架,分析其版本、许可证、漏洞等信息,并生成报告以供开发人员参考。常见的分析方法包括静态分析、动态分析。

  • 静态分析通过检查软件源代码或二进制文件的组件依赖关系来进行分析,可以在早期发现潜在的问题。
  • 动态分析则是在软件运行时检查其实际行为,以获取更加全面的信息。

根据分析对象划分为两种SCA技术:源码SCA、二进制SCA。接下来具体介绍两种SCA技术的原理和优缺点。

2.1. 源码SCA

源码SCA分析的是软件的源代码,它通常需要访问项目的源代码仓库,对代码中的依赖关系进行分析。主要适用于开源项目、有完整源代码维护的项目,以及需要深入理解代码依赖关系的场景。

由于直接分析源代码,所以它可以更准确地识别出软件中使用的第三方库和它们的版本。具体来说,主要有以下三类分析方法:

  • 基于包管理器配置文件的分析:针对具有备包管理机制的语言,比如Java、Go、Python,可以通过解析开源软件包管理文件(如Java的POM.xml,Go语言的go.mod,Python的requirements.txt)来实现开源软件的关联分析,这种方法可以几乎可以100%准确的分析出引用的开源软件名称及依赖组件名称。
  • 基于文本相似度的分析:亦可称为源码文件级匹配,即根据源代码文件的相似度来判断待分析的源码文件属于什么组件和版本,文件相似度可以基于hash的严格匹配方法,也可以根据文本相似度匹配方法。
  • 基于语义的相似度分析:亦可称为源码片断匹配,即源代码依次通过词法分析、Token提取、语法分析、AST抽象语法树、语义分析过程来提取相应的关键特征,进一步融合机器学习、NLP、控制流图CFG、数据流图DFG等匹配算法进行代码相似度的检测。

源码SCA需要有可访问的源代码,因此对于没有源代码的二进制文件或封闭源代码的软件,这种方法不适用。

2.2. 二进制SCA

二进制SCA分析的是软件的二进制可执行文件或库文件,由于不需要访问源代码,二进制SCA可能无法像源码SCA那样精确地识别依赖关系,因为它依赖于二进制文件中的符号和字符串提取。具体分析过程通常涉及提取二进制文件中的函数名、常量字符串等信息(这些信息受CPU架构、编译选项的影响很少,几乎保持不变),然后与已知组件特征数据库进行比对即可识别二进制的成分。另,结合二进制代码的调用图CFG、数据流图DFG等信息可进行更加精准的检测,但由于这些分析涉及到二进制文件反汇编,分析时间非常长(50M大小的文件一般要2H左右),效率低,因此不适合对大量二进制文件进行扫描。

二进制SCA不需要源代码,适用于任何二进制文件,包括商业软件和封闭源代码的软件。

2.3. 源码SCA与二进制SCA的区别

不管是源代码文件的SCA检测还是二进制文件的SCA检测,他们是一种互补的关系,各有各的优缺点,比如二进制文件的SCA检测能发现构建过程中工具链引入的安全问题,而源代码的SCA则不能,SolarWinds事件就很好的说明了这一点。其他具体对比项可参见下表:

对比项源代码SCA二进制SCA
分析对象源代码二进制文件
分析阶段开发阶段测试阶段
适用场景适合需要精确识别依赖关系和进行深入代码审计的场景适用于需要分析二进制文件,或者源代码不可用的场景
准确率中,检测准确率依赖于二进制中调用了多少开源软件的功能
检测绕过存在,源码在构建环境中引入或链接静态库引入的开源软件会绕过源代码SCA检测不存在
依赖组件检测能力弱,尤其是没有包管理机制的语言,很难检测到依赖组件强,二进制中包含所有引入的开源软件功能特征信息
人工确认分析难度低,源代码人工对比分析容易高,二进制人工很大对比分析,需要借助反汇编等多种工具,确认门槛高

3. 当前主流SCA工具

目前市面上有许多优秀的SCA工具,其中一些主流工具包括:

  • Black Duck: Black Duck 是一款知名的软件成分分析工具,当前已经被Synopsys(新思科技)收购,Black Duck一般被同行称为"黑鸭子"(直译),提供全面的开源软件扫描和漏洞检测服务,可同时支持源码及二进制SCA,是SCA界的Top1工具。它可以帮助用户识别软件项目中使用的第三方组件、版本信息,并检测这些组件是否存在已知的漏洞。Black Duck 还提供了丰富的报告和分析功能,帮助用户管理和降低软件安全风险。
  • Snyk: Snyk 是一款专注于开源组件安全的软件成分分析工具。它可以帮助用户发现项目中的漏洞、安全威胁和依赖关系问题,并提供实时的漏洞修复建议。Snyk 还提供了与开发工具集成的功能,方便开发团队在开发过程中及时解决安全问题。
  • WhiteSource: 已经于2023年改名为Mend,它是一款综合的软件成分分析工具,旨在帮助用户管理开源组件的合规性和安全性。它可以自动识别项目中使用的开源组件、版本信息,并提供实时的漏洞警报和修复建议。WhiteSource 还提供了与 CI/CD 工具集成的功能,支持持续集成和持续交付流程。
  • Nexus Lifecycle: Nexus Lifecycle 是 Sonatype 公司推出的一款软件成分分析工具,主要用于管理开源组件的安全和合规性。它可以帮助用户发现项目中的漏洞、许可证冲突等问题,并提供自动化的修复建议。Nexus Lifecycle 还提供了与开发工具集成的功能,支持开发团队在早期发现和解决安全问题。
  • Dependency-Check: Dependency-Check 是一款OWASP维护的开源软件成分分析工具,用于检测项目中使用的第三方组件是否存在已知的漏洞。它支持多种项目构建工具和编程语言,可以快速扫描项目的依赖关系,并生成漏洞报告。Dependency-Check 提供了易于集成和使用的功能,适合中小型团队和个人开发者使用。
  • 七彩棱镜FossEye:FossEye基于“左移安全”、DevSecOps及实时监控的安全理念,在软件生命周期中对开源软件和依赖组件进行持续、自动化的识别、安全分析、持续集成管理。FossEye的目标是能够适应敏捷开发,帮助企业解决因对开源软件维护、管理不善而产生的问题。

这些工具通过自动化的方式帮助开发人员进行软件成分分析,提高了软件开发过程中对第三方组件的管理效率和安全性。

4. 参考

[1] Synopsys发布2024年开源安全和风险分析报告OSSRA
[1] 源代码与二进制文件SCA检测原理
[2] 二进制SCA检测工具—技术短板及应对措施
[3] 基于源码的二进制SCA特征生成技术
[4] 漫谈软件成分分析(SCA)安全测试技术


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558894.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

递归、搜索与回溯算法:回溯,决策树

回溯算法是⼀种经典的递归算法,通常⽤于解决组合问题、排列问题和搜索问题等。 回溯算法的基本思想:从⼀个初始状态开始,按照⼀定的规则向前搜索,当搜索到某个状态⽆法前进时,回退到前⼀个状态,再按照其他…

【计算机组成原理】运算方法和运算器

数据与文字的表示方法 1. 数据格式1.1 定点数表示方法1.1.1 定点小数1.1.2 定点整数 1.2 浮点数表示方法1.2.1 浮点数表示1.2.2 浮点数的规格化1.2.2.1 尾数为原码表示的规格化1.2.2.2 尾数为补码表示的规格化 1.2.3 IEEE754标准⭐ 1.3 十进制数串的表示方法1.3.1 字符串形式1.…

网盘——私聊

在私聊这个功能实现中,具体步骤如下: 1、实现步骤: A、客户端A发送私聊信息请求(发送的信息包括双方的用户名,聊天信息) B、如果双方在线则直接转发给B,不在线则回复私聊失败,对方…

ProgressFlowmon的confluence接口存在任意命令执行漏洞(CVE-2024-2389)

声明: 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 简介 ProgressFlowmon是一整套用于网络映射、应用程序性能…

客户端动态降级系统

本文字数:4576字 预计阅读时间:20分钟 01 背景 无论是iOS还是Android系统的设备,在线上运行时受硬件、网络环境、代码质量等多方面因素影响,可能会导致性能问题,这一类问题有些在开发阶段是发现不了的。如何在线上始终…

大气的免费wordpress模板

国产的wordpress模板,更适合中国人使用习惯,更符合中国老板的审美的大气wordpress企业官网建站模板。 WordPress模板,也称为主题,是用于定义WordPress网站或博客外观和功能的预设计文件集。这些模板使用HTML、CSS和PHP代码构建&a…

上传文件到HDFS

1.创建文件夹 hdfs -dfs -mkdir -p /opt/mydoc 2.查看创建的文件夹 hdfs -dfs -ls /opt 注意改文件夹是创建在hdfs中的,不是本地,查看本地/opt,并没有该文件夹。 3.上传文件 hdfs dfs -put -f file:///usr/local/testspark.txt hdfs://m…

【深度学习】Vision Transformer

一、Vision Transformer Vision Transformer (ViT)将Transformer应用在了CV领域。在学习它之前,需要了解ResNet、LayerNorm、Multi-Head Self-Attention。 ViT的结构图如下: 如图所示,ViT主要包括Embedding、Encoder、Head三大部分。Class …

Docker in Docker的原理与实战

Docker in Docker(简称DinD)是一种在Docker容器内部运行另一个Docker实例的技术。这种技术允许用户在一个隔离的Docker容器中创建、管理和运行其他Docker容器,从而提供了更灵活和可控的部署选项。以下是DinD的主要特点: 隔离性&am…

力扣打卡第一天

101. 对称二叉树 C: class Solution { public:bool isSymmetric(TreeNode* root) {return check(root->left,root->right);}bool check(TreeNode *p,TreeNode *q){ /**定义check方法用来检查两棵树是否是镜像的*/if (!p && !q) return true; /* 如…

基于SSM的物流快递管理系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物流快递管理系统2拥有三个角色: 管理员:用户管理、管理员管理、新闻公告管理、留言管理、取件预约管理、收件管理、货物分类管理、发件信息管理等 用户…

如何安全、高速、有效地利用IP代理爬取数据

陈老老老板🧙‍♂️ 👮‍♂️本文专栏:生活(主要讲一下自己生活相关的内容)生活就像海洋,只有意志坚强的人,才能到达彼岸。 🤴本文简述:如何安全、高速、有效地利用IP代理爬取数据 &#x1f473…

【数据结构-串-数组-广义表】

目录 1 串-理解1.1 串的抽象定义:-理解1.2 串的存储结构-不断掌握1.2.1 顺序存储结构:1.2.2 链式存储结构: 1.3 串的模式匹配算法:-掌握1.3.1 BF暴力求解算法-代码 -掌握1.3.2 KMP求解算法-代码--掌握 2 数组-不断掌握2.1 顺序存储…

WWW ‘24 | EarnMore: 如何利用强化学习来处理可定制股票池中的投资组合管理问题

WWW 24 | EarnMore: 如何利用强化学习来处理可定制股票池中的投资组合管理问题 原创 QuantML QuantML 2024-04-16 09:04 上海 Content 本文主要探讨了如何利用强化学习(Reinforcement Learning, RL)来处理可定制股票池(Customizable Stock …

Golang | Leetcode Golang题解之第40题组合总和II

题目: 题解: func combinationSum2(candidates []int, target int) (ans [][]int) {sort.Ints(candidates)var freq [][2]intfor _, num : range candidates {if freq nil || num ! freq[len(freq)-1][0] {freq append(freq, [2]int{num, 1})} else {…

LabVIEW卡尔曼滤波技术

LabVIEW卡尔曼滤波技术 在现代航空导航中,高精度和快速响应的方位解算对于航空安全至关重要。通过LabVIEW平台实现一种卡尔曼滤波方位解算修正技术,以改善传统导航设备在方位解算中的噪声干扰问题,从而提高其解算精度和效率。通过LabVIEW的强…

Ubuntu上阅读Android源码工具

由于Android源码过于庞杂,里面有多种语言源文件,想只用一IDE统一索引是不现实的。我个人便使用AS阅读JAVA代码,VS看C/C代码,在Ubuntu上不能使用SI,所以直接放弃。在framework开发这个层面上来讲,因为大部分…

Ansible组件说明

1.Ansible Inventory 工作当中有不同的业务主机,我们需要在把这些机器信息存放在inventory里面,ansible默认的inventory的文件是/etc/ansible/hosts,也可以通过ANSIBLE_HOSTS环境变量来指定或者运行ansible和ansible-playbook的时候用-i参数临…

数据可视化(五):Pandas高级统计——函数映射、数据结构、分组聚合等问题解决,能否成为你的工作备用锦囊?

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

js中let和var的区别

在JavaScript中,var、let和const都用于声明变量,但它们之间存在一些重要的区别。特别是let和var之间的区别,我们可以概括为以下几点: 作用域(Scope):var有函数作用域或全局作用域,而…
最新文章