OWASP 发布十大开源软件风险清单(详解版)

近日,OWASP发文称,尽管软件供应链对开源软件 (OSS) 的依赖程度很高,但业内缺乏一致的用于了解和衡量OSS风险的方法。OSS 风险管理始于许可管理,之后延伸至CVE,但我们仍然缺乏与安全、法律和运营相关的全面的OSS风险管理方式。本文档旨在创建这种全面的OSS风险管理方式。

在过去十年来对OSS的依赖历史中,以CVE编号为载体的已知漏洞成为衡量安全性的关键指标。虽然已知漏洞是一项重要的指标,但它们通常捕获的是由意图良好的开发人员犯的错误。这些错误可被攻击者利用且应当予以修复,但它们几乎无法涵盖依赖OSS所引发的全部风险。运营风险如由过时或未维护软件引发的风险,或者下一代供应链风险如由名称混淆攻击引发的风险,无法由CVE体现。而这些风险同样影响重大。

本清单由20多位首席信息安全官们和首席技术官们评审和贡献,旨在找到开发团队应当做好准备迎接的最严重的运营和安全风险。

这十大OSS风险如下,本文将翻译各风险的含义、示例和应对措施部分,供大家参考。

一 已知漏洞

1、 含义

组件版本中可能包含由开发人员不慎引入的易受攻击的代码。漏洞详情被公开披露,如通过CVE、GitHub 安全公告或其它不太正式的通信渠道公开。利用和布丁可能存在或不存在。此类漏洞在下游软件情境中可能是可利用的,可能导致相关系统或数据的机密性、完整性或可用性遭攻陷,进而允许在目标环境中横向移动或带来其它负面影响。

2、 示例

(1)CVE-2017-5638,位于 Apache Struts 中,触发 Equifax 数据泄露事件。

(2)CVE-2021-44228,位于Apache Log4j中,也被称为 “Log4Shell”。

3、 应对措施

(1)监控应用程序、容器和系统中是否存在含有已知漏洞的(直接和可传递)开源依赖;

(2)基于如下等条件,优先安排分析和缓解:

  • 评分和度量,如CVSS和EPSS

  • 威胁情报如利用代码的可用性和成熟性,或者在野攻击信息如由CISA必修清单提供的信息;

  • DAST和SAST工具,判断易受攻击的代码能否在依赖软件上下文中执行。

二 合法包遭攻陷

1、 含义

攻击者可能攻陷作为现有合法项目或分发基础设施组成部分的资源,在组件中注入恶意代码,如通过劫持合法项目维护人员的账户或利用包仓库中的漏洞实现。恶意代码可能在终端系统上,或在组织机构中负责开发和/或运营依赖软件(如构建系统或开发者工作站)的系统上执行。系统的机密性、一致性和可用性以及处理/存储在系统中的数据面临风险。

2、示例

(1)    Event-stream:对合法组件的攻击,目标是Copay 比特币钱包用户。

(2)    SolarWinds 攻击

3、 应对措施

检测和防御受陷包需要多力协作。组织机构应当通过现有标准和框架如《供应链安全消费框架 (Secure Supply Chain Consumption Framework, S2C2F)》获悉可能的保护措施,且应当基于具体的安全要求和风险偏好进行选择和优先级排序。

相关措施如下:

(1)根据SLSA验证组件来源;

(2)从来源(你自己或可信第三方)构建组件;

(3)手动和/或自动审计代码;

(4)检索来自安全内部商店中的所有组件(如二进制仓库托管自有二进制和镜像外部组件)

三 名称混淆攻击

1、含义

攻击者创建的组件名称与合法开源或系统组件的名称类似 (typo-squatting),或者给人印象是可信的作者(品牌劫持),或在不同的语言或生态系统中使用常见的命名模式 (combo-squatting)。恶意代码可能在终端系统上,或在组织机构中负责开发和/或运营依赖软件(如构建系统或开发者工作站)的系统上执行。系统的机密性、一致性和可用性以及处理/存储在系统中的数据面临风险。

2、示例

Colourama(PyPI,2018):对合法Python 包 “colorama” 的typo-squatting 攻击,将比特币转账重定向至受攻击者控制的钱包。

3、应对措施

在安装/使用组件前:

(1)检查代码特征(安装前/后的钩子、编码的payload等)和项目特征(源代码仓库、维护人员账户、发布频率、下游用户的数量等)中是否存在风险指标线索。需要注意的是,某些元数据并未获得包仓库的验证,因此可被攻击者轻易伪造。

