从SLSA看软件供应链面临哪些威胁及对应解决方案

引言:软件制品供应链等级SLSA(Supply-chain Levels for Software Artifacts)是由由谷歌发起,基于行业共识建立的一个逐步完善供应链安全的规范。本文基于Google SLSA框架来看软件供应链安全面临的安全风险。

1. 简介

2023 年 4 月,SLSAv1.0 发布,相比 SLSA v0.1 发生了很大的变化,该版本作为 SLSA 的第一个稳定版本,代表了广泛的共识,未来将不会发生重大变化。该框架为软件生产者和消费者提供了一套可遵循的标准,生产者可以遵循 SLSA 的指导方针使他们的软件供应链更安全,而消费者可以使用 SLSA 来决定是否信任软件包,组织通过遵循 SLSA 的指导,可以更好的确保其软件供应链的安全性和可靠性。

SLSA的目标是改善行业状态,尤其是开源,以防卫最紧迫的完整性威胁。使用SLSA,用户可以对他们使用的软件的安全态势做出明智的选择。

2. 软件面临的威胁

将软件从生产者传到消费者的过程中,SLSA定义了三大类(源代码威胁、依赖威胁、构建威胁)共计8个小类的威胁。
在这里插入图片描述

2.1. 源代码威胁

源代码完整性威胁是指对手可能引入不符合软件生产者意图的源代码更改。包括授权个体引入未经授权的更改。

Note: SLSA v1.0未解决源代码威胁,预计在未来的版本中会加以解决。

2.1.1. 提交未经授权的更改

敌手在没有任何特殊管理员权限的情况下通过官方源代码管理界面引入更改。

2.1.2. 妥协源代码仓库

敌手通过管理界面或对底层基础设施的妥协,向源仓库引入更改。

2.1.3. 从修改后的源码构建

敌手基于与官方源代码版本不匹配的源代码进行构建。
应对方法是将来源与对软件包的预期进行比较,这取决于SLSA构建L1的来源。

2.1.4. 从非官方代码构建

威胁: 使用预期的CI/CD流程,但从可能包含未经授权更改的非官方代码进行构建。

缓解措施: 验证器要求来源与预期值匹配。

示例: MyPackage应该从GitHub仓库good/my-package构建。但实际上,它从evilfork/my-package构建。
解决方案: 验证器拒绝,因为来源位置不匹。

2.1.5. 使用非官方分支或标签构建

威胁:使用预期的CI/CD流程和源位置,但检出了一个“experimental”分支或类似的分支,其中可能包含不打算发布的代码。
缓解措施:验证器要求溯源的源分支/标签与预期值匹配,或者源修订版本可从预期分支访问。
示例:MyPackage的发布版本是从main分支打的标签,该分支有分支保护。攻击者从不受保护的experimental分支构建,其中包含非官方更改。
解决方案:验证器拒绝,因为源修订版本无法从main分支访问。

2.1.6. 使用非官方构建步骤构建

威胁:使用正确的CI/CD平台构建软件包,但使用非官方的构建步骤。
缓解措施:验证器要求溯源的构建配置源与预期值匹配。
示例:MyPackage应该由Google Cloud Build使用源的cloudbuild.yaml文件中定义的构建步骤进行构建。攻击者使用Google Cloud Build进行构建,但使用通过RPC提供的自定义构建步骤。
解决方案:验证器拒绝,因为构建步骤不是来自预期的源。

2.1.7. 使用非官方参数构建

威胁:使用预期的CI/CD流程、源位置和分支/标签构建,但使用注入非官方行为的参数。
缓解措施:验证器要求溯源的外部参数都与预期值匹配。
示例1:MyPackage应该从release.yml工作流构建。攻击者从debug.yml工作流构建。
解决方案:验证器拒绝,因为工作流参数与预期值不匹配。
示例2:MyPackage的GitHub Actions工作流使用github.event.inputs允许用户为每次调用指定自定义编译器标志。敌对方设置了一个编译器标志,该标志覆盖了宏以向输出二进制文件中注入恶意行为。
解决方案:验证器拒绝,因为未预期的inputs参数。

