OAuth2의 보안취약점과 해결방법
in Programming on Spring
OAuth2 인증방식에도 다양한 보안취약점이 존재한다. 어떤 보안취약점들이 있는지, 그리고 이를 방지할수있는 방법은 무엇인지 알아보자.
CSRF 보안취약점
CSRF 공격이란?
CSRF(Cross Site Request Forgery)는 XSS(Cross site script) 공격과 매우 유사하며 XSS는 악성 스크립트가 클라이언트에서 실행되는데 반해 CSRF 공격은 사용자가 악성스크립트를 서버에 요청한다는 차이가 있다. 공격자가 CSRF가 포함된 게시물을 서버에 등록하고, 타 사용자가 그 게시물을 열람하게될경우 CSRF 스크립트가 실행되며 공격을 당하게된다.
공격방법
authorization code를 주고받을때 state 파라미터를 넣어 서로간에 검증을 거친다. 그런데 이 state값에 대한 검증이 누락되어있거나 미흡할경우 사용자 계정을 탈취할수있다. authorization code와 state값을 client서버로 전송할때 client 서버로 전송하는 내용을 추출하여 만든 CSRF 공격페이지에 사용자가 접근하게되면 사용자 계정과 공격자 계정이 연동되며 공격자의 SNS 계정을 통해 사용자 계정으로 로그인할수있게된다.
대응방안
state값에 대한 정책과 사용여부, 방법에 대해 공격 가능 여부를 확인하여야한다.
Convert Redirect 보안취약점
공격방법
OAuth2.0인증 flow 중 redirect_uri
파라미터값에 대해 검증이 누락되거나 미흡할경우 발생하는 취약점. 정상적인 경로라면 사용자가 로그인 성공 후 발급받은 Authorization code를 redirect uri를 통해 Client로 전달해야하지만 공격자가 사용자에게 변조된 redirect uri를 보내 로그인을 유도하면 Authorization code값이 공격자 서버로 전달되어 공격자는 사용자의 계정을 탈취할수 있게됨.
대응방안
Authorization Server에서 redirect URI 값에 대해 Full Path 검증을 진행해야함. 만일 도메인만 검증하거나 일부 경로만 검증하도록 할경우 Redirect 취약점이 존재하는 Client는 여전히 Authroization code를 탈취할수있음.
보안검수항목
이외에도 다양한 위험이 존재할수있으므로 OAuth 2.0을 적용할때 고려할 보안 검수 항목과 검수 방법을 다음과 같이 정리하였다.
Authorization code 등 OAuth인증 flow에서 중요정보 탈취 가능 여부
SSL/TLS적용, 누락 여부확인
위조 Client에 의한 Authorization code 유출 가능 여부
Client 검증에 사용되는 Client secret 값에 대한 보안 현황과 검증 과정에 공격 가능 여부 확인.
(1) 안전한 엔트로피 (128bit) 확보 여부 (2) Brute Forcing 가능 여부
CSRF 계정 탈취 가능 여부
state값에 대한 정책과 사용여부, 방법에 대해 공격 가능 여부를 확인
반복된 권한요청을 통해 Authorization server에 DOS공격 가능 여부
Authorization code 발급 시 재전송을 통해 반복적으로 발급 가능 여부 확인
Authorization code 추측을 통한 권한 획득 가능
Autorization code 값에 대한 보안 현황 확인 (1) 안전한 엔트로피 (128bit) 확보 여부 (2) Brute Forcing 가능 여부 (3) time out 설정 현황 확인 가능 (가능한 짧게)
Clickjacking 공격을 통한 권한 획득 가능 여부
OAuth 인증 과정이 Iframe 내에서 진행 가능한지 여부 확인
Query string을 통한 중요 정보 전달 여부
Query string을 통해 중요 정보 전달 여부 확인 (access token, client secret 등)
scope설정 확인
불필요하거나 과도한 권한 여부 확인. scope를활용하여 필요한 권한만 제공.