
Backport del fix di sicurezza CVE-2020-6950 a Mojarra 2.2.13, che fornisce un JAR jsf-impl patchato con modifiche minime e verificabili per applicazioni legacy.
Questo repository contiene un backport riproducibile della correzione per CVE-2020-6950 su Mojarra 2.2.13.
Esiste principalmente per scopi di tracciabilità e per la manutenzione di applicazioni legacy che, per motivi di compatibilità, non possono essere semplicemente aggiornate a una versione più recente di JSF/Mojarra.
Mojarra è l'implementazione di riferimento di JavaServer Faces (JSF), originariamente sviluppata come parte dell'ecosistema GlassFish/Java EE e ora mantenuta come progetto Eclipse Mojarra.
Il codice sorgente di Mojarra contenuto in questo repository non è opera mia. Tutti i crediti e i diritti d'autore rimangono agli autori e contributori originali di Mojarra.
Progetto upstream attuale:
Gli artefatti Mojarra 2.2.13 non modificati utilizzati come base per questo lavoro sono stati ottenuti da Maven Central.
La correzione di sicurezza qui utilizzata non è stata sviluppata da me.
Il backport per Mojarra 2.2.13 è stato ottenuto dal pacchetto Mojarra di openEuler, dove CVE-2020-6950.patch viene applicato a Mojarra 2.2.13.
Sorgente del pacchetto openEuler:
La patch originale è stata conservata affinché l'origine e la natura esatta della modifica di sicurezza rimangano tracciabili.
I miei ringraziamenti vanno agli sviluppatori upstream di Mojarra e ai manutentori e contributori di openEuler che hanno fornito e pubblicato la patch di sicurezza backportata.
Mi sono imbattuto in un'applicazione legacy che dipende ancora da Mojarra 2.2.13 ed era affetta da CVE-2020-6950.
L'aggiornamento dell'intera implementazione JSF non era un'opzione pratica a breve termine perché l'applicazione e il suo framework circostante sono software legacy con vincoli di compatibilità significativi.
Allo stesso tempo, volevo che la modifica di sicurezza fosse:
Per questo motivo ho ricompilato io stesso le classi interessate piuttosto che distribuire un binario modificato non spiegato.
Questo repository quindi non rappresenta un'implementazione indipendente della correzione di sicurezza. Documenta e impacchetta una correzione pubblicata esistente per l'uso con Mojarra 2.2.13.
La patch openEuler per CVE-2020-6950 modifica tre classi di Mojarra:
com/sun/faces/application/resource/ClasspathResourceHelper.java
com/sun/faces/application/resource/ResourceManager.java
com/sun/faces/application/resource/WebappResourceHelper.java
La patch aggiunge la validazione del nome del contratto di risorsa utilizzando:
ResourceManager.nameContainsForbiddenSequence(...)
Solo queste tre classi vengono sostituite nel JAR jsf-impl-2.2.13 patchato.
È stato eseguito un confronto tra il JAR originale e quello patchato, entrambi estratti, per verificare che nessun altro file differisca.
I sorgenti originali di Mojarra 2.2.13 sono stati utilizzati insieme alla patch CVE pubblicata da openEuler.
Poiché ricostruire il completo ambiente di compilazione storico di Mojarra 2.2.13 e le sue vecchie dipendenze di build avrebbe aggiunto complessità inutile e reso il risultato più difficile da verificare, sono state ricompilate solo le tre classi interessate.
Sono state compilate con OpenJDK 8 utilizzando:
-source 1.5 -target 1.5
I file di classe risultanti sono stati verificati per avere:
major version: 49
che corrisponde alla versione bytecode delle classi originali di Mojarra 2.2.13.
I tre file di classe risultanti sono stati quindi inseriti in una copia per il resto invariata del jsf-impl-2.2.13.jar originale.
Il JAR risultante è stato estratto e confrontato con l'originale.
Solo questi file differiscono:
ClasspathResourceHelper.class
ResourceManager.class
WebappResourceHelper.class
Il bytecode risultante è stato inoltre ispezionato con javap per verificare che entrambe le classi helper delle risorse contengano la chiamata prevista a:
ResourceManager.nameContainsForbiddenSequence(...)
Tutte e tre le classi sostitutive sono state anche verificate per mantenere la major version 49 dei file di classe Java.
Per le applicazioni che attualmente utilizzano le librerie Mojarra separate:
jsf-api-2.2.13.jar
jsf-impl-2.2.13.jar
la sostituzione pertinente prodotta da questo progetto è:
jsf-impl-2.2.13-patched.jar
Il nome del file JAR di per sé non è significativo per il class loader Java. Il suffisso -patched è mantenuto intenzionalmente affinché gli amministratori possano distinguere immediatamente l'implementazione modificata da quella originale.
Non distribuire simultaneamente il JAR jsf-impl originale e quello patchato.
Una procedura di distribuzione sicura consiste nel eseguire prima un backup dell'applicazione esistente, rimuovere il jsf-impl-2.2.13.jar originale, distribuire jsf-impl-2.2.13-patched.jar, riavviare l'applicazione/contenitore e verificare sia il normale funzionamento dell'applicazione sia il problema di sicurezza affrontato da CVE-2020-6950.
Questo repository è inteso come un backport di compatibilità/sicurezza strettamente mirato per installazioni legacy di Mojarra 2.2.13.
Non è un fork di Mojarra, non è una nuova release di Mojarra e non è affiliato o approvato da Eclipse Foundation, Oracle, GlassFish o openEuler.
Dove possibile, l'aggiornamento a un'implementazione JSF/Jakarta Faces attualmente mantenuta è preferibile al mantenimento di una vecchia release di Mojarra con patch di sicurezza individuali.
Questo repository affronta la specifica CVE descritta sopra. Non deve essere interpretato come un rendere Mojarra 2.2.13 generalmente sicuro, aggiornato, mantenuto o supportato.
Gli utenti rimangono responsabili del test dell'artefatto patchato nel proprio ambiente prima di distribuirlo in produzione.
Il codice sorgente e i binari originali di Mojarra rimangono soggetti alle rispettive licenze upstream e agli avvisi di copyright.
Mojarra 2.2.13 è stato distribuito con i termini di doppia licenza GPL v2 / CDDL applicabili a quella release, inclusa l'eccezione Classpath GPL dove indicata negli header dei sorgenti originali.
Il file di licenza originale di Mojarra è incluso invariato in:
packager/legal/LICENSE.txt
Gli header di copyright e licenza originali nei file sorgente di Mojarra sono stati mantenuti.
La patch fornita da openEuler rimane attribuibile ai rispettivi autori e al progetto sorgente.
Nessuna proprietà del codice originale di Mojarra o della correzione CVE è rivendicata da questo repository.