Spring Frameworki Spring Core moodulis leiti kriitiline 0-päev haavatavus, mis võimaldab autentimata kaugrünnaku kaudu ründajal käivitada oma koodi serveris. Praegu ei ole selge, kui katastroofilised võivad olla tuvastatud probleemi tagajärjed ning kas rünnakud võivad olla sama massilised kui Log4j 2 haavatavuse puhul. Haavatusele on antud koodnimi Spring4Shell, kuid CVE-ID pole veel määratud. Spring Frameworkis jääb probleem lahendamata ja internetis on juba saadaval mitu töötavat prototüüpi eksploididest (1, 2, 3, 4). Probleemi süvendab see, et paljud ettevõtte Java rakendused, mis põhinevad Spring Frameworkil, töötavad root õigustes ja haavatavus võimaldab süsteemi täielikku kompromiteerimist.
Mõned hinnangud näitavad, et Spring Core moodulit kasutatakse 74% Java rakendustest. Haavatavuse oht väheneb, kuna rünnakule on vastuvõtlikud ainult rakendused, mis kasutavad päringute käsitlejate ühendamisel ja veebivormide parameetrite sidumisel annotatsiooni "@RequestMapping" ning vormaatimist "name=value" (POJO, Plain Old Java Object), mitte JSON/XML-i kasutamise kaudu.
Pole veel selge, millised Java rakendused ja raamistikud on probleemile vastuvõtlikud. Haavatavus blokeerib väljajätmise lisamise musta nimekirja väljadele "class", "module" ja "classLoader" või lubatud väljade selge valge nimekirja kasutamise. Haavatavuse ärakasutamine on võimalik ainult Java/JDK 9 või uuema versiooni kasutamisel. Probleem tuleneb võimalusest mööda minna CVE-2010-1622 haavatavuse kaitset, mis parandati Spring Frameworkis juba 2010. aastal ja mis on seotud classLoaderi käsitleja käitamisega päringu parameetrite töötlemisel.
Eksploiidi töö seisneb päringu saatmises parameetritega «class.module.classLoader.resources.context.parent.pipeline.first.*», mille töötlemine viib Apache Tomcat'i juurkeskkonda jsp-faili loomisele ja ründaja määratud koodi salvestamisele sellesse faili. Loodud fail on otseste päringute jaoks saadaval ja seda võib kasutada web shellina. Ründamiseks haavatavale rakendusele Apache Tomcat'i keskkonnas piisab päringu saatmisest kindlate parameetritega kasutades utiliiti curl. curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=kodeeritud_kood_faili_sisemiseks&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
Käsitletavat probleemi Spring Core'is ei tohiks segi ajada hiljuti avastatud haavatavustega CVE-2022-22963 ja CVE-2022-22950. Esimene probleem puudutab Spring Cloud paketti ja on kõrvaldatud väljaannetes 3.1.7 ja 3.2.3. Teine probleem on olemas Spring Expression'is ja on parandatud Spring Framework'is 5.3.17. Need on põhimõtteliselt erinevad haavatavused. Uue haavatavuse kohta pole Spring Framework'i arendajatel veel ühtegi avaldust tehtud ega parandust välja antud.
Ajutise meetmena kaitseks soovitatakse kasutada koodis keeldude nimekirja lubamatute päringupäringute parameetrite jaoks: 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); } }
Allikas: opennet.ru