(2) 验证组件的签名源自可信方(适用于支持/要求签名的生态系统)。

四 未维护的软件

1、含义

组件或组件版本可能不再得到活跃开发或支持,如不再开发针对新功能或安全漏洞的补丁。因此,补丁可能由经验和知识更少的下游开发人员开发,从而导致投入加大、修复时间更长。在此期间,系统和功能访问可能受限制,以避免持续被暴露的风险。

2、 示例

(1)core-js (npm, 2020)

(2)Gorilla Web Toolkit (Go, 2022)

(3)minimist (npm, 2022)

3、 应对措施

(1)检查项目活跃度和健康度指标

不过需要注意的是,活跃度较低也可能是成熟的表现。特性完整和成熟的项目要比正在开发的项目的活跃度低,不过在出现问题时仍然可获得及时的补丁。

指标如下:

  • 最近的issue和commit活动说明项目是活跃的。

  • 外部贡献者打开issue的高比率说明该项目是活跃的。

  • 企业相关账户的活动表明该项目可获得稳定可靠的支持。

  • 声誉良好的账户的活动表明该仓库维护良好。

  • 仓库有最新发布,说明对维护和支持代码库的贡献。

(2)查找项目维护或支持的战略信息,如是否存在长期支持版本及其日期。如 Spring 项目就是记录支持时间轴的绝佳例子。

(3)查看项目页面是否被归档,或者是否存在关于该项目维护状态的明确声明。

五 过时的软件

1、含义

项目可能使用老旧、过时的组件版本(尽管更新版本已经存在)。使用距离最新依赖发布太远的版本,可能导致在紧急情况(如所使用的版本中漏洞的披露)下难以做到及时更新。老旧发布可能也不会收到与最近版本同等程度的安全评估,尤其是对于是否受漏洞影响的评估。如果新版本与当前所用版本在句法或语义上不兼容,那么应用程序的开发人员可能要通过重大更新/迁移来解决这一不兼容问题。

2、示例

(1) Spring Boot 支持时间轴

(2) 影响Apache Tomcat的漏洞“未被检查是否影响分支8.0.x,且不会被修复”。

3、应对措施

(1)使依赖更新成为常规的积压项目进行处理;

(2)自动化发现和推荐更新,如通过合并/拉取请求进行;

(3)通过变更影响分析工具来检测引入变更或重大变更的情况。

六 未被追踪的依赖

1、含义

项目开发人员可能根本没有发现组件中的依赖,原因可能是该依赖并非上游组件SBOM的组成部分、SCA工具未运行或未检测到、或者依赖并非通过包管理器设立。因此,相关组件无法被检查或监控是否存在其它缺陷。

2、示例

(1)上游软件收到或SCA工具生成不完整的SBOM。

(2)在管理(追踪)依赖中包括第三方代码,如:

  • 代码片段

  • 源代码文件(按原状复制到依赖的源中,也被称作“按厂商的”)

  • 编译代码(例如适用于平台的二进制或Java 归档/class文件,也称作“重新绑定”)

(3)依赖未通过保管理器的表示文件如 PIP 或 Maven 创建,如手动安装或通过brew 或 apt-get 脚本安装。

(4)IDE插件、构建脚本、测试依赖或其它开发者工具,尽管未包含在依赖软件本身,但仍然带来安全和运营风险。

3、应对措施

在粗颗粒度(如在包管理工具如 Maven 或 npm 等帮助下声明的依赖)和细颗粒度(如“带外”包含的工件如单个文件,即未使用包管理器)层面,评估和对比SCA工具。

七 许可和合规风险

1、含义

组件或项目可能并不具备许可,许可与下游客户的预期使用不兼容,或下游用户无法满足许可要求。组件可能还违反了独立于下游使用的许可条款,如许可协议为GPL但包含的文件受原始的BSD许可证约束。组件也可与法律法规要求冲突,如与FedRAMP认证或出口管控相关的要求。按照许可条款合规使用组件非常重要。缺少许可或不合规应用可能侵犯版权或许可条款,而版权方有权提起诉讼。违反法律法规要求能够限制或损害某些垂直行业或市场。

2、示例

Free Software Foundation 诉讼思科公司未经许可分发版权软件(2008)

3、应对措施

