插件门户安全CVE-2020-7599漏洞修补和跟新

100 阅读6分钟

向插件门户发布插件时的重要更新

2020年3月4日,一个安全漏洞被报告给我们。这个问题可能允许授权人在插件门户上覆盖插件工件,如果他们能够访问发布该插件的构建日志。经过彻底的调查,我们发现没有任何人工制品被恶意改写。

作为回应,我们已经发布了一个新版本的com.gradle.plugin-publish 插件,其中包含一个更新,以缓解这一安全漏洞。

请将com.gradle.plugin-publish 插件升级到0.11.0 版本。旧版本的com.gradle.plugin-publish 插件将不再工作。如果你不向插件门户发布插件,你不需要做任何事情。

我们还建议,处理敏感信息的构建(如发布构建)不要用高的日志级别运行(如用Gradle的--debug ),并且要保持私密性,以减少敏感信息暴露后可能造成的损失。你也应该遵循你的CI供应商的最佳实践,以避免敏感信息泄露到构建日志中(作为一个例子,Travis CI)。像其他软件一样,构建维护者和插件作者需要牢记可能被记录的信息类型。

这篇文章是对我们发现的问题的总结,以及我们如何验证由插件门户提供的工件没有被改变。如果你对我们发现的东西感兴趣,请继续阅读。

漏洞的发现

在2020年3月4日,我们收到了关于上传至插件门户的安全漏洞的通知。该漏洞可能允许任何能够访问发布插件的构建的日志文件的人,在启用info 级日志时覆盖插件的工件。这是一个针对插件发布插件的信息泄露漏洞(CWE-532:将敏感信息插入日志文件),并被CVE-2020-7599所追踪。

感谢Netflix的Danny Thomas向我们报告这个问题。

当一个插件被发布到插件门户时,一个预先签名的AWS S3 URL被传递给com.gradle.plugin-publish 插件,以上传工件。这个URL的有效期是1小时,可以重复使用。默认情况下,这个URL不会显示给用户,但如果构建时提高了日志级别(--info--debug ),预签署的URL就会被捕获到构建日志文件中。有了这个URL,攻击者就可以在这1小时内覆盖插件的工件。

总的来说,面向公众的构建必须谨慎对待被记录到构建输出的内容。大多数CI系统试图从构建日志中过滤掉敏感数据,但在某些情况下,他们可能不会隐藏一切;据我们所知,没有一个CI供应商过滤这些类型的URL。用debug 级日志运行你的构建,可能会暴露你的基础设施、密码或内部网络端点的敏感信息。这个漏洞是在启用info 级别的日志的情况下运行的。

补救和调查

经过调查,我们没有发现恶意改写的工件。

一旦我们意识到这个漏洞,我们就部署了一个改变,以限制预签名URL的寿命。这大大缩短了攻击的时间。由于com.gradle.plugin-publish 插件的工作方式,URL需要在一定时间内保持有效,以允许所有的工件被发布。

我们还调查了是否有任何工件被破坏了。当向插件门户发布工件时,客户会报告他们打算上传的工件的SHA256校验和。我们记录该校验和,这使我们能够将原始校验和与S3桶中每个工件的校验和进行比较。如果S3桶中工件的校验和与原始校验和不一致,这可能表明该工件被覆盖了。

我们审计了插件门户中的所有工件(超过190,000个),查看是否有不匹配的工件哈希值。我们通过下载S3桶的内容并将实际的SHA256校验和与我们的数据库进行比较来进行这种比较。我们最初确定了超过9000个不匹配,但这些工件中的绝大部分是用户无法通过插件门户访问的。这些工件是为那些被删除或未能完全发布其所有工件的插件创建的。只有12个工件没有通过校验和匹配,并从插件门户提供。我们调查了其中的每一个,以确定它们是否被破坏。

这些工件包括

  • 不可执行的工件,比如不包含类文件的source、javadoc和groovydoc(4)
  • 由于早期不相关的安全调查而导致不匹配的工件(2个)
  • 由非公开构建产生的工件(2)
  • 一个在调查此漏洞时被故意改变的工件
  • 一个jar文件,在本地构建时只包含时间戳差异
  • 一个没有可疑内容的pom文件
  • 一个无效的jar文件

没有一个工件看起来是有意义的不同,或可能是出于恶意的目的而被破坏。

我们还联系了几个主要的云计算CI供应商,以帮助识别那些可能在构建日志中暴露预签名URL的项目。我们要感谢GitHub和CircleCI的IR团队,他们都非常积极地提供了帮助。

这个问题已经被修补了吗?我应该升级到哪个版本?

我们已经发布了一个新版本的com.gradle.plugin-publish 插件,减少了预签名URL的日志级别。 请将com.gradle.plugin-publish 升级到0.11.0 版本。这个插件以前的版本不再工作,将被插件门户拒绝。

这些变化减轻了敏感URL的暴露,但仍然很重要的是,面向公众的构建要谨慎对待构建输出中的日志内容。使用--debug 运行Gradle仍然会暴露出预签名的URL。内部JDK日志将记录所有的HTTP请求,而不仅仅是工件的URL。

今后,我们将对插件门户进行更新,以检测被覆盖的工件,并提高Gradle插件生态系统的安全性。

我不能升级,有什么可以做的吗?

我们要求每个人都升级到最新版本的com.gradle.plugin-publish 插件。这个版本应该适用于使用Gradle 3.0及以上版本的人。

如果你在升级时遇到问题,请让我们知道,并提出问题

欲了解更多信息

对于安全相关的问题,请发邮件给我们:security@gradle.com。

对于非安全相关的问题,请在Github上开一个问题。