WildFly 模块依赖存在 CVE 时,如何通过 Galleon 升级?
应该通过 Galleon 升级,还是等待官方修复?
建议优先升级到包含该修复、且适合当前应用的 WildFly 官方版本。如果官方修复尚未发布,而漏洞的实际风险不允许等待,可以考虑通过 Galleon 覆盖受影响依赖的版本。使用前需要自行验证兼容性,并准备回退方案。
WildFly Galleon 插件提供的 jboss-overridden-artifacts 选项,可以在 provisioning 时覆盖 feature-pack 定义的 Maven artifact 版本。能否在当前环境中使用,需要查阅所用 feature-pack 和插件版本的文档。WildFly Galleon 插件文档
由于原问题没有提供 WildFly 版本、Jackson artifact 坐标、CVE 编号和目标版本,目前无法判断具体应升级哪些 JAR,也无法确认一次 minor upgrade 就能安全解决问题。
为什么不能只看 Jackson 的版本号?
除了确认目标版本是否修复了该 CVE,还需要判断当前应用是否满足漏洞触发条件,以及目标版本是否兼容服务器中的其他组件。
Jackson 可能涉及多个 artifact。升级 jackson-databind 时,还要检查 jackson-core、jackson-annotations 和服务器所用扩展模块要求的兼容版本组合。不能仅凭“次版本升级”就认定与服务器的集成一定兼容。
WildFly 官方的组件覆盖说明也要求替换后的组件与服务器兼容。因此,独立覆盖依赖作为临时修复方案时,需要完成相应的验证工作。WildFly 组件升级说明
如何配置 Galleon 依赖覆盖?
如果使用 wildfly-maven-plugin 执行 provisioning,可以在已有插件配置的 <galleon-options> 中添加覆盖项。下面以 jackson-databind 为例,演示配置位置:
<configuration>
<galleon-options>
<jboss-overridden-artifacts>com.fasterxml.jackson.core:jackson-databind:${jackson.databind.fixed.version}::jar</jboss-overridden-artifacts>
</galleon-options>
</configuration>
在项目中定义 jackson.databind.fixed.version,其值应来自该 CVE 的修复信息,并经过当前 WildFly 环境的兼容性验证。这个片段需要合并到现有 provisioning 配置中,不能直接作为完整构建配置使用,也不意味着只更新 jackson-databind 就足够。
该选项的坐标格式为:
GroupId:ArtifactId:Version:[Classifier:]Extension
没有 classifier 时,示例使用 ::jar;需要覆盖多个 artifact 时,用 | 分隔各个坐标。不同工具接收选项的位置不同:wildfly-maven-plugin 使用 <galleon-options>,Galleon Maven 插件使用 <plugin-options>,provisioning.xml 则使用 <options>。选项格式与配置方式
依赖覆盖发生在服务器 provisioning 过程中。修改配置后,应重新生成服务器安装,正在运行的服务器不会自动替换依赖。
实际处理步骤
- 确认受影响对象:记录 CVE、完整 Maven 坐标、当前版本和修复版本,并确认告警对应的是服务器模块中的依赖,还是应用自行打包的依赖。
- 检查官方修复:查看候选 WildFly 版本的发布说明,确认其中确实包含所需修复,再评估应用升级成本。不能假定下一次补丁一定会修复该 CVE。
- 必要时建立自定义构建:固定 feature-pack、工具和覆盖依赖的版本,在新目录或新镜像中生成服务器,并将配置纳入版本控制。
- 验证实际结果:检查生成的模块引用及实际加载的依赖,测试服务器启动、应用部署,以及 JSON 序列化和反序列化等相关路径,再重新执行漏洞扫描。仅确认 XML 格式正确或构建成功,不足以证明修复有效。
- 准备替换与回退:保留原构建产物和配置。官方修复可用后,评估是否移除临时覆盖,并重新验证。
哪些做法需要避免?
不要把修改应用 pom.xml 中的 Jackson 版本,直接视为服务器模块依赖也已更新。需要核对运行时究竟加载了哪一份类库。
也不建议将手动替换安装目录中的 JAR 作为长期维护方式。把覆盖配置保存在构建流程中,更容易复现、审查和回退。
是否可以等待官方修复,应根据该 CVE 的触发条件、应用暴露面和临时缓解措施决定。如果当前部署可能受到实际攻击,就需要及时采取可验证的修复或缓解措施。
备注:内容仅供参考。