2.1.8. 从检出后修改的代码版本进行构建

威胁:从检出后包含修改的代码版本进行构建。
缓解措施:构建平台直接从源代码库中拉取,并准确记录来源位置以进行溯源。
示例:敌手从MyPackage的源代码库获取,进行本地提交,然后从该本地提交请求构建。构建者记录了它没有从官方源代码库中拉取的事实。
解决方案:验证器拒绝,因为源代码库与预期值不匹配。

2.2. 依赖威胁

敌对方通过让制品引入其所需要功能的组件的行为。为了减少此类威胁,需要检查软件的SBOM清单,避免引入不安全的组件。

2.2.1. 使用危险的构建依赖项

威胁:敌手向构建制品所需的软件中注入恶意代码。
缓解措施:不适用 - 此威胁超出了SLSA v1.0的范围。可以通过固定构建依赖项(最好使用摘要而不是版本号)来减轻此威胁。
示例:制品使用libFoo并需要其源代码进行编译。敌对方破坏了libFoo的源代码库并插入了恶意代码。当软件包构建时,它包含了敌对方的恶意代码。

2.2.2. 使用危险的运行时依赖项

威胁:敌手向运行制品所需的软件中注入恶意代码。
缓解措施:不适用 - 此威胁超出了SLSA v1.0的范围。
示例:软件包动态链接到libBar并需要二进制版本才能运行。敌对方破坏了libBar的构建过程并插入了恶意代码。当您的制品运行时,它包含了敌对方的恶意代码。

2.3. 构建威胁

构建完整性威胁是指对于敌对方在不改变源代码的情况下向制品引入行为的潜在可能性,或者从软件生产者意图之外的源、依赖和/或过程进行构建。
当消费者根据预期验证软件包,确认他们收到的软件包是以预期方式构建的时,SLSA构建跟踪可以缓解这些威胁。

2.3.1. 破坏构建过程

敌对方通过篡改构建过程向构建输出引入未经授权的更改;或者向溯源中插入虚假信息。
这些威胁可以通过SLSA构建跟踪直接解决。

2.3.1.1. 伪造来源的值(构建L2+)

威胁:伪造虚假来源并让可信的控制平面对其进行签名。
缓解措施:在构建L2+阶段,可信的控制平面生成进入溯源的所有信息,除了(可选)输出软件包哈希。在构建L3+阶段,即使是决心的敌对方也无法破坏此过程。
示例1(构建L2):溯源在构建执行机上生成,而对手控制该机器。对手使用恶意进程使构建平台声称它是从源代码库good/my-package构建的,而实际上是从evil/my-package构建的。
解决方案:构建者在可信的控制平面上生成并签名溯源;执行机报告输出软件包,但对溯源没有其他影响。
示例2(构建L3):溯源在可信的控制平面上生成,但工作机可以打破容器以访问签名材料。
解决方案:构建者加强硬化以提供针对租户项目的强大隔离。

2.3.1.2. 伪造溯源的输出摘要

威胁:租户控制的构建过程设置输出软件包摘要(SLSA溯源中的主题),而可信的控制平面未验证是否实际生成了这样的软件包。
缓解措施:无;这不是一个问题。任何声称生成给定软件包的构建都可以通过将其从输入复制到输出来实际生成它。
示例:一个合法的MyPackage软件包具有摘要abcdef,并从源代码库good/my-package构建。一个恶意构建从源代码库evil/my-package声称它构建了软件包abcdef,但实际上并没有。解决方案:验证器拒绝,因为源位置不匹配;伪造的摘要是无关紧要的。

2.3.1.3. 入侵项目所有者(构建L2+)

