
Backport de la corrección de seguridad CVE-2020-6950 a Mojarra 2.2.13, que proporciona un JAR jsf-impl parcheado con cambios mínimos y revisables para aplicaciones heredadas.
Este repositorio contiene un backport reproducible de la corrección para CVE-2020-6950 a Mojarra 2.2.13.
Existe principalmente con fines de trazabilidad y para el mantenimiento de aplicaciones heredadas que, por razones de compatibilidad, no pueden simplemente actualizarse a una versión más reciente de JSF/Mojarra.
Mojarra es la implementación de referencia de JavaServer Faces (JSF), desarrollada originalmente como parte del ecosistema GlassFish/Java EE y ahora mantenida como el proyecto Eclipse Mojarra.
El código fuente de Mojarra contenido en este repositorio no es obra mía. Todo el crédito y los derechos de autor pertenecen a los autores y colaboradores originales de Mojarra.
Proyecto upstream actual:
Los artefactos sin modificar de Mojarra 2.2.13 utilizados como base para este trabajo se obtuvieron de Maven Central.
La corrección de seguridad utilizada aquí no fue desarrollada por mí.
El backport para Mojarra 2.2.13 se obtuvo del paquete Mojarra de , donde se aplica a Mojarra 2.2.13.
CVE-2020-6950.patchFuente del paquete openEuler:
El parche original se ha conservado para que el origen y la naturaleza exacta de la modificación de seguridad permanezcan trazables.
Mi agradecimiento a los desarrolladores upstream de Mojarra y a los mantenedores y colaboradores de openEuler que proporcionaron y publicaron el parche de seguridad backportado.
Me encontré con una aplicación heredada que aún depende de Mojarra 2.2.13 y estaba afectada por CVE-2020-6950.
Actualizar la implementación completa de JSF no era una opción práctica a corto plazo porque la aplicación y su framework circundante son software heredado con importantes restricciones de compatibilidad.
Al mismo tiempo, quería que la modificación de seguridad fuera:
Por esa razón, reconstruí las clases afectadas yo mismo en lugar de distribuir un binario modificado sin explicación.
Este repositorio, por tanto, no representa una implementación independiente de la corrección de seguridad. Documenta y empaqueta una corrección publicada existente para su uso con Mojarra 2.2.13.
El parche de openEuler para CVE-2020-6950 modifica tres clases de Mojarra:
com/sun/faces/application/resource/ClasspathResourceHelper.java
com/sun/faces/application/resource/ResourceManager.java
com/sun/faces/application/resource/WebappResourceHelper.java
El parche añade validación del nombre del contrato de recurso utilizando:
ResourceManager.nameContainsForbiddenSequence(...)
Solo estas tres clases se reemplazan en el JAR parcheado jsf-impl-2.2.13.
Se realizó una comparación de los JAR original y parcheado desempaquetados para verificar que no difiere ningún otro archivo.
Se utilizaron las fuentes originales de Mojarra 2.2.13 junto con el parche CVE publicado de openEuler.
Dado que reconstruir el entorno de compilación histórico completo de Mojarra 2.2.13 y sus antiguas dependencias de compilación añadiría complejidad innecesaria y dificultaría la auditoría del resultado, solo se recompilaron las tres clases afectadas.
Se compilaron con OpenJDK 8 utilizando:
-source 1.5 -target 1.5
Se verificó que los archivos de clase resultantes tuvieran:
major version: 49
lo que coincide con la versión de bytecode de las clases originales de Mojarra 2.2.13.
Los tres archivos de clase resultantes se insertaron luego en una copia sin modificar del jsf-impl-2.2.13.jar original.
El JAR resultante se desempaquetó y se comparó con el original.
Solo difieren estos archivos:
ClasspathResourceHelper.class
ResourceManager.class
WebappResourceHelper.class
El bytecode resultante se inspeccionó adicionalmente con javap para verificar que ambas clases auxiliares de recursos contienen la llamada prevista a:
ResourceManager.nameContainsForbiddenSequence(...)
También se verificó que las tres clases de reemplazo conservan la versión principal 49 de archivo de clase Java.
Para aplicaciones que actualmente utilizan las bibliotecas Mojarra divididas:
jsf-api-2.2.13.jar
jsf-impl-2.2.13.jar
el reemplazo relevante producido por este proyecto es:
jsf-impl-2.2.13-patched.jar
El nombre del archivo JAR no es significativo para el cargador de clases de Java. El sufijo -patched se conserva intencionadamente para que los administradores puedan distinguir inmediatamente la implementación modificada de la original.
No despliegue simultáneamente los JAR jsf-impl original y parcheado.
Un procedimiento de despliegue seguro consiste en hacer una copia de seguridad de la aplicación existente, eliminar el jsf-impl-2.2.13.jar original, desplegar jsf-impl-2.2.13-patched.jar, reiniciar la aplicación/contenedor y verificar tanto el funcionamiento normal de la aplicación como el problema de seguridad abordado por CVE-2020-6950.
Este repositorio está pensado como un backport de compatibilidad/seguridad de alcance limitado para instalaciones heredadas de Mojarra 2.2.13.
No es un fork de Mojarra, ni una nueva versión de Mojarra, y no está afiliado ni respaldado por Eclipse Foundation, Oracle, GlassFish u openEuler.
Cuando sea posible, actualizar a una implementación de JSF/Jakarta Faces actualmente mantenida es preferible a mantener una versión antigua de Mojarra con parches de seguridad individuales.
Este repositorio aborda el CVE específico descrito anteriormente. No debe interpretarse como que hace que Mojarra 2.2.13 sea generalmente seguro, actual, mantenido o soportado.
Los usuarios siguen siendo responsables de probar el artefacto parcheado en su propio entorno antes de desplegarlo en sistemas de producción.
El código fuente y los binarios originales de Mojarra siguen sujetos a sus respectivas licencias upstream y avisos de derechos de autor.
Mojarra 2.2.13 se distribuyó bajo los términos de doble licencia GPL v2 / CDDL aplicables a esa versión, incluida la Excepción Classpath de GPL cuando se indica en los encabezados de las fuentes originales.
El archivo de licencia original de Mojarra se incluye sin cambios en:
packager/legal/LICENSE.txt
Los encabezados originales de derechos de autor y licencia en los archivos fuente de Mojarra se han conservado.
El parche proporcionado por openEuler sigue siendo atribuible a sus respectivos autores y proyecto fuente.
Este repositorio no reclama propiedad alguna sobre el código original de Mojarra ni sobre la corrección del CVE.