Clickjacking
clickjacking 은 유저로 하여금 위험한 링크를 글릭하도록 유도하는 방식을 말한다.
clickjacking은 유저를 속여 그들로 하여금 그들이 의도하지 않은 액션을 수행하게 만든다. 일반적으로 보이지 않는 페이지 요소를 만들어 페이지 가장 앞에 배치한다. 이것은 웹페이지를 직접적으로 영향을 주지는 않지만 사이트를 이용하는 유저에게 영향을 준다.
Risks
해커들은 clickjacking으로 무엇을 했을까?
- 로그인 인증을 수집한다.
- 유저의 웹캠이나 핸드폰 카메라를 킨다. 어도비 플래시 세팅 페이지로 조작할 수 있다. (그래서….사라진건가…?)
- 소셜 미디어 사이트에 악성 웜을 뿌린다.
- 온라인 스캠에 사용한다.
- 악성 프로그램을 뿌린다.
Protection
일반적으로 iframe을 통해 악성 사이트가 감싸지지 않도록 막는 것이 중요하다. 이것은 HTTP headers를 통해 브라우저에 직접적으로 지시를 해야 한다. 아니면 client side 자바스크립트를 통해 막는다.
X-Frame-Options
허용할 웹페이지를 설정한다. HTTP headers를 이용한다.
- Deny - 사이트에 관계없이 frame 안에 나타나는 것을 막는다.
- SAMEORIGIN - frame 에서만 디스플레이 되도록 한다.
- ALLOW-FROM uri - 특정 조건에서만 frame에서 디스플레이된다.
Content Security Policy
Content Security Policy HTTP header 은HTML5에 포함되는 기능이다.
Content-Security-Policy: frame-ancestors ‘none’
The page cannot be displayed in a frame, regardless of the site attempting to do so.
Content-Security-Policy: frame-ancestors ‘self’
The page can only be displayed in a frame on the same origin as the page itself.
Content-Security-Policy: frame-ancestors uri
The page can only be displayed in a frame on the specified origins.
Frame-killing
오래된 브라우저에서 clickjacking을 막는 방법은 frame-killing 자바스크립트를 이용하는 것이다. 하지만 문제가 없는 것이 아니기 때문에 적절한 HTTP headers를 세팅하는 것이 중요하다.
<style>
/* Hide page by default */
html { display : none; }
</style>
<script>
if (self == top) {
// Everything checks out, show the page.
document.documentElement.style.display = 'block';
} else {
// Break out of the frame.
top.location = self.location;
}
</script>
코드 예시
Django
response = render_to_response(
"template.html",
{},
(context_instance = RequestContext(request))
);
response["X-Frame-Options"] = "DENY";
response["Content-Security-Policy"] = "frame-ancestors 'none'";
return response;
Node
response.setHeader("X-Frame-Options", "DENY");
response.setHeader("Content-Security-Policy", "frame-ancestors 'none'");