威胁:对手获得软件包构建项目的所有者权限。
缓解措施:构建项目所有者不能影响构建过程或溯源生成。
示例:MyPackage在Awesome Builder上构建,项目名为“mypackage”。对手是“mypackage”项目的管理员。Awesome Builder允许管理员通过SSH调试构建机器。对手利用此功能来更改正在进行的构建。

2.3.1.4. 入侵其他构建(构建L3)

威胁:执行恶意构建,以更改并行或后续环境中良性构建的行为。
缓解措施:构建之间相互隔离,彼此之间无法相互影响或保留更改。
示例1:构建平台在同一台机器上以相同的Linux用户运行MyPackage项目的所有构建。对手启动一个恶意构建,监听另一个构建并替换源文件,然后启动一个良性构建。良性构建使用恶意构建的源文件,但其溯源声称使用良性源文件。解决方案:构建平台更改架构,以在单独的虚拟机或类似环境中隔离每个构建。
示例2:构建平台在后续构建中使用同一台机器。对手首先运行一个构建,将make二进制文件替换为恶意版本,然后随后运行一个其他正常的构建。解决方案:构建者更改架构,以使用干净的机器镜像开始每个构建。

2.3.1.5. 窃取加密密钥(构建L3)

威胁:使用或窃取仅应对构建平台可用的溯源签名密钥或其他加密密钥。
缓解措施:构建与可信的构建平台控制平面相互隔离,只有控制平面可以访问加密密钥。
示例:溯源在构建工作机上签名,而对手控制该机器。对手使用恶意进程生成虚假溯源,并使用溯源签名密钥对其进行签名。解决方案:构建者在可信的控制平面上生成并签名溯源;工作机无法访问密钥。

2.3.1.6. 污染构建缓存(Build L3)

威胁:向构建缓存中添加一个恶意构件,然后被良性构建过程所使用。
缓解措施:构建缓存必须在构建之间进行隔离,以防止此类缓存污染攻击。
示例:构建平台在构建之间使用一个由源文件哈希键控的构建缓存。攻击者运行一个创建了一个“有毒”缓存条目的恶意构建,其中包含一个伪造的键,意味着该值实际上并不是从该源文件生成的。随后的构建会使用到这个有毒的缓存条目。

2.3.1.7. 入侵构建平台管理员(验证)

威胁:攻击者获得构建平台的管理员权限。
缓解措施:构建平台必须采取控制措施来防止和检测管理员的滥用行为(例如,两人审批,审计日志记录)。
示例:MyPackage在Awesome Builder上构建。Awesome Builder允许值班工程师通过SSH连接到构建机器以调试生产问题。攻击者利用此访问权限修改正在进行的构建。解决方案:消费者不接受来自构建平台的来源,除非他们相信已经采取了足够的控制措施来防止滥用管理员权限。

2.3.2. 上传修改后的软件包

攻击者上传了一个不是通过正确构建过程构建的软件包。

2.3.2.1. 使用不受信任的CI/CD进行构建

威胁:使用非官方的CI/CD流水线进行构建,不按正确的方式构建。
缓解措施:验证器要求提供证明构建者与预期值匹配的来源。
示例:MyPackage预期在受信任的Build L3上由Google Cloud Build构建。攻击者在只受信任到Build L2的SomeOtherBuildPlatform上构建,然后利用SomeOtherBuildPlatform注入恶意行为。解决方案:验证器拒绝,因为构建者与预期不符。

2.3.2.2. 上传没有来源的软件包(Build L1)

威胁:上传一个没有来源的软件包。
缓解措施:验证器在接受软件包之前要求提供来源。
示例:攻击者向软件包仓库上传了一个没有来源的恶意版本的MyPackage。解决方案:验证器拒绝,因为缺少来源。

2.3.2.3. 在CI/CD之后篡改构件(Build L1)

