V modulu Spring Core, ki je del ogrodja Spring Framework, je bila odkrita kritična 0-day ranljivost, ki nepooblaščenemu oddaljenemu napadalcu omogoča izvajanje svojega kode na strežniku. Še ni jasno, kakšne katastrofalne posledice lahko prinese odkrita težava, in ali bodo napadi tako množični kot pri ranljivosti v Log4j 2. Ranljivosti je dodeljeno kodno ime Spring4Shell, vendar CVE-identifikator še ni dodeljen. V Spring Framework težava ostaja rešena in v omrežju je že na voljo več delujočih prototipov eksploitatov (1, 2, 3, 4). Težavo poslabša dejstvo, da mnoge korporativne Java-aplikacije, zgrajene na Spring Framework, delujejo s pravicami root, ranljivost pa omogoča popolno kompromitacijo sistema.
Po nekaterih ocenah se modul Spring Core uporablja v 74% Java-aplikacij. Nevarnost ranljivosti zmanjša dejstvo, da so napadu izpostavljene samo aplikacije, ki uporabljajo anotacijo „@RequestMapping“ pri povezovanju obdelovalnikov zahtevkov in vezavi parametrov spletnih obrazcev v formatu „name=value“ (POJO, Plain Old Java Object), namesto uporabe JSON/XML.
Katere Java-aplikacije in ogrodja točno so izpostavljena težavi, še ni jasno. Ranljivost onemogoča dodajanje v črno listo polj „class“, „module“ in „classLoader“ ali uporabo izrecnega belega seznama dovoljenih polj. Izkoriščanje ranljivosti je možno le pri uporabi Java/JDK 9 ali novejših različic. Težavo povzroča možnost obvoda zaščite pred ranljivostjo CVE-2010-1622, ki je bila odpravljena v Spring Frameworku že leta 2010 in je povezana z izvajanjem obdelovalca classLoader pri razčlenjevanju parametrov poizvedbe.
Delovanje exploita se svodi na pošiljanje zahteve s parametri „class.module.classLoader.resources.context.parent.pipeline.first.*“, katerih obdelava vodi do ustvarjanja jsp datoteke v korenskem okolju Apache Tomcat in vnosa napadalčevega kode v to datoteko. Ustvarjena datoteka postane dostopna za neposredne zahteve in se lahko uporablja kot web shell. Za napad na ranljivo aplikacijo v okolju Apache Tomcat je dovolj, da pošljete zahtevo s posebnimi parametri z orodjem curl. curl -v -d „class.module.classLoader.resources.context.parent.pipeline.first.pattern=koda_za_vstavljanje_v_datoteko &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
Obravnavane težave v Spring Core ne gre zamenjati z nedavno odkrito ranljivostjo CVE-2022-22963 in CVE-2022-22950. Prva težava zadeva paket Spring Cloud in je bila odpravljena v izdajah 3.1.7 in 3.2.3. Druga težava je prisotna v Spring Expression in je bila popravljena v Spring Framework 5.3.17. To so načeloma druge ranljivosti. O novi ranljivosti razvijalci Spring Framework še niso izdali nobenih izjav in niso objavili popravkov.
Kot začasna rešitev za zaščito se priporoča uporaba črnega seznama nedovoljenih parametrov zahtevka v kodi: 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); } }
Izvor: opennet.ru
