Skip to content

웹 소셜 로그인에 state 파라미터가 없어 로그인 CSRF에 열려 있다 #209

Description

@howudong

문제

카카오·애플 웹 로그인 모두 state 파라미터를 쓰지 않아 로그인 CSRF 가 성립한다.

  1. 공격자가 자기 계정으로 로그인해 유효한 인가 코드(카카오) 또는 id_token(애플) 을 얻는다
  2. 그 값을 박은 자동 제출 폼·링크를 남의 사이트에 올린다
  3. 피해자가 그 페이지를 열면 브라우저가 우리 콜백을 호출하고, 피해자가 공격자 계정으로 로그인된다
  4. 이후 피해자가 올리는 사진·채팅·프로필이 공격자 계정에 쌓인다

현재 상태

  • 카카오 GET 콜백 — 최상위 GET 이동에는 브라우저가 Origin 헤더를 안 붙여 CORS 검사 자체가 안 걸린다. 지금도 열려 있다.
  • 애플 POST 콜백 — nonce 는 앱이 rawNonce 를 보낼 때만 검증하는데 웹 경로는 보내지 않는다. state 도 컨트롤러가 받지 않는다. 크로스사이트 POST 라 Origin 이 붙어 CORS 목록이 우연히 문턱 노릇을 하고 있다(ADR 0030).

해결 방향

인가 URL 에 state 를 실어 보내고 콜백에서 대조한다. 두 제공자에 함께 넣어야 의미가 있다.

대조용 쿠키가 걸림돌이다 — 애플 콜백은 크로스사이트 POST 라 state 쿠키가 SameSite=None; Secure 여야 브라우저가 실어준다. ADR 0023 의 "알려진 공백" 이 같은 문제를 적어 뒀다.

refreshToken 쿠키의 SameSite=Lax 문제와도 얽히므로 함께 볼 것.

참고

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions