문제
카카오·애플 웹 로그인 모두 state 파라미터를 쓰지 않아 로그인 CSRF 가 성립한다.
- 공격자가 자기 계정으로 로그인해 유효한 인가 코드(카카오) 또는
id_token(애플) 을 얻는다
- 그 값을 박은 자동 제출 폼·링크를 남의 사이트에 올린다
- 피해자가 그 페이지를 열면 브라우저가 우리 콜백을 호출하고, 피해자가 공격자 계정으로 로그인된다
- 이후 피해자가 올리는 사진·채팅·프로필이 공격자 계정에 쌓인다
현재 상태
- 카카오 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 문제와도 얽히므로 함께 볼 것.
참고
문제
카카오·애플 웹 로그인 모두
state파라미터를 쓰지 않아 로그인 CSRF 가 성립한다.id_token(애플) 을 얻는다현재 상태
Origin헤더를 안 붙여 CORS 검사 자체가 안 걸린다. 지금도 열려 있다.nonce는 앱이rawNonce를 보낼 때만 검증하는데 웹 경로는 보내지 않는다.state도 컨트롤러가 받지 않는다. 크로스사이트 POST 라Origin이 붙어 CORS 목록이 우연히 문턱 노릇을 하고 있다(ADR 0030).해결 방향
인가 URL 에
state를 실어 보내고 콜백에서 대조한다. 두 제공자에 함께 넣어야 의미가 있다.대조용 쿠키가 걸림돌이다 — 애플 콜백은 크로스사이트 POST 라
state쿠키가SameSite=None; Secure여야 브라우저가 실어준다. ADR 0023 의 "알려진 공백" 이 같은 문제를 적어 뒀다.refreshToken쿠키의SameSite=Lax문제와도 얽히므로 함께 볼 것.참고