과도하게 허용된 CORS 설정 (Permissive CORS)

Permissive Cross-Domain Policy with Untrusted Domains

설명

Cross-Origin Resource Sharing(CORS)은 웹 브라우저가 다른 출처(origin)의 리소스를 요청할 수 있도록 허용하는 정책입니다. 잘못된 CORS 설정을 사용하면 공격자가 악의적인 웹사이트에서 사용자의 인증 정보를 포함한 요청을 전송하도록 유도할 수 있습니다. 특히, Access-Control-Allow-Origin 값을 사용자 입력을 기반으로 동적으로 설정하는 경우, 공격자가 이를 조작하여 악성 사이트로 세션 쿠키나 민감한 정보를 전송할 수 있습니다.

잠재적 영향

  • 인증 정보 탈취: 공격자가 악성 사이트에서 사용자의 세션 쿠키를 포함한 요청을 보내도록 유도할 수 있습니다.

  • 권한 없는 리소스 접근: 공격자가 CORS 설정을 악용하여 원래 허용되지 않은 리소스를 요청할 수 있습니다.

  • Cross-Site Scripting(XSS) 공격 강화: CORS와 XSS가 결합되면 공격자가 사용자의 계정으로 API 요청을 실행할 수 있습니다.

해결 방법

  1. 정해진 허용 목록(Whitelist)만 사용하기

    • Access-Control-Allow-Origin 헤더를 신뢰할 수 있는 도메인만 반환하도록 설정합니다.

    • *(wildcard)를 사용하지 않도록 합니다.

  2. 사용자 입력값을 기반으로 CORS 설정을 동적으로 변경하지 않기

    • HttpServletResponse.setHeader("Access-Control-Allow-Origin", userInput) 과 같은 코드를 사용하지 않습니다.

  3. 정적 또는 신뢰할 수 있는 출처만 허용하기

    • 사전에 정의된 허용된 출처 목록을 사용하고, 요청된 도메인이 목록에 포함된 경우에만 Access-Control-Allow-Origin을 설정합니다.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드:

    • 사용자 입력값을 직접 Access-Control-Allow-Origin에 설정하여 공격자가 악의적인 도메인을 설정할 수 있음.

  • 안전한 코드:

    • 허용된 도메인 목록을 미리 정의하고, 요청된 Origin 값이 목록에 포함된 경우에만 CORS를 허용.

참조

Last updated