CSRF(Cross-Site Request Forgery) 공격은 웹 애플리케이션의 신뢰할 수 있는 사용자가 공격자에 의해 의도하지 않은 프로필 업데이트나 메시지 전송과 같은 민감한 작업을 포함해 응용 프로그램의 상태를 변경할 수 있는 모든 행위를 수행하도록 강제할 수 있을 때 발생합니다.
공격자는 사용자/피해자가 권한 있는 작업에 해당하는 링크를 클릭하도록 속이거나 숨겨진 웹 요청이 포함된 악의적인 웹 사이트를 방문하도록 속일 수 있으며 웹 브라우저에는 자동으로 쿠키가 포함되므로 작업이 인증되고 취약할 수 있습니다.
스스로에게 물어보십시오
- 웹 애플리케이션이 유저를 인증할 때 쿠키를 사용합니다.
- 웹 애플리케이션에 사용자가 인증 후에 수행할 수 있는 민감한 작업이 있습니다.
- HTTP POST 또는 HTTP DELETE 과 같은 요청을 수행하여 웹 애플리케이션의 상태/자원을 수정할 수 있습니다.
이러한 상황에 해당되는 경우, CSRF 보호를 비활성화 하는 것은 위험할 수 있습니다.
추천되는 안전한 코딩 관습
- CSRF 공격에 대한 보호를 강하게 권장합니다.
- 안전하지 않은 모든 HTTP 메서드 에 대해 기본적으로 활성화합니다.
- 예측할 수 없는 CSRF 토큰을 구현하는 등의 방법을 사용합니다.
- 물론 모든 민감한 연산들은 GET 과 같은 정보 검색을 위해 고안된 안전한 HTTP 메서드들 로 수행되서는 안됩니다.
취약한 코드의 예
스프링 시큐리티 는 기본적으로 비활성화할 수 있는 CSRF 공격에 대한 보호 기능을 제공합니다.
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); // 취약함: CSRF 보호가 전체적으로 비활성화됩니다.
// or
http.csrf().ignoringAntMatchers("/route/"); // 취약함: CSRF 보호가 특정 경로에 대해 비활성화 됩니다.
}
}
규칙을 준수한 해결책
스프링 시큐리티 의 CSRF 보호는 기본적으로 활성화되어있습니다. 이를 비활성화 하지 마세요.
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// http.csrf().disable(); // Compliant
}
}
참고
- OWASP Top 10 2021 Category A1 - Broken Access Control
- MITRE, CWE-352 - Cross-Site Request Forgery (CSRF)
- OWASP Top 10 2017 Category A6 - Security Misconfiguration
- OWASP: Cross-Site Request Forgery
- SANS Top 25 - Insecure Interaction Between Components
If you like SONARKUBE, don’t forget to give me a star.