威胁:获取软件包的良性版本,以某种方式进行修改,然后使用原始来源重新上传。
缓解措施:验证器检查来源的主题是否与软件包的哈希值匹配。
示例:攻击者进行正确的构建,修改了构件,然后将修改后的软件包版本与来源一起上传到仓库。解决方案:验证器拒绝,因为构件的哈希值与来源中的主题不匹配。

2.3.2.4. 篡改来源(Build L2)

威胁:进行不符合预期的构建,然后修改来源以使预期检查通过。
缓解措施:验证器只接受带有有效的加密签名或等效证明的来源,证明该来源来自可接受的构建者。
示例:MyPackage预期由good/my-package仓库中的GitHub Actions构建。攻击者使用evil/my-package仓库中的GitHub Actions构建,并修改了来源,使其看起来像是来自good/my-package。解决方案:验证器拒绝,因为加密签名不再有效。

2.3.3. 入侵软件包仓库

攻击者通过管理接口或者通过对基础设施的入侵修改软件包在软件包注册表上的内容。

2.3.3.1. 取消列出软件包

威胁:软件包注册表停止提供软件包。
缓解措施:N/A - 此威胁超出了SLSA v1.0的范围。

2.3.3.2. 取消列出来源

威胁:软件包注册表停止提供来源。
缓解措施:N/A - 此威胁超出了SLSA v1.0的范围。

2.3.4. 使用被入侵的软件包

对手在软件包离开软件包注册表后修改软件包,或者欺骗用户使用意外的软件包。

2.3.4.1. Typosquatting(拼写错误域名攻击)

威胁:注册一个与热门软件包相似的软件包名称,并让用户使用您的恶意软件包而不是良性软件包。
缓解措施:大部分超出了SLSA的范围。尽管如此,要求提供源代码可作为一种轻微的威慑手段,可以帮助调查或临时分析,并可以与基于源代码的拼写错误域名解决方案相辅相成。

回顾:SolarWinds攻击涉及以上???

参考链接:

[1] https://github.com/slsa-framework/slsa

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

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

相关文章

Educational cf 160的B题

Problem - B - Codeforces 找到最小操作次数,使得子串对应位与原来字符串对应位不相同。 交换是没有代价的,但是删除有代价。 首先复制两个一模一样的串,我们把下面作为固定串,然后对串中0和1的个数进行计数,由于我…

CEC2017(Python):五种算法(SSA、RFO、OOA、PSO、GWO)求解CEC2017

一、5种算法简介 1、麻雀搜索算法SSA 2、红狐优化算法RFO 3、鱼鹰优化算法OOA 4、粒子群优化算法PSO 5、灰狼优化算法GWO 二、CEC2017简介 参考文献: [1]Awad, N. H., Ali, M. Z., Liang, J. J., Qu, B. Y., & Suganthan, P. N. (2016). “Problem defin…

(001)Unit 编译 UTF8JSON

文章目录 编译 Dll编译报错附录 编译 Dll 新建工程: 注意 UnityEngineDll 的选择!2022 版本的太高了!!! 下载包,导入unity : 3. 将 unf8json 的源码拷贝到新建的工程。 4. 编译发布版本: 编译…

做抖店的话营业执照要办什么类型?法人必须是本人信息?问题解答

我是王路飞。 想在抖音开店的新手,好像对抖音个人店有一种迷之追求。 先劝告你们一句,贪小便宜容易吃大亏。 抖音个人店并不适合新手开通,它重在“试运营”这三个字,新手不仅无法正常把店铺做起来,而且后续还要把对…

MPLS动态协议LDP配置示例

一、预习: MPLS是一种根据报文中携带的标签来转发数据的技术,两台LSR必须在它们之间转的数据 的标签使用上“达成共识”。LSR之间可以运行LDP来告知其他LSR本设备上的标签绑定信息,从而实现标签报文的正确转发。 LSR:Label Switch…

在Java中输入连续三个数字并进行升序排序

