一、背景
Golang开发者非常关心开发应用的安全性。随着Go Module应用越来越广泛,Golang开发者需要更多的方式来确保这些公共共享文件的安全。Golang1.13版本在创建Go Module时,通过增加go.sum文件来验证之后从GOPROXY再次访问到的该Module是否曾被篡改。这个机制有助于保证Module的完整性。但是,当初次创建并提交Go Module时,如果原始文件中被引入了恶意代码,这种安全漏洞还是不能被发现和预警的。
Go Module的安全漏洞影响了很多项目和Go开发者。随着CI/CD流程中“左移”实践的推广,对于Go开发者来说,尽早跟踪和报告Go Module之中的安全漏洞变得越来越重要。幸运的是,GoCenter(https://search.gocenter.io)作为Golang的中央仓库,为Go开发者提供大量公共共享Go Module的同时,也通过集成JFrog Xray安全扫描的能力,帮助Go开发者检测、跟踪并报告仓库中Go Module包含的安全漏洞。
二、报告安全漏洞
任何应用系统,在其开发的生命周期中,都应该持续监视安全漏洞,任何人发现了安全漏洞都应及时报告,以便其修复措施能够被更多的组织和开发者分享与跟踪。已知安全漏洞通常利用CVE(Common Vulnerability and Exposures, 常见漏洞及披露)来分类和跟踪,这是一个用于公开披露安全漏洞信息的列表。每个CVE信息包含一个标准标识序号(CVE ID)、一个状态指示器、对该漏洞的简短描述,以及与漏洞报告及建议相关的索引。
CVE不是漏洞数据库。相反,CVE旨在允许漏洞数据库和其他工具链接在一起,并促进安全工具和服务之间的比较。美国国家漏洞数据库(NVD,National Vulnerability Database)是一个免费的、公开的漏洞数据库,它使用CVE列表的标识序号,并包含漏洞的修复程序、漏洞级别评分,以及其他和每个漏洞相关的信息。
每一个被检测到的安全漏洞都必须报告给CVE编号颁发机构(CNA,CVE Numbering
Authorities),并附上详细的文档解释该漏洞的影响,以及至少一个受影响的代码库,然后才能将其识别为已知漏洞并分配一个CVE ID。作为参考,CVE ID的格式通常为:CVE前缀 + 年 + 任意数字。以下是CVE ID的示例:
三、保护Go Module安全的数据复杂性
确保Go Mudule的安全可能是一项棘手的任务,特别是由于Go Module和Go Package之间的关系。一旦收到Go Module的安全数据,就很难将该数据与特定的Module版本相关联。这是因为安全漏洞存在于Package级别,但是却报告在Module级别上。这可能会给人留下整个Module都容易受到攻击的印象。但事实并非如此,除非您使用易受攻击的Package数据,否则Module将保持安全。
让我们以上图中的CVE-2020-10660 为例。以下是1.3.4版变更日志的摘录,详细介绍了此漏洞的影响:
gopkg.in/hashicorp/vault.v0和github.com/hashicorp/vault都受到了HashiCorp Vault和Vault Enterprise0.9.0到1.3.3版本中的CVE-2020-10660的影响。在使用这些Package时,在某些情况下,它们可能使实体的组成员无意间包含了该实体不再具有权限的组。Vault Enterprise中发现的另一个漏洞是,在某些情况下,现有的嵌套路径策略可能会提供对事后创建的命名空间的访问权限。幸运的是,在版本1.3.4中对这些漏洞进行了修复。
如上例所示,修复是在github.com/hashicorp/vault内进行的。Module
istio.io/istio在其go.mod文件里记录了对github.com/hashicorp/vault的依赖。通常,您会认为istio.io/istio的安全性也会受到威胁。但是它仅仅使用了package github.com/hasicorp/vault/api,因此其代码是不受此漏洞的影响的。请参考下面的源代码:
四、减少软件的安全漏洞
现在您已经了解了如何报告Go
Module安全漏洞的过程,以及有关安全数据复杂性的一些详细信息,让我们看看如何在将来的开发中减少这些威胁。
首先,让我们看一下GoCenter中的Go Module:github/hashicorp/vault。
根据CVE数据,JFrog Xray能够扫描一个go.mod文件里包含的所有在GoCenter中保存的依赖,并识别其中包含的每个安全漏洞。GoCenter在“依赖关系”选项卡上显示这些Xray数据,并提供依赖关系树上各个级别里易受攻击Module的详细信息。您会在每个易受攻击的Module旁边看到一个警示的三角形。然后,您可以单击这些易受攻击的Module并跳转到安全页面。在这里,查看“版本”选项卡可以查找该模块的安全版本,以便您可以在go.mod文件中对其进行升级。
一旦确定了所有组件和依赖项,它们的信息就会与其他漏洞源和数据库进行交叉引用,以提醒您任何潜在的威胁。GoCenter上提供了免费的针对Go Module的基本Xray漏洞扫描,如“安全性”选项卡所示:
五、GoCenter助力Go开发者保持应用安全
GoCenter是公共GOPROXY和中央仓库,具有70万+的Go Module版本。将GoCenter用作GOPROXY时,可以确保下载的代码版本是来自正确源代码的正确版本。GoCenter作为您的GOPROXY可与Go命令无缝协作,并具有安全、快速、可用和存储高效的优势。
许多Golang开发者还可以使用VS Code的免费JFrog扩展,将GoCenter的漏洞信息直接引入其IDE中。
随着CI/CD流程中“左移”实践的推广与落地,GoCenter的安全功能可以帮助您确定要导⼊的公共Go Module版本中是否存在易受攻击的依赖项,进而帮助您保持开发应用的安全性。
更多技术分享可以关注我们在新课堂
关注微信公众号:JFrog杰蛙DevOps,获取课程通知
有疑问加站长微信联系(非本文作者)