应配置maven-enforcer-plugin的bannedDependencies规则:排除log4j:log4j全部版本,及org.apache.logging.log4j:log4j-core[2.0,2.15.0)范围版本;fail和failFast必须设为true,确保CI构建失败阻断漏洞引入。

如何用 bannedDependencies 规则拦截 log4j 旧版本
直接在 pom.xml 的 maven-enforcer-plugin 配置中启用 bannedDependencies,它会在构建时扫描整个依赖树,匹配到黑名单中的坐标就报错。关键不是“有没有”,而是“匹配是否精确”——log4j 的漏洞集中在 log4j:log4j(1.x)和 org.apache.logging.log4j:log4j-core(2.0–2.14.1),必须分别覆盖。
-
log4j:log4j是 Apache Log4j 1.x,所有版本都应禁止,写成<exclude>log4j:log4j</exclude> -
org.apache.logging.log4j:log4j-core是 Log4j 2.x,需排除2.0到2.14.1(含),但允许2.15.0+和2.17.0+等修复版,不能只写org.apache.logging.log4j:log4j-core:2.14.1—— 这只会拦住精确版本,漏掉2.12.0等中间漏洞版 - 正确做法是用范围语法:
<exclude>org.apache.logging.log4j:log4j-core:[,2.15.0)</exclude>(Maven 3.5+ 支持),或拆成多条<exclude>org.apache.logging.log4j:log4j-core:2.0</exclude>、<exclude>org.apache.logging.log4j:log4j-core:2.1</exclude>…但更易遗漏
fail 和 failFast 在 CI/CD 中必须设为 true
默认 fail=true,但很多团队复制配置时删掉了这行,导致规则只告警不中断构建——CI 流水线里这等于没开。尤其 Jenkins 或 GitLab CI 中,如果构建没失败,后续部署步骤照常执行,漏洞库就进了制品库。
-
<fail>true</fail>是硬性要求,否则bannedDependencies匹配成功也仅输出 WARN,流水线不会红 -
<failFast>true</failFast>建议开启:一旦发现第一个违规依赖立即终止,避免浪费资源继续编译;否则可能扫完整个依赖树才报错,延迟反馈 - 别依赖
-Denforcer.skip:CI 脚本里严禁加这个参数,它会绕过全部规则
为什么 bannedDependencies 比 dependency:analyze-only 更适合 CI
dependency:analyze-only 只检查直接声明的依赖,而 log4j 漏洞往往藏在间接依赖里(比如通过 spring-boot-starter-web → tomcat-embed-logging → log4j:log4j)。bannedDependencies 默认扫描整个 effective dependency tree,无需额外配置。
- 它不关心依赖是 direct 还是 transitive,只要出现在最终 classpath 上就检查
- 支持通配符和版本范围,比手动 grep
mvn dependency:tree输出可靠得多 - 与 Maven 生命周期绑定(如
verify阶段),天然融入 CI 构建流程,不需要额外 shell 步骤
容易被忽略的绕过点:BOM 和 import scope
如果项目用了 Spring Boot BOM 或自定义 BOM,且其中 <dependencyManagement> 声明了旧版 log4j,bannedDependencies 仍会生效——但它只检查实际解析出的依赖,不检查 dependencyManagement 里的声明。真正危险的是:当 BOM 锁定了 log4j-core:2.12.1,而子模块没显式声明,该版本仍会被拉入。
- 确保 BOM 本身也经过 enforcer 检查(即在 BOM 的 pom 中同样配置
bannedDependencies) - 避免在
<excludes>里漏掉 classifier,例如log4j:log4j:1.2.17:jar和log4j:log4j:1.2.17:tests是两个不同 artifact,后者需单独排除 - 注意
provided或testscope 的依赖:默认也会被检查,若想跳过,需在 rule 配置中加<includeScope>compile,runtime</includeScope>
log4j-core:2.11.0 就可能让整套系统暴露在远程代码执行风险下——而这种事,通常发生在你改完配置、看到构建变绿之后。

















