【AICon】探索八个行业创新案例,教你在教育、金融、医疗、法律等领域实践大模型技术! >>> 了解详情
写点什么

Go 如何减少供应链攻击?

  • 2022-04-26
  • 本文字数:2599 字

    阅读完需:约 9 分钟

Go 如何减少供应链攻击?

现代软件工程是协作性的,并且基于对开源软件的重用。这就使目标暴露在供应链攻击之下,而软件项目则会因为其依赖性被破坏而遭到攻击。


无论采用何种过程或技术手段,每个依赖性都必然存在着相互信任的关系。但是,Go 的工具和设计帮助降低了所有阶段的风险。

所有构建都已“锁定”


外部世界的变化,例如发布依赖性的新版本,并不会影响 Go 的构建。


与大多数软件包管理器文件不同,Go 模块没有单独的约束列表和锁文件,但是它锁定了某个特定的版本。任何 Go 构建的每个依赖性的版本完全取决于主模块的 go.mod 文件。


从 Go 1.16 开始,这种决定论就会强制执行,并且在 go.mod 不完整的情况下,构建命令(gobuild、gotest、goinstall、gorun……)将会失败。唯一会改变 go.mod(因此也会改变构建)的命令是 goget 和 gomodtidy。这些命令不会被自动或在 CI 中运行,所以对依赖树的改变必须是故意的,并且有机会通过代码审查。


这对安全非常重要,因为当 CI 系统或新机器运行时,签入 (checked-in) 的源码是最终的和完整的,代码将说明什么会被构建,第三方没有办法影响它。


此外,当用 goget 添加依赖性时,由于最小版本的选择,它的交叉依赖会按照依赖的 go.mod 文件中指定的版本添加,而不是按照最新版本。同样的情况也发生在调用 goinstallexample.com/cmd/devtoolx@latest 的情况下,在某些生态系统中,它的等价物会绕过 pinning。在 Go 中,example.com/cmd/devtoolx 的最新版本将被获取,但所有的依赖性将由其 go.mod 文件设置。


如果一个模块被破坏,新的恶意版本被发布,在它们明确更新该依赖性之前,不会受到任何影响,这就提供了审查更改的机会,并让生态系统有了足够的时间来检测事件。

版本内容永远不会改变


确保第三方不能影响构建的另一个关键属性是,模块版本的内容是不可改变的。如果攻击者破坏了依赖性,可以重新上传现有的版本,他们就可以自动破坏所有依赖它的项目。


这就是 go.sum 文件的作用。它包含构建所需的每个依赖项的加密哈希列表。同样,一个不完整的 go.sum 会导致错误,而且只有 goget 和 gomod tidy 才会修改它,所以任何对它的修改都会伴随着故意的依赖性改变。其他的构建被保证有一套完整的校验和。


这是大多数锁文件的一个共同特征。Go 通过 Checksum Database(简称 sumdb)超越了它,它是一个全局性的、仅可附加的加密验证的 go.sum 条目列表。当 goget 需要在 go.sum 文件中添加一个条目时,它从 sumdb 中获取该条目,并对 sumdb 的完整性进行加密证明。这不仅确保了某一模块的每一次构建都使用相同的依赖内容,而且确保了每一个模块都使用相同的依赖内容。


sumdb 使得被破坏的依赖内容,甚至谷歌运营的 Go 基础设施不可能用修改过的(例如 backdoored)源代码来针对特定的依赖内容。保证你使用的代码与其他使用例如 example.com/modulex 的 v1.9.2 的人所使用的代码完全一样,并且已通过审查。


最后,我最喜欢 sumdb 的特性是:它不需要模块作者的任何密钥管理,并且可以无缝地与 Go 模块的去中心化特性配合使用。

VCS 是真理的源泉


大多数项目是通过某种版本控制系统(VCS)开发的,然后在其他生态系统中,上传到包存储库。这意味着有两个账户可能被入侵,即 VCS 主机和包存储库,后者使用得更少,更容易被忽视。这也意味着在上传到存储库的版本中更容易隐藏恶意代码,尤其是在上传过程中经常修改源代码的情况下,比如说将其最小化。


在 Go 中,不存在包存储库账户这样的东西。包的导入路径嵌入了 gomoddownload 所需要的信息,以便直接从 VCS 中获取其模块,其中标签定义了版本。


我们确实有 Go Module Mirror,但那只是一个代理。模块作者不需要注册账户,也不需要向代理上传版本。代理使用与 go 工具相同的逻辑(事实上,代理运行 gomoddownload)来获取和缓存版本。由于校验数据库保证给定的模块版本只能有一个源树,每个使用代理的人都会看到与绕过代理直接从 VCS 获取的结果相同。(如果该版本在 VCS 中不再可用,或者其内容发生了变化,直接获取将导致错误,而从代理获取可能仍然有效,提高了可用性并保护生态系统免受 “左键”问题的影响)。


在客户端运行 VCS 工具会暴露出一个相当大的攻击面。这也是 Go Module Mirror 的另一个作用:代理上的 Go 工具在一个强大的沙盒内运行,并被配置为支持所有的 VCS 工具,而默认的是只支持两个主要的 VCS 系统(git 和 Mercurial)。任何使用代理的人仍然可以获取使用非默认的 VCS 系统发布的代码,但攻击者在大多数安装中无法接触到这些代码。

