CORS 자격 증명 null Origin 허용

CORS Misconfiguration (Allow-Credentials with null Origin)

설명

서버가 Access-Control-Allow-Credentials: true를 설정하면서 Access-Control-Allow-Origin에 'null'을 사용하거나, 요청의 Origin을 검증 없이 반영하면 발생하는 취약점입니다. sandbox iframe, data: URL 등에서 발생하는 null Origin을 공격자가 제어할 수 있어, 자격 증명(쿠키, 인증 헤더)이 자동으로 포함된 요청의 응답을 공격자가 읽을 수 있습니다. 공격자는 악성 페이지에서 sandbox된 iframe을 만들어 피해 사이트로 요청을 보내고, 서버가 'null'을 허용하면 민감한 응답 데이터가 공격자 스크립트에 노출됩니다.

잠재적 영향

  • 인증된 데이터 유출: 공격자가 피해자의 쿠키가 포함된 요청 응답을 읽어 계정 정보, 개인 데이터, CSRF 토큰 등 민감 정보를 탈취할 수 있습니다.

  • 접근 통제 우회: Origin 기반 정책을 믿는 백엔드가 'null'을 신뢰하면 내부 API나 관리자 엔드포인트의 보호가 약화됩니다.

  • CSRF 영향 증대: 본래 응답을 읽지 못하는 CSRF 시나리오에서, CORS 오설정으로 응답 열람까지 가능해지면 공격 자동화 및 추가 공격(권한 확인 우회)에 악용될 수 있습니다.

해결 방법

  • 'null' Origin을 절대 허용하지 마세요. Access-Control-Allow-Credentials: true와 함께 'null' 또는 '*'을 사용하지 않습니다.

  • 엄격한 Allowlist 적용: 신뢰 가능한 구체적 Origin 목록과 일치할 때만 Access-Control-Allow-Origin을 그 Origin 값으로 설정하고, Vary: Origin을 함께 반환합니다.

  • 미일치 Origin 처리: 일치하지 않으면 Access-Control-Allow-Origin/Allow-Credentials를 설정하지 말고, 사전 요청(OPTIONS)은 403으로 거부합니다.

  • 최소 권한 원칙: 정말 필요한 경로에 한해 Credentials를 허용하고, 가능하면 토큰 기반 인증을 사용해 쿠키 의존도를 낮춥니다.

  • 방어 강화: 세션 쿠키에 SameSite=Lax/Strict, Secure, HttpOnly를 설정하여 크로스 사이트 전송을 최소화합니다.

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

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 'null' Origin은 sandbox iframe, data: URL 등에서 쉽게 만들어낼 수 있는 공격자 제어 Origin입니다. 이를 Access-Control-Allow-Origin으로 허용하고 Access-Control-Allow-Credentials를 true로 설정하면, 피해자의 쿠키가 포함된 요청의 응답을 공격자 스크립트가 읽을 수 있어 민감 정보가 노출됩니다.

  • 안전한 코드: 서버가 미리 정의한 Allowlist에 포함된 신뢰 가능한 Origin에 대해서만 Access-Control-Allow-Origin을 그 Origin으로 설정하고 Credentials를 허용합니다. 허용되지 않은 Origin에는 CORS 헤더를 설정하지 않아 브라우저가 응답을 노출하지 못하게 합니다. 또한 Vary: Origin을 추가해 캐시 오작동을 방지합니다.

참조

Last updated