我有一个项目A,它有一个“托管依赖”a。a是一个“阴影jar”(uber-jar),它将另一个依赖项b重新定位在其中。问题是,迁移到a中的a版本有几个>7.5 CVE针对它的文件,我想将它排除在CLASSPATH之外,并使用带有>7.5地址的修补版本的b。
我如何使用Maven3来完成这个任务呢?
编辑:附加上下文a是htrace-core4:4.0.1-incubating,是hadoop-common:2.8.3的传递依赖项。htrace-core4:4.0.1-incubating不再受支持,当然还包含一个易受攻击的jackson-databind:2.4.0阴影jar (为了我上面的标签起见,b),它已经被证明能够适应正常的maven“托管依赖”策略。
❯ mvn dependency:tree -Dincludes="org.apache.htrace*"
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.s****m.**:s****s >-------------------------
[INFO] Building s*****s 1.21.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ s****s ---
[INFO] com.s****m.**:s****s:jar:1.0.0-SNAPSHOT
[INFO] \- org.apache.hadoop:hadoop-client:jar:2.8.3:compile
[INFO] \- org.apache.hadoop:hadoop-common:jar:2.8.3:compile
[INFO] \- org.apache.htrace:htrace-core4:jar:4.0.1-incubating:compile
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.676 s
[INFO] Finished at: 2020-04-27T11:57:11-03:00
[INFO] ------------------------------------------------------------------------发布于 2021-01-22 22:28:51
如果你有任何可行的选择,我会问你是否应该这样做。
听起来就像一种情况,你正试图解决一些完全错误的事情。从概念上讲,依赖于已经合并了特定版本的依赖类的东西显然是一个潜在的噩梦,尤其是您已经发现,如果存在针对这些阴影依赖项之一的CVEs。依赖于uber-jar,本质上破坏了依赖关系管理模型。
我猜它是在您的组织内部创建的,而不是来自中央存储库,所以您能对该团队施加压力,让他们做正确的事情吗?
或者,依赖插件的解压缩可能是一个选项--将基于包的依赖解压缩到构建- https://maven.apache.org/plugins/maven-dependency-plugin/usage.html#dependency:unpack中。
下面是一个示例--在默认- jar由maven-jar插件构建之前,将不带auth包的依赖包解压缩到目标的类目录中,然后我必须排除原始的jar--这是一个spring-boot项目,所以我使用了spring-boot插件配置,这是在repackage目标期间使用的,如果您使用的是war插件,我怀疑有类似的排除功能。
最终的结果是从我的jar类目录中的http客户端过滤下来的类,与我的应用程序类一起。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>org/apache/http/auth/</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>注意,由于问题更新,我查看了htrace 4,您可以轻松地包含所有htrace类,而无需使用jackson数据库阴影类。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>org.apache.htrace</groupId>
<artifactId>htrace-core4</artifactId>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<excludes>org/apache/htrace/fasterxml/</excludes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>然后,您只需要排除原来的htrace-core4-4.0.1-cubating.jar,如果您有一个spring引导应用程序,您可以像我这样做,或者在创建war文件或使用任何插件创建最终构建时使用maven war插件。在解压缩过程中,您还可能希望排除jar文件中的一些pom.xml文件,这些文件并不是您真正需要的。
还添加了对一个安全版本的jackson-databind的依赖,尽管htrace总是有使用只存在于易受攻击版本中的方法或类的风险,因此您可能会遇到棘手的运行时错误。
https://stackoverflow.com/questions/65853369
复制相似问题