В модула Spring Core, предоставен в рамките на фреймворка Spring Framework, е открита критична 0-day уязвимост, позволяваща на неавтентифициран отдалечен атакуващ да изпълни своя код на сървъра. Все още не е ясно колко катастрофални могат да бъдат последиците от открития проблем и дали атаките ще бъдат толкова масови, колкото в случая с уязвимостта в Log4j 2. На уязвимостта е присвоено кодово име Spring4Shell, но CVE-идентификатор все още не е назначен. В Spring Framework проблемът остава неизправен и в интернет вече има няколко работещи прототипа на експлоити (1, 2, 3, 4). Проблемът се задълбочава от факта, че много корпоративни Java-приложения, базирани на Spring Framework, работят с права root и уязвимостта позволява пълно компрометиране на системата.
Според някои оценки модулът Spring Core се използва в 74% от Java-приложенията. Опасността от уязвимостта е намалена, тъй като атаката е уязвима само за приложения, които използват анотацията «@RequestMapping» при свързването на обработчици на заявки и обвързването на параметри на уеб формуляри в формат «name=value» (POJO, Plain Old Java Object), вместо да използват JSON/XML.
Все още не е ясно какви точно Java-приложения и фреймворкове са подложени на проблема. Уязвимостта блокира добавянето на полета «class», «module» и «classLoader» в черния списък, или използването на изричен бял списък на разрешените полета. Експлоатацията на уязвимостта е възможна само при използване на Java/JDK 9 или по-нова версия. Проблемът е породен от възможността за заобикаляне на защитата от уязвимостта CVE-2010-1622, поправена в Spring Framework още през 2010 година и свързана с изпълнението на обработчик classLoader при анализ на параметрите на заявката.
Работата на експлойта се състои в изпращане на заявка с параметри «class.module.classLoader.resources.context.parent.pipeline.first.*», чиято обработка води до създаването на jsp файл в кореновата среда на Apache Tomcat и записването на указания от атакуващия код в този файл. Създаденият файл става достъпен за директни заявки и може да се използва като web shell. За атака върху уязвимо приложение в средата на Apache Tomcat е достатъчно да се изпрати заявка с определени параметри чрез утилитата curl. curl -v -d «class.module.classLoader.resources.context.parent.pipeline.first.pattern=код_за_вставяне_в_файл &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
Проблемът в Spring Core не бива да се бърка с наскоро установените уязвимости CVE-2022-22963 и CVE-2022-22950. Първата проблема засяга пакета Spring Cloud и е отстранена в версиите 3.1.7 и 3.2.3. Втората проблема присъства в Spring Expression и е поправена в Spring Framework 5.3.17. Това са принципно различни уязвимости. За новата уязвимост разработчиците на Spring Framework все още не са направили никакви съобщения и не са публикували поправка.
Като временна мярка за защита се препоръчва в кода да се използва черен списък на недопустимите параметри на заявката: 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); } }
Източник: opennet.ru
