
Проект, демонстрирующий приложение, уязвимое к обходу авторизации Spring Security CVE-2022-31692
Простое приложение Spring Boot, демонстрирующее конфигурацию, уязвимую к CVE-2022-31692.
Эта уязвимость может привлечь внимание из-за своей серьёзности — она имеет базовую оценку CVSS 3.x 9,8, поскольку позволяет обойти аутентификацию. Цель этого проекта — продемонстрировать условия, описанные в рекомендациях, которые делают уязвимость применимой.
AuthorizationFilter либо вручную, либо через метод authorizeHttpRequests().FilterChainProxy так, чтобы он применялся к forward и/или include запросам (например, spring.security.filter.dispatcher-types = request, error, async, forward, include).authorizeHttpRequests().shouldFilterAllDispatcherTypes(true)Для справки, я почти уверен, что этот коммит устраняет эту уязвимость.
Приложение имеет три URL:
/ — главная страница/admin — страница администратора, требующая от пользователя Basic-аутентификации (учётные данные "user"/"pass") и наличия роли ROLE_ADMIN/forward — серверный forward на страницу администратораКонтроль доступа задаётся через authorizeHttpRequests() в классе SecurityConfig.
.authorizeHttpRequests((authz) -> authz
.antMatchers("/").permitAll()
.antMatchers("/forward").permitAll()
.antMatchers("/admin").hasAuthority("ROLE_ADMIN")
.shouldFilterAllDispatcherTypes(true)
)
Пользователь обращается к / и не аутентифицирован (благодаря permitAll())
Пользователь обращается к /admin. Он не предоставляет аутентификацию, и запрос отклоняется (401 Not authorized).
Пользователь обращается к /admin. Он предоставляет действительную аутентификацию, но запрос всё равно отклоняется (403 Unauthorised),
поскольку у него нет требуемой роли .hasAuthority("ROLE_ADMIN").
Пользователь обращается к /forward. Его запрос проходит через цепочку фильтров безопасности для GET /forward, который проходит
как допустимый (благодаря permitAll()). Контроллер обрабатывает запрос и возвращает forward:/admin диспетчеру.
Согласно настройкам spring.security.filter.dispatcher-types и .shouldFilterAllDispatcherTypes(true),
это тип FORWARD, поэтому он должен снова пройти через цепочку фильтров. Этот второй проход через фильтр приводит
к отклонению запроса (снова, благодаря hasAuthority("ROLE_ADMIN")).
Пользователь обращается к /forward, запрос проходит через цепочку фильтров один раз и проходит как допустимый. Forward
обрабатывается, но вместо повторного прохождения через цепочку он просто проходит как допустимый, и возвращается
страница администратора.