
Backport da correção de segurança CVE-2020-6950 para Mojarra 2.2.13, fornecendo um JAR jsf-impl corrigido com alterações mínimas e revisáveis para aplicações legadas.
Este repositório contém um backport reproduzível da correção para CVE-2020-6950 no Mojarra 2.2.13.
Ele existe principalmente para fins de rastreabilidade e para manutenção de aplicações legadas que, por razões de compatibilidade, não podem simplesmente ser atualizadas para uma versão mais recente do JSF/Mojarra.
Mojarra é a implementação de referência do JavaServer Faces (JSF), originalmente desenvolvida como parte do ecossistema GlassFish/Java EE e atualmente mantida como o projeto Eclipse Mojarra.
O código-fonte do Mojarra contido neste repositório não é de minha autoria. Todos os créditos e direitos autorais permanecem com os autores e contribuidores originais do Mojarra.
Projeto upstream atual:
Os artefatos não modificados do Mojarra 2.2.13 usados como base para este trabalho foram obtidos do Maven Central.
A correção de segurança usada aqui não foi desenvolvida por mim.
O backport para o Mojarra 2.2.13 foi obtido do pacote Mojarra do , onde é aplicado ao Mojarra 2.2.13.
CVE-2020-6950.patchFonte do pacote openEuler:
O patch original foi mantido para que a origem e a natureza exata da modificação de segurança permaneçam rastreáveis.
Meus agradecimentos vão para os desenvolvedores upstream do Mojarra e para os mantenedores e contribuidores do openEuler que forneceram e publicaram o patch de segurança com backport.
Encontrei uma aplicação legada que ainda depende do Mojarra 2.2.13 e foi afetada pelo CVE-2020-6950.
Atualizar a implementação completa do JSF não era uma opção prática de curto prazo porque a aplicação e seu framework circundante são software legado com restrições significativas de compatibilidade.
Ao mesmo tempo, eu queria que a modificação de segurança fosse:
Por essa razão, reconstruí as classes afetadas por conta própria, em vez de distribuir um binário modificado sem explicação.
Este repositório, portanto, não representa uma implementação independente da correção de segurança. Ele documenta e empacota uma correção publicada existente para uso com o Mojarra 2.2.13.
O patch do CVE-2020-6950 do openEuler modifica três classes do Mojarra:
com/sun/faces/application/resource/ClasspathResourceHelper.java
com/sun/faces/application/resource/ResourceManager.java
com/sun/faces/application/resource/WebappResourceHelper.java
O patch adiciona validação do nome do contrato de recurso usando:
ResourceManager.nameContainsForbiddenSequence(...)
Apenas essas três classes são substituídas no JAR jsf-impl-2.2.13 corrigido.
Uma comparação dos JARs originais e corrigidos descompactados foi realizada para verificar que nenhum outro arquivo difere.
Os fontes originais do Mojarra 2.2.13 foram usados juntamente com o patch CVE publicado do openEuler.
Como reconstruir o ambiente de compilação histórico completo do Mojarra 2.2.13 e suas dependências de compilação antigas adicionaria complexidade desnecessária e tornaria o resultado mais difícil de auditar, apenas as três classes afetadas foram recompiladas.
Elas foram compiladas com OpenJDK 8 usando:
-source 1.5 -target 1.5
Os arquivos de classe resultantes foram verificados para ter:
major version: 49
o que corresponde à versão do bytecode das classes originais do Mojarra 2.2.13.
Os três arquivos de classe resultantes foram então inseridos em uma cópia inalterada do jsf-impl-2.2.13.jar original.
O JAR resultante foi descompactado e comparado com o original.
Apenas estes arquivos diferem:
ClasspathResourceHelper.class
ResourceManager.class
WebappResourceHelper.class
O bytecode resultante foi adicionalmente inspecionado com javap para verificar que ambas as classes auxiliares de recurso contêm a chamada pretendida para:
ResourceManager.nameContainsForbiddenSequence(...)
Todas as três classes de substituição também foram verificadas para manter a versão principal 49 do arquivo de classe Java.
Para aplicações que atualmente usam as bibliotecas Mojarra divididas:
jsf-api-2.2.13.jar
jsf-impl-2.2.13.jar
a substituição relevante produzida por este projeto é:
jsf-impl-2.2.13-patched.jar
O nome do arquivo JAR em si não é significativo para o carregador de classes Java. O sufixo -patched é intencionalmente mantido para que administradores possam distinguir imediatamente a implementação modificada da original.
Não implante os JARs jsf-impl original e corrigido simultaneamente.
Um procedimento de implantação seguro é fazer backup da aplicação existente primeiro, remover o jsf-impl-2.2.13.jar original, implantar o jsf-impl-2.2.13-patched.jar, reiniciar a aplicação/contêiner e verificar tanto a operação normal da aplicação quanto o problema de segurança abordado pelo CVE-2020-6950.
Este repositório é destinado como um backport de compatibilidade/segurança de escopo restrito para instalações legadas do Mojarra 2.2.13.
Ele não é um fork do Mojarra, não é uma nova versão do Mojarra e não é afiliado ou endossado pela Eclipse Foundation, Oracle, GlassFish ou openEuler.
Quando possível, atualizar para uma implementação de JSF/Jakarta Faces atualmente mantida é preferível a manter uma versão antiga do Mojarra com patches de segurança individuais.
Este repositório aborda o CVE específico descrito acima. Ele não deve ser interpretado como tornando o Mojarra 2.2.13 geralmente seguro, atual, mantido ou suportado.
Os usuários permanecem responsáveis por testar o artefato corrigido em seu próprio ambiente antes de implantá-lo em sistemas de produção.
O código-fonte e os binários originais do Mojarra permanecem sujeitos às suas respectivas licenças upstream e avisos de direitos autorais.
O Mojarra 2.2.13 foi distribuído sob os termos de dupla licença GPL v2 / CDDL aplicáveis a essa versão, incluindo a Exceção Classpath GPL onde declarada nos cabeçalhos originais do código-fonte.
O arquivo de licença original do Mojarra está incluído inalterado em:
packager/legal/LICENSE.txt
Os cabeçalhos originais de direitos autorais e licença nos arquivos-fonte do Mojarra foram mantidos.
O patch fornecido pelo openEuler permanece atribuível aos seus respectivos autores e projeto de origem.
Nenhuma propriedade do código original do Mojarra ou da correção do CVE é reivindicada por este repositório.