插件门户安全 CVE-2020-7599

目录

发布插件到插件门户的重要更新 #

我们于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向我们报告此问题。

当插件发布到插件门户时,会向com.gradle.plugin-publish插件传递一个预签名AWS S3 URL以上传构件。此URL的有效期为1小时,并且可以重复使用。默认情况下,此URL从未显示给用户,但是如果构建以提升的日志级别(--info--debug)运行,则预签名URL会捕获在构建日志文件中。攻击者可以使用此URL在1小时窗口内覆盖插件的构件。

总的来说,重要的是面向公众的构建要谨慎记录构建输出中的内容。大多数CI系统都会尝试从构建日志中过滤掉敏感数据,但在某些情况下,它们可能不会隐藏所有内容;据我们所知,没有CI提供商会过滤这些类型的URL。以debug级别日志记录运行构建可能会暴露有关您的基础架构、密码或内部Web端点的敏感信息。此漏洞是通过启用info级别日志记录运行的构建实现的。

补救和调查 #

经过我们的调查,我们没有发现任何恶意覆盖的构件。

一旦我们意识到该漏洞,我们就部署了一个更改来限制预签名URL的有效期。这大大缩短了攻击窗口。由于com.gradle.plugin-publish插件的工作方式,URL需要保持有效一段时间才能允许所有构件发布。

我们还调查了是否任何构件已被泄露。当将构件发布到插件门户时,客户端会报告它们打算上传的构件的SHA256校验和。我们记录该校验和,这使我们能够将原始校验和与S3存储桶中每个构件的校验和进行比较。如果S3存储桶中构件的校验和与原始校验和不匹配,则可能表示该构件已被覆盖。

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

这些构件包括

  • 非可执行构件,例如不包含类文件的源文件、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及更高版本的所有用户。

如果您在升级过程中遇到问题,请通过issue告知我们。

更多信息 #

对于安全相关的问题,请发送电子邮件至security@gradle.com

对于非安全相关的问题,请在Github上提交issue。

讨论