
Spring Framework CVE-2022-22965 — проверка условий локального воздействия, исправление обновлением версии и повторное тестирование
Данный проект предназначен для изучения и проверки условий влияния, рисков, методов устранения и процесса повторного тестирования после устранения уязвимости CVE-2022-22965 в Spring Framework, также известной как Spring4Shell.
Проект выполнен в локальной авторизованной среде, развёрнутой лично. Основное внимание уделяется не атаке на реальные цели, а поэтапному подтверждению условий, связанных с уязвимостью, путём развёртывания тестовой среды Spring MVC до и после устранения уязвимости, а также безопасному и контролируемому наблюдению в режиме только для чтения за различиями во внутренних путях свойств механизма привязки данных Spring до и после обновления версии.
В рамках проекта выполнены следующие этапы:
Данный проект предназначен исключительно для личной локальной среды или явно авторизованной среды тестирования безопасности.
Проект не направлен на сканирование, разведку и эксплуатацию уязвимостей каких-либо публичных веб-сайтов, серверов или сторонних бизнес-систем и не содержит реальных пользовательских или бизнес-данных.
В ходе тестирования не выполнялись следующие действия:
Запрещается использовать методы тестирования из данного проекта против любых неавторизованных целей.
CVE-2022-22965, обычно называемая Spring4Shell, — это уязвимость удалённого выполнения кода в Spring Framework, связанная с механизмом привязки данных параметров запроса.
Spring MVC поддерживает автоматическую привязку параметров HTTP-запроса к свойствам Java-объектов. Например, в данном проекте параметры имени и электронной почты принимаются следующим образом:
@ModelAttribute("profile") UserProfile profile
В обычных условиях параметры запроса name и email привязываются к объекту UserProfile в соответствии с именами свойств.
В затронутых версиях ограничения доступа к некоторым внутренним путям свойств недостаточно строгие. При использовании JDK 9 или более поздней версии, а также при выполнении определённых условий, связанных с Servlet-контейнером, способом развёртывания и привязкой данных, внешние параметры запроса могут продолжить доступ от обычного бизнес-объекта к внутренним объектам, связанным с Java Class, модулями, загрузчиками классов или контейнером.
В определённых эксплуатируемых средах злоумышленник может дополнительно изменить конфигурацию сервера или записать файлы на сервер, что создаёт риск удалённого выполнения кода.
Данный проект не выполняет полную эксплуатацию удалённого кода, а использует следующий путь свойства для безопасной диагностики различий в режиме только для чтения:
class.module.name
Проект выполнен в личной изолированной экспериментальной среде VMware.
127.0.0.1Тестовые данные штатной функциональности:
Alice[email protected]Путь свойства для диагностики безопасности:
class.module.name
spring4shell-local-verification-lab/
README.md: описание проекта, методика тестирования, результаты проверки и пояснения по устранениюdocs/: отчёт о локальной проверке условий влияния, устранении и повторном тестировании Spring4Shellimages/: скриншоты среды проекта, процесса тестирования и повторного тестированияvulnerable-demo/: проект до устранения на Spring Framework 5.3.17fixed-demo/: проект после устранения на Spring Framework 5.3.18notes/: учебные заметки и записи процессаОсновная структура исходного кода:
config/: классы конфигурации Spring MVC и классы инициализации приложенияcontroller/: контроллер обработки форм и диагностики путей свойствmodel/: класс UserProfile для приёма параметров имени и электронной почтыWEB-INF/views/: JSP-страницы главной страницы, результата отправки и результата диагностикиВ рамках проекта созданы два приложения Spring MVC — до и после устранения уязвимости.
Каталог проекта:
vulnerable-demo
Используемая версия:
Spring Framework 5.3.17
Создаваемый WAR-файл:
spring4shell-vulnerable-demo.war
Адрес доступа:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/
Диагностическая страница:
http://127.0.0.1:8080/spring4shell-vulnerable-demo/binding-probe
Каталог проекта:
fixed-demo
Используемая версия:
Spring Framework 5.3.18
Создаваемый WAR-файл:
spring4shell-fixed-demo.war
Адрес доступа:
http://127.0.0.1:8080/spring4shell-fixed-demo/
Диагностическая страница:
http://127.0.0.1:8080/spring4shell-fixed-demo/binding-probe
Тестовый проект предоставляет простую форму профиля пользователя, содержащую:
Контроллер принимает параметры запроса следующим образом:
@ModelAttribute("profile") UserProfile profile
Когда пользователь отправляет имя и электронную почту, Spring MVC автоматически привязывает параметры name и email к объекту UserProfile.
Страница результата считывает связанный объект и отображает отправленные пользователем имя и адрес электронной почты.
Эта функция используется для подтверждения нормальной работы проекта, а также для доказательства наличия действующей точки входа привязки данных параметров запроса Spring MVC в приложении.
Проект построен по принципу «сначала подтвердить штатную функциональность, затем подтвердить условия влияния, после чего провести диагностику рисков в режиме только для чтения, и наконец устранить уязвимость и провести повторное тестирование».