2

我正在尝试修复 Snyk 工具在我的程序中发现的一些漏洞,但其中一些来自我正在使用的库(如 Apache 的 Pulsar)。例如,Pulsar 正在使用 2.8.6 版本的 gson,根据 Snyk 的说法,它是易受攻击的,下一个安全版本是 2.8.9。是否可以强制我使用的所有库使用 gson 2.8.9 版(通过 gradle)?或者不是因为这是一个非常愚蠢的想法,容易出现意外行为?

谢谢

4

2 回答 2

2

这是一件合情合理的事情。官方支持升级库的新版本 pulsar 会更好,但您通常可以安全地升级传递依赖项。特别是,如果库作者遵循语义版本控制,那么单点版本(即 2.8.6 -> 2.8.9)可能是安全的。

Gradle 提供了几种方法来做到这一点,现在(从 gradle 7.3 开始)似乎最惯用的方法是使用约束。

例如,如果您的依赖项如下所示:

dependencies {
  implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
}

运行依赖洞察将显示我们正在解析 gson 2.8.6

`./gradlew dependencyInsight --dependency gson`


...

com.google.code.gson:gson:2.8.6
\--- org.apache.pulsar:pulsar-package-core:2.9.1
     \--- org.apache.pulsar:pulsar-client-all:2.9.1
          \--- compileClasspath

我们可以添加一个约束,强制它使用这样的新版本。

dependencies {
  implementation 'org.apache.pulsar:pulsar-client-all:2.9.1'
  constraints {
        implementation('com.google.code.gson:gson:2.8.9') {
            because 'previous versions have a security vulnerability'
        }
  }
}

现在我们得到以下结果

com.google.code.gson:gson:2.8.9
...
   Selection reasons:
      - By constraint : previous versions have a security vulnerability
      - By conflict resolution : between versions 2.8.9 and 2.8.6

com.google.code.gson:gson:2.8.9
\--- compileClasspath

com.google.code.gson:gson:2.8.6 -> 2.8.9
\--- org.apache.pulsar:pulsar-package-core:2.9.1
     \--- org.apache.pulsar:pulsar-client-all:2.9.1
          \--- compileClasspath

它现在像你想要的那样解析 2.8.9。

Gradle 有相当广泛的关于依赖管理的文档,这是查找有关此类事物的更多信息的好方法。

于 2022-01-05T16:45:50.840 回答
0

我不确定这是一个好主意,我认为更新依赖于 gson 稳定版本的 Apache 的 Pulsar 版本是一个更好的主意。

但仍然不是 100% 确定,等待其他澄清。

仍然可以像下面这样完成您想要的

configurations.all {
    exclude group: 'com.google.code.gson:gson:2.8.6'
}

这将排除项目中所有版本为 2.8.6 的 gson。

然后您可以根据需要添加以下版本

implementation 'com.google.code.gson:gson:2.8.9'
于 2022-01-05T12:55:26.407 回答