本仓库包含针对 CVE-2020-6950 修复到 Mojarra 2.2.13 的可复现向后移植。
其存在主要用于可追溯性以及维护那些出于兼容性原因无法直接升级到更新 JSF/Mojarra 版本的遗留应用程序。
Mojarra 是 JavaServer Faces (JSF) 的参考实现,最初作为 GlassFish/Java EE 生态系统的一部分开发,现由 Eclipse Mojarra 项目维护。
本仓库中包含的 Mojarra 源代码并非我的作品。所有版权归原始 Mojarra 作者和贡献者所有。
当前上游项目:
作为本工作基础的未修改 Mojarra 2.2.13 构件来自 Maven Central。
此处使用的安全修复并非由我开发。
针对 Mojarra 2.2.13 的向后移植来自 openEuler Mojarra 软件包,其中 CVE-2020-6950.patch 被应用于 Mojarra 2.2.13。
openEuler 软件包源码:
原始补丁已被保留,以便安全修改的来源和确切性质保持可追溯。
感谢上游 Mojarra 开发者以及提供并发布向后移植安全补丁的 openEuler 维护者和贡献者。
我遇到了一个仍依赖 Mojarra 2.2.13 并受 CVE-2020-6950 影响的遗留应用程序。
升级完整的 JSF 实现并非短期内可行的方案,因为该应用程序及其周边框架是具有显著兼容性约束的遗留软件。
同时,我希望安全修改具备以下特性:
因此,我自行重新构建了受影响的类,而不是分发未经解释的修改后二进制文件。
因此,本仓库并不代表对安全修复的独立实现。它记录并打包了一个已发布的现有修复,用于 Mojarra 2.2.13。
openEuler CVE-2020-6950 补丁修改了三个 Mojarra 类:
com/sun/faces/application/resource/ClasspathResourceHelper.java
com/sun/faces/application/resource/ResourceManager.java
com/sun/faces/application/resource/WebappResourceHelper.java
该补丁使用以下方法添加了资源契约名称的验证:
ResourceManager.nameContainsForbiddenSequence(...)
在修补后的 jsf-impl-2.2.13 JAR 中仅替换了这三个类。
对解压后的原始 JAR 和修补后 JAR 进行了比较,以验证没有其他文件存在差异。
原始 Mojarra 2.2.13 源码与已发布的 openEuler CVE 补丁一起使用。
由于重建完整的历史 Mojarra 2.2.13 构建环境及其旧版构建依赖会增加不必要的复杂性并使结果更难审计,因此仅重新编译了三个受影响的类。
它们使用 OpenJDK 8 编译,参数为:
-source 1.5 -target 1.5
生成的类文件经验证具有:
主版本号:49
这与原始 Mojarra 2.2.13 类的字节码版本一致。
随后将生成的三个类文件插入到原始 jsf-impl-2.2.13.jar 的未修改副本中。
对生成的 JAR 进行解压并与原始版本进行比较。
仅以下文件存在差异:
ClasspathResourceHelper.class
ResourceManager.class
WebappResourceHelper.class
此外,使用 javap 检查了生成的字节码,以验证两个资源辅助类都包含预期的调用:
ResourceManager.nameContainsForbiddenSequence(...)
所有三个替换类也经验证保留了 Java 类文件主版本号 49。
对于当前使用拆分 Mojarra 库的应用程序:
jsf-api-2.2.13.jar
jsf-impl-2.2.13.jar
本项目生成的相关替换文件为:
jsf-impl-2.2.13-patched.jar
JAR 文件名本身对 Java 类加载器并不重要。-patched 后缀被有意保留,以便管理员能够立即区分修改后的实现与原始实现。
请勿同时部署原始和修补后的 jsf-impl JAR。
安全的部署流程是:先备份现有应用程序,移除原始 jsf-impl-2.2.13.jar,部署 jsf-impl-2.2.13-patched.jar,重启应用程序/容器,并验证应用程序正常运行以及 CVE-2020-6950 所解决的安全问题。
本仓库旨在作为遗留 Mojarra 2.2.13 安装的窄范围兼容性/安全向后移植。
它不是 Mojarra 的分支,不是新的 Mojarra 版本,也与 Eclipse 基金会、Oracle、GlassFish 或 openEuler 无关联或未经其认可。
在可能的情况下,升级到当前维护的 JSF/Jakarta Faces 实现优于使用单独安全补丁维护旧版 Mojarra 版本。
本仓库仅解决上述特定 CVE。它不应被解释为使 Mojarra 2.2.13 普遍安全、最新、受维护或受支持。
用户仍需负责在部署到生产系统之前,在自己的环境中测试修补后的构件。
原始 Mojarra 源代码和二进制文件仍受其各自上游许可证和版权声明的约束。
Mojarra 2.2.13 根据适用于该版本的 GPL v2 / CDDL 双许可证条款分发,包括原始源代码头文件中声明的 GPL Classpath Exception。
原始 Mojarra 许可证文件未修改地包含在:
packager/legal/LICENSE.txt
Mojarra 源文件中的原始版权和许可证头已被保留。
openEuler 提供的补丁仍归属于其各自的作者和源项目。
本仓库不主张对原始 Mojarra 代码或 CVE 修复的任何所有权。