(1) 为正在开发的软件,找到按预期使用组件所需的可接受许可。例如,应该考虑该组件如何连接、软件的部署模型(云、本地/设备)以及既定的分发计划。

(2)遵守开源许可中所提到的要求。

(3)避免使用没有许可的组件。

(4)审计组件文件中是否存在多个和/或不兼容的许可。

八 不成熟的软件

1、含义

开源项目可能未应用开发最佳实践,如未使用标准的版本控制计划、不具备回归测试套件、没有开发或审计指南或文档。因此,组件可能无法可靠地或安全地运作(安全弱点导致可利用的漏洞层面)。对不成熟组件或项目的依赖带来运营风险。依赖软件可能无法按预期运作,因此导致运行时可靠性问题,或者对于依赖软件开发组织机构而言,它的使用过于复杂和昂贵。例如,组件或项目可能缺乏文档,可能无法按照已有版本控制计划合规使用(可能在组件更新过程中导致突发变更),或者不具备测试套件来发现通过拉取/合并请求引入的回归。这类情况增加了依赖于这些组件的开发投入。

2、示例

无。

3、应对措施

(1) 检查质量指标以及项目是否遵循开发最佳实践。

指标包括:

  • 项目包括测试代码。

  • 展示代码覆盖率徽章意味着该仓库在开发流程中使用了代码覆盖率工具。

  • 该仓库中包含文档,使其更容易理解和使用。

  • 该仓库使用CI和提交,通过CI检查,说明代码质量良好。

  • 当仓库中包含二进制文件时,更难以分析和评估其功能和风险。

(2) 检查项目成熟度的代理可能也是下游依赖的数量。

九 未经批准的变更(组件可变)

1、含义

组件可能会在开发人员无法注意到、审计或批准此类变更的情况下进行变更,原因可能是下载链接指向无版本编号的资源,有版本编号的资源已被修改或篡改,或数据传输不安全等。使用在不同时间点下载的无法保证版本一致的组件是一种安全风险。如针对Codecov Bash Uploader 的攻击,说明了在未事先检查其完整性的情况下,将所下载脚本直接pip到bash 中的风险。可变组件也威胁软件构建的稳定性和可复现性。

2、示例

(1)在CI/CD管道中应用无版本编号的 shell 脚本;

  • 如Codecov bash uploader事件 (2021)

(2)在没有commit 标识符的情况下引用 Git 仓库;

(3)包注册表的HTTP链接不安全。

  • CVE-2021-26291:位于Apache Maven中(2022)

3、应变措施

(1)使用提供保证的资源标识符(或者至少某种程度的保障),总是指向同一个、无法变更的工件。

(2)组件下载后以及安装/使用前,验证数字或签名;

(3)使用安全协议进行连接/分发,避免中间人攻击。

十  过小/过大的依赖

1、含义

组件可能提供非常少(如 npm 微包)或者很多(仅使用了少部分)的功能。非常小的组件(如仅包括几行代码的组件)和规模更大的组件(如账户接管、恶意拉取请求或CI/CD漏洞)引发的供应链风险一样大,而使用这些组件的目的是为了获得相对小的功能。换句话说,为了使用区区几行代码,客户的安全就取决于上游项目的安全和开发态势。非常庞大的组件已经累积了很多但在标准用例中并务必要的特性,然而但却构成了该组件的攻击面。另外,此类未使用的特性可能会引入更多的、未使用的依赖(膨胀依赖)。

2、示例

(1)   Apache Log4j

包含从远程服务器下载和执行任意Java类的功能,最终导致Log4Shell。

(2)   Left-pad (npm, 2016)

该模块通过11行代码填充字符串。从npm中删除它破坏了无数下游客户的构建。

3、应对措施

(1)发现未使用的组件能力,尤其是如果他们使用了关键的(安全敏感)API,以此构建网络连接。评估禁用未使用能力的可能性,或者使用能力更少、规模更小的开源组件。

(2)发现微型包,并考虑在内部重新开发它们的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ELK,ELFK日志收集分析系统

ELK简介 ELK是一套完整的日志集中处理解决方案,将ElasticSearch,Logstash和Kibana三个开源工具配合使用,实现用户对日志的查询、排序、统计需求。 ELK工作原理 在所有需要收集日志的服务器上部署Logstash,或者先将日志进行集中…

Python 判断一个数是否为素数