仅构建代码,但不会执行它


Go 工具链的一个清晰的安全设计目标是,即使代码是不可信和恶意的,也不能获取或构建代码来执行该代码。这与大多数生态系统不同,其中许多生态系统对在获取包时运行代码提供了一流的支持。这些“安装后”的钩子在在过去被用作一种最方便的攻击方式:通过受到攻击的依赖攻击开发者的机器,并通过 module 作者进行蠕虫攻击。


公平地说,如果你要获取一些代码,往往会在不久之后执行,要么作为开发者机器上测试的一部分,要么作为生产中二进制文件的一部分,所以缺乏安装后钩子只会减缓攻击者。(在构建过程中没有安全边界:任何有助于构建的软件包都可以定义一个初始函数)。然而,这也是一种有意义的风险缓解,因为你可能在执行一个二进制文件或测试一个包时,只使用了模块依赖的一个子集。例如,如果你在 macOS 上构建并执行 example.com/cmd/devtoolx,那么只有 Windows 的依赖或 example.com/cmd/othertool 的依赖就不可能危害到你的机器。


在 Go 中,不为特定构建提供代码的模块对其没有安全影响。

“一点复制比一点依赖要好”


在 Go 生态系统中,最后一个也许也是最重要的软件供应链风险缓解措施是最没有技术含量的一个:Go 有一种拒绝大型依赖树的文化,宁愿复制一下也不愿意添加新的依赖。这可以追溯到 Go 的一个谚语:“一点复制比一点依赖要好”。高质量的可重用 Go 模块自豪地戴上了 “零依赖” 的标签。如果你发现自己需要一个库,你很可能会发现它不会导致你依赖其他作者和所有者的几十个模块。


丰富的标准库和其他模块(golang.org/x/……的模块)也支持这一点,这些模块提供了常用的高级构建模块,如 HTTP 栈、TLS 库、JSON 编码等。


所有这些意味着只需少量的依赖性就可以建立丰富、复杂的应用程序。无论工具有多好,它都不能消除重复使用代码的风险,所以最有力的缓解措施永远是一个小的依赖树。


原文链接:


https://go.dev/blog/supply-chain

公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2022-04-26 14:0711596

评论

发布
暂无评论
发现更多内容

爆款元服务!教你如何设计高使用率卡片

HarmonyOS开发者

HarmonyOS

数据库性能优化新选择:NineData慢查询分析

NineData

数据库 架构 数据分析 服务器 优化

记一次线上问题引发的对 Mysql 锁机制分析 | 京东物流技术团队

京东科技开发者

MySQL 数据库 死锁 间隙锁 企业号11月PK榜

2023年好用的远程协同运维工具当属行云管家!

行云管家

IT运维 远程运维 远程连接 远程系统

MAMP Pro for Mac激活版下载(PHP/MySQL开发环境)

iMac小白

MAMP PRO for Mac MAMP Pro破解 MAMP Pro Mac下载

率先支持Kuasar!iSulad Sandbox API 简化调用链,沙箱管理能力增强

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟

SnailSVNPro激活专业版:Mac电脑专业的SVN客户端

iMac小白

SnailSVN Pro SnailSVN Pro下载 SnailSVN Pro mac

即时通讯技术文集(第23期):IM安全相关文章(Part12) [共15篇]

JackJiang

网络编程 即时通讯 IM

实例讲解数据库的定义重载函数

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

热换站2D组态 热换机组监测控制系统

2D3D前端可视化开发

物联网 组态软件 智慧供暖 城市换热站 换热机组

ChatGLM3-6B:新一代开源双语对话语言模型,流畅对话与低部署门槛再升级

汀丶人工智能

人工智能 自然语言处理 深度学习 大语言模型 chatglm3

定做舞台租赁LED显示屏要注意什么

Dylan

LED LED显示屏 led显示屏厂家 户内led显示屏

pycharm pro 中文永久破解版下载

iMac小白

Linux常用命令用法及实现方式

小齐写代码

编程不是写代码,揭秘3种编程新范式:文本、图形和自然语言

代码生成器研究

编程 低代码 代码 编程范式 ChatGPT

Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能

汀丶人工智能

人工智能 Milvus 向量数据库 检索系统

Java基础面试题【分布式】组件

派大星

Java 面试题

深入跨域 - 从初识到入门 | 京东物流技术团队

京东科技开发者

前端 跨域 WMS仓库管理 企业号11月PK榜

图形化探索:快速改造单实例为双主、MGR、读写分离等架

GreatSQL

greatsql

ABBYY FineReader PDF 15 for Mac中文激活版

iMac小白

Macos硬件监测和系统维护工具:TechTool Pro for mac

加油,小妞!

系统维护 mac系统维护软件 TechTool Pro

苹果mac电脑 Word 2021激活版 附最新激活工具

iMac小白

G口服务器有多快

Geek_f19a80

服务器

Excel LTSC 2021 中文破解版 Excel LTSC 2021 最新激活下载

iMac小白

Excel2021 Excel激活版 Excel破解版 Excel下载

最强大模型训练芯片H200发布!141G大内存,AI推理最高提升90%,还兼容H100

Openlab_cosmoplat

人工智能视频增强软件Topaz Video AI for mac 完美激活版下载

iMac小白

Go 如何减少供应链攻击?_文化 & 方法_Filippo Valsorda_InfoQ精选文章