近期软件供应链攻击频传,最近发生在Npm上的攻击,更是由组件作者本人发动,但由于现代软件工程创建在协作之上,并且重度依赖开源软件,这使得企业软件不得不面对,来自相依项目所进行的供应链攻击。Go官方在自家博客,详细说明Go开发工具和流程设计,足以降低各阶段遭到攻击的风险。
Go防御供应链攻击第一招便是锁定构建,使得外部的更改,都无法自动影响Go的构建,官方提到,与大多数的组件文件管理不同,Go模块没有独立的限制列表,或是可以锁定特定版本的置顶文件,参与Go构建的每个相依项目的版本,完全由主模块的go.mod文件控制。
从Go1.16开始,系统默认在go.mod不完整的情况下,构建命令包括gobuild、gotest、goinstall和gorun等命令将会执行失败,唯一会改变go.mod与构建的命令,是goget和gomodtidy,但这两个命令并不会自动执行或是在CI中执行,因此要对相依关系树做出更改,必须是刻意为之,并且有机会经过程序代码审查。
而且利用goget命令添加相依项目时,会使用go.mod中指定的版本而非最新版本。由于此机制,当模块被入侵并发布新的恶意版本时,在项目明确更新相依项目之前,既有程序代码都不会受到影响,而这也提供生态系统审查更改和侦测事件的机会。
另一个确保第三方无法影响构建的关键属性,是模块版本内容无法改变,因为当破坏相依项目的攻击者,可重新上传现有版本,便能够进一步破坏相依于该模块的项目。而go.sum文件包含了相依项目的加密散列列表,因此能够验证模块的真伪,仅有goget和gomodtidy能够修改该文件,而任何go.sum的任何变更都会是刻意进行的相依项目变更。
另外,Go把版本控制系统当作唯一的事实来源,官方解释,大多数的项目都是利用版本控制系统进行开发,并且上传到组件存储库,而这代表其中有两个环节可能受到攻击,其一是版本控制系统主机,另一个则是组件存储库,而后者因为较少被
转载请注明:http://www.0431gb208.com/sjszyzl/7834.html