如何让Sonatype Lift漏洞扫描器在Maven发布时识别依赖覆盖?
问题描述
我正尝试通过Sonatype的Nexus OSS仓库管理器将Scala库play-hmac-signatures发布到Maven仓库。我的库依赖最新版Play Framework(com.typesafe.play:play_2.13:2.8.18),而该框架依赖旧版本的com.fasterxml.jackson(2.11.4)。我在构建配置中通过以下代码覆盖了依赖版本:
dependencyOverrides += "com.fasterxml.jackson.core" % "jackson-databind" % "2.13.4"
我已经通过sbt依赖树插件和缓存文件验证,本地构建确实使用了正确的jackson-databind版本。但使用sbt-sonatype插件(3.9.14)发布到Maven时,Sonatype Lift漏洞扫描器因为检测到pkg:maven/com.fasterxml.jackson.core/jackson-databind@2.11.4的漏洞而拒绝了我的发布——这个版本是我已经在构建中覆盖的旧版本。查看提交到Nexus的构建产物后发现,POM文件只列出了顶层依赖,Sonatype Lift似乎只依据这些顶层依赖遍历依赖图查找漏洞,完全忽略了我明确设置的依赖覆盖。请问有没有办法将依赖覆盖同步到POM文件中?
附上当前生成的POM文件:
<?xml version='1.0' encoding='UTF-8'?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <groupId>com.mesonomics</groupId> <artifactId>play-hmac-signatures_2.13</artifactId> <packaging>jar</packaging> <description>play-hmac-signatures</description> <url>https://github.com/phelps-sg/play-hmac-signatures</url> <version>0.2.2</version> <licenses> <license> <name>Apache-2.0</name> <url>http://www.apache.org/licenses/LICENSE-2.0</url> <distribution>repo</distribution> </license> </licenses> <name>play-hmac-signatures</name> <organization> <name>com.mesonomics</name> <url>https://github.com/phelps-sg/play-hmac-signatures</url> </organization> <scm> <url>https://github.com/phelps-sg/play-hmac-signatures</url> <connection>git@github.com:phelps-sg/play-hmac-signatures.git</connection> </scm> <developers> <developer> <id>phelps-sg</id> <name>Steve Phelps</name> <url>https://github.com/usernamehttps://github.com/phelps-sg</url> <email>sphelps@sphelps.net</email> </developer> </developers> <dependencies> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.13.10</version> </dependency> <dependency> <groupId>com.typesafe.play</groupId> <artifactId>play_2.13</artifactId> <version>2.8.18</version> </dependency> <dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>5.1.0</version> </dependency> <dependency> <groupId>org.scalactic</groupId> <artifactId>scalactic_2.13</artifactId> <version>3.2.14</version> </dependency> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_2.13</artifactId> <version>3.2.14</version> <scope>test</scope> </dependency> <dependency> <groupId>org.scalatestplus.play</groupId> <artifactId>scalatestplus-play_2.13</artifactId> <version>5.1.0</version> <scope>test</scope> </dependency> </dependencies> </project>
sbt的dependencyOverrides是构建时的本地覆盖规则,默认不会写入生成的POM文件——因为Maven生态没有对应的机制,Sonatype Lift只会基于POM里的依赖关系扫描漏洞,所以必须把版本覆盖规则同步到POM中,有两种可靠方法:
方法一:显式添加依赖到libraryDependencies
直接将jackson-databind作为顶层依赖加入构建配置,生成的POM会包含该依赖,Maven解析时会优先使用这个版本,覆盖Play Framework传递的旧版本:
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.13.4"
添加后可以保留dependencyOverrides确保本地构建一致性,不过显式依赖的优先级更高,也可以省略dependencyOverrides。
方法二:在POM中添加dependencyManagement节点
如果不想把jackson-databind作为顶层依赖暴露,可通过sbt的pomExtra配置在生成的POM中加入dependencyManagement块,强制指定版本:
pomExtra := { <dependencyManagement> <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.13.4</version> </dependency> <!-- 建议同步覆盖jackson核心组件版本,保持一致性 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.4</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.13.4</version> </dependency> </dependencies> </dependencyManagement> }
生成的POM会包含dependencyManagement部分,Sonatype Lift扫描时会遵循这个版本规则,不会再检测到旧版本漏洞。
验证修改效果
执行sbt makePom命令生成新的POM文件,检查是否包含对应的依赖或dependencyManagement节点,确认无误后再执行发布流程。
内容的提问来源于stack exchange,提问作者Peewee 733

