È stata individuata una vulnerabilità critica 0-day nel modulo Spring Core, fornito all'interno del framework Spring Framework, che consente a un attaccante remoto non autenticato di eseguire codice sul server. Al momento non è chiaro quanto possano essere catastrofiche le conseguenze di questo problema e se gli attacchi saranno altrettanto massicci come nel caso della vulnerabilità di Log4j 2. La vulnerabilità è stata soprannominata Spring4Shell, ma non è stato ancora assegnato un identificatore CVE. Nel Spring Framework, il problema resta irrisolto e sono già disponibili in rete diversi prototipi funzionanti di exploit (1, 2, 3, 4). La questione è aggravata dal fatto che molte applicazioni Java aziendali basate su Spring Framework vengono eseguite con privilegi di root, e la vulnerabilità consente di compromettere completamente il sistema.
Secondo alcune stime, il modulo Spring Core è utilizzato nel 74% delle applicazioni Java. Il pericolo della vulnerabilità è attenuato dal fatto che solo le applicazioni che utilizzano l'annotazione «@RequestMapping» durante la connessione dei gestori di richieste e la binding dei parametri delle web form nel formato «name=value» (POJO, Plain Old Java Object), sono vulnerabili, anziché quelle che utilizzano JSON/XML.
Non è ancora chiaro quali specifici applicativi Java e framework siano soggetti al problema. La vulnerabilità impedisce l'aggiunta alla blacklist dei campi "class", "module" e "classLoader", o l'utilizzo di un esplicito elenco bianco di campi consentiti. L'exploit della vulnerabilità è possibile solo utilizzando Java/JDK 9 o una versione successiva. Il problema è causato dalla possibilità di eludere le protezioni della vulnerabilità CVE-2010-1622, corretta nel Spring Framework già nel 2010 e relativa all'esecuzione di un gestore classLoader durante l'analisi dei parametri della richiesta.
Il funzionamento dell'exploit consiste nell'inviare una richiesta con i parametri «class.module.classLoader.resources.context.parent.pipeline.first.*», il cui elaborato porta alla creazione di un file jsp nell'ambiente root di Apache Tomcat e alla scrittura nel file del codice specificato dall'attaccante. Il file creato diventa accessibile per richieste dirette e può essere utilizzato come web shell. Per attaccare un'applicazione vulnerabile in un ambiente Apache Tomcat, è sufficiente inviare una richiesta con determinati parametri utilizzando l'utilità curl. curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=codice_da_inserire_nel_file &class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp &class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT &class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar &class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=» http://localhost:8080/springmvc5-helloworld-exmaple-0.0.1-SNAPSHOT/rapid7
Il problema discusso in Spring Core non deve essere confuso con le vulnerabilità recentemente scoperte CVE-2022-22963 e CVE-2022-22950. La prima vulnerabilità riguarda il pacchetto Spring Cloud ed è stata risolta nelle versioni 3.1.7 e 3.2.3. La seconda vulnerabilità è presente in Spring Expression ed è stata corretta in Spring Framework 5.3.17. Si tratta di vulnerabilità completamente diverse. Gli sviluppatori di Spring Framework non hanno ancora rilasciato dichiarazioni sulla nuova vulnerabilità né pubblicato una correzione.
In via temporanea, per protezione, è consigliabile utilizzare un elenco di esclusione dei parametri di richiesta non validi nel codice: import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.InitBinder; @ControllerAdvice @Order(10000) public class BinderControllerAdvice { @InitBinder public void setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{"class.", "Class.", ".class.", ".Class."}; dataBinder.setDisallowedFields(denylist); } }
Fonte: opennet.ru
