Код-ревью Senior Spring Security обновлено

Код-ревью: конфигурация безопасности

Вопрос

Найдите уязвимости в конфигурации и коде.

@Configuration
@EnableMethodSecurity
public class SecurityConfig {
    @Bean
    SecurityFilterChain chain(HttpSecurity http) throws Exception {
        return http
            .csrf(c -> c.disable())
            .cors(c -> c.configurationSource(req -> {
                CorsConfiguration cfg = new CorsConfiguration();
                cfg.addAllowedOriginPattern("*");
                cfg.setAllowCredentials(true);
                cfg.addAllowedMethod("*");
                return cfg;
            }))
            .authorizeHttpRequests(a -> a
                .requestMatchers("/api/**").authenticated()
                .requestMatchers("/api/admin/**").hasRole("ADMIN")
                .requestMatchers("/actuator/**").permitAll()
                .anyRequest().permitAll())
            .formLogin(Customizer.withDefaults())
            .build();
    }

    @Bean
    PasswordEncoder encoder() {
        return NoOpPasswordEncoder.getInstance();
    }
}

Коротко

Конфигурация безопасности должна закрывать всё по умолчанию и открывать точечно, узкие правила ставятся выше широких. CSRF выключают только для чисто токенного API, CORS разрешает конкретные origin, пароли хранятся хешем BCrypt или Argon2, Actuator закрыт.

Что должен найти ревьюер

  1. Безопасностьстрока 7
    CSRF выключен, хотя используется formLogin с сессионной cookie: сайт-злоумышленник сможет отправлять изменяющие запросы от имени пользователя.
  2. Безопасностьстрока 10
    Любой origin с credentials: любой сайт сможет делать запросы с cookie пользователя и читать ответы. Нужен список доверенных origin.
  3. Безопасностьстрока 16
    Широкое правило /api/** стоит выше /api/admin/**: админские эндпоинты доступны любому вошедшему.
  4. Безопасностьстрока 18
    Все эндпоинты Actuator открыты без аутентификации, включая env и heapdump.
  5. Безопасностьстрока 19
    anyRequest().permitAll(): всё, что не перечислено, открыто. Безопаснее закрывать по умолчанию.
  6. Безопасностьстрока 26
    NoOpPasswordEncoder хранит пароли открытым текстом. Нужен BCrypt или делегирующий encoder.

Разбор

Конфигурация безопасности должна закрывать всё по умолчанию и открывать точечно, узкие правила ставятся выше широких. CSRF выключают только для чисто токенного API, CORS разрешает конкретные origin, пароли хранятся хешем BCrypt или Argon2, Actuator закрыт.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.