思想 使用for循环对数组中的元素进行排序:需要创建数组,然后使用for循环进行比较,再者对排序后的元素进行输出。 代码 import java.io.*; import java.util.*; public class Sequence {public static void main(String[] args) throws IO…

javascript之location常用属性和方法

文章目录 前言为什么使用location的属性和方法呢?属性展示hrefhosthostnameportprotocolpathname 方法展示replace(url)assign(url)reload()toString() 总结属性总结:方法总结: 前言 本章学习的是location常用属性和方法 为什么使用location的…

C#多条件排序OrderBy、ThenBy

方法和效果 有多个排序条件,其实不用单独自己写排序方法的,C#内置了排序方法: 引用命名空间System.Linq 正向排序的方法:OrderBy首要条件;ThenBy次要条件,可以连续多个使用 同理,逆向排序对应…

探秘交互设计:深入了解五大核心维度!

交互式设计是用户体验(UX)设计的重要组成部分。本文将解释什么是交互设计,并分享一些有用的交互设计模型,并简要描述交互设计师通常做什么。 如何解释交互设计 交互式设计可以用一个简单的术语来理解:它是用户和产品…

新火种AI|AI正在让汽车成为“消费电子产品”

作者:一号 编辑:小迪 AI正在让汽车产品消费电子化 12月28日,铺垫许久的小米汽车首款产品——小米SU7正式在北京亮相。命里注定要造“电车”的雷军,在台上重磅发布了小米的五大自研核心技术。在车型设计、新能源技术以及智能科技…

Python中使用SQLite数据库的方法2-1

1 SQLite数据库简介 SQLite数据库是一种轻量级的、优秀的开源关系型数据库。它使用Python的标准库实现,并且存储数据库在普通文件中。这些文件在不同机器和操作系统之间是可以移植的,在很多安卓手机中,也是把SQLite作为嵌入数据库使用。 2 …

暗光增强——Zero-DCE网络推理测试

目录 一、Zero-DCE方法1.1 网络优点1.2 网络适用场景1.3 网络不适用场景 二、源码包三、测试四、测试结果五、推理速度六、总结 一、Zero-DCE方法 Zero-DCE(Zero-Reference Deep Curve Estimation)是一种用于低光照增强的网络。 1.1 网络优点 无需参考…

昇腾910平台安装驱动、固件、CANN toolkit、pytorch

本文使用的昇腾910平台操作系统是openEuler,之前没了解过,不过暂时感觉用起来和centOS差不多。系统架构是ARM,安装包基本都是带aarch64字样,注意和x86_64区别开,别下错了。 安装依赖 cmake 通过yum安装的cmake版本较…

华为发布《智能世界2030》思维导图笔记

华为发布《智能世界2030》思维导图笔记

vmware虚拟机中Nat、桥接模式和仅主机的差别

NAT 在NAT模式下,主机3是Kali和Win两个操作系统的宿主机,那么Kali和Win可以连接到外网,也可以和主机3进行互联,但是主机1和主机2不能连接到Kali和Win。 桥接 在桥接模式下,主机3是Kali和Win两个操作系统的宿主机&…

Mybatis插件入门

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

全国行政区划数据集(2011-2020年)

全国行政区划数据集(2011-2020年) 行政区划数据是基础地理信息数据,是按各国行政单元进行的地理划分。不同国家的行政级别称呼不同,例如某些国家称第一级行政单位为省,某一些国家称之为州等。 该数据集整理了2011-202…

Python漂浮爱心完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时,遇到了 hlist,这个 hlist 用起来像是普通的链表,但是为何使用 hlist,hlist 是怎么工作的? 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…

vue如何实现局部刷新?

应用场景&#xff1a; 比如你要切换tap栏实现刷新下面form表单等&#xff0c;相当于刷新页面。 如何使用如下&#xff1a; <div v-if"isReloadData"> 比如你想刷新那个位置就把 v-if"isReloadData"写到那个标签上 </div> 在data中定义刷新标…