在Python中&#xff0c;判断一个数是否为素数可以通过多种方法实现。以下是一种简单的方法&#xff0c;它通过检查给定数是否有除了1和它本身之外的因数来确定它是否是素数&#xff1a; def is_prime(number):if number < 1:return False # 0和1不是素数if number < 3:…

c# .net 香橙派 Orangepi GPIO高低电平、上升沿触发\下降沿触发 监听回调方法

c# .net 香橙派GPIO高低电平、上升沿触发\下降沿触发 监听回调方法 通过gpio readall 查看 gpio编码 这里用orangepi zero3 ,gpio= 70为例 当gpio 70 输入高电平时,触发回调 c# .net 代码 方法1: Nuget 包 System.Device.Gpio ,微软官方库对香橙派支持越来越好了,用得…

SpringBoot多数据源(二)

SpringBoot多数据源AbstractRoutingDataSource&#xff08;二&#xff09; 1.多数据源配置2.多数据源调用流程3.实现 1.多数据源配置 spring-jdbc模块提供AbstractRoutingDataSource,其内部可以包含了多个DataSource&#xff0c; 然后在运行时来动态的访问数据库 2.多数据源…

vue 组件间通信方式

目录 1、props传递数据&#xff08;父 → 子&#xff09; 2、v-model&#xff08;双向绑定&#xff09; 3、.sync&#xff08;双向绑定&#xff09; 4、ref&#xff08;使用 ref 属性获取子组件的实例或 DOM 元素&#xff09; 5、$emit / v-on&#xff08;子组件向父组件发…

【Python系列】查看虚拟环境信息和包大小

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java基于SpringBoot+Vue的蜗牛兼职网系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

CSS-布局

display display 属性是用于控制 布局 的最重要的 CSS 属性。display 属性规定是否/如何显示元素。 每个 HTML 元素都有一个默认的 display 值&#xff0c;具体取决于它的元素类型。大多数元素的默认 display 值为 block 或 inline。 block block&#xff1a;块级元素。块级…

越来越多服务区安装智慧公厕是什么原因

随着社会的不断发展&#xff0c;人们对生活质量的要求也越来越高。在这种背景下&#xff0c;越来越多的服务区开始安装智慧公厕&#xff0c;以满足人们在出行过程中的生活需求。那么&#xff0c;为什么越来越多的服务区选择安装智慧公厕呢&#xff1f;这其中究竟有哪些原因呢&a…

你信不信,五分钟快速学习Nginx

Nginx是什么&#xff1f; Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的&#xff0c;最初是为了解决俄罗斯大型的门户网站的高流量问题。 说到反向代理&#xff0c;那么有没有正向代理呢&#xff1f; 正向代理&#xff1a;客户端非常明确要…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100)

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 向右轮转将使尾部k个元素顶到头部 将整个数组反转&#xff0c;再分别反转前k个元素和剩下的元素即可 class Solution { public:void rotate(vector<int>& nums, int k) {k % nums.size();reverse(nums.begi…

MOM系统框架及其主要功能

MOM系统&#xff08;Message-Oriented Middleware&#xff09;是一种基于消息传递的中间件系统&#xff0c;用于在分布式系统中实现异步通信和消息传递。MOM系统架构是指MOM系统的组成部分和它们之间的关系&#xff0c;下面我们将对MOM系统架构进行全面解析。 MOM系统的架构通…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和 . 分别代表…

【2024】使用Rancher管理k8s集群和创建k8s集群

Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…

C#:闰年判断

任务描述 编写程序&#xff0c;完成如下功能&#xff1a;从键盘输入任意年份year&#xff0c;判别该年份是否闰年。 为避免出现格式错误&#xff0c;请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 ####输入 从键盘任意输入一个年份 输出 根据是否闰年进行输出…

JavaScript eval() 函数

定义和用法 eval() 函数计算 JavaScript 字符串&#xff0c;并把它作为脚本代码来执行。 如果参数是一个表达式&#xff0c;eval() 函数将执行表达式。如果参数是Javascript语句&#xff0c;eval()将执行 Javascript 语句。 语法 eval(string) 实例 执行JavaScript代码或…

部署wordpress

查看别名type ll ll 是 ls -l --colorauto 的别名 设置别名alias alias ymyum install -y 使用别名ym nginx 取消别名unalias ym 基于LNMP做一个wordpress nginx mysql 5.7 PHP 7.4 1、linux基本环境 修改主机名 hostnamectl set-hostname $name 关闭防火墙及selinux …