무료 아이폰을 제공한다는 링크를 클릭하고 싶은 유혹은 뿌리치기 어려울 수 있습니다. 하지만 조심해야 합니다. 클릭 한 번으로 쉽게 해킹될 수 있으며, 그 결과는 심각할 수 있습니다.
클릭재킹은 ‘사용자 인터페이스 교정’이라고도 불리는 공격 기법입니다. 사용자가 생각하는 것과는 다른 행동을 하도록 속이기 위해, 링크 위에 투명한 오버레이를 덧씌워 링크를 위장하거나 변조하는 방식으로 작동합니다.
대부분의 소셜 네트워크 사용자는 로그인 상태를 유지하는 편리함을 선호합니다. 공격자들은 이러한 습관을 악용하여 사용자가 모르는 사이에 ‘좋아요’를 누르거나 특정 계정을 팔로우하도록 조작할 수 있습니다. 이를 위해 사이버 범죄자들은 매력적인 문구(“무료 아이폰 – 기간 한정 제공!”)가 적힌 버튼을 자신들의 웹 페이지에 배치하고, 그 위에 소셜 네트워크 페이지가 담긴 투명한 프레임을 겹쳐 놓습니다. 이 프레임 속에는 ‘좋아요’나 ‘공유’ 버튼이 위치하며, 사용자가 무료 아이폰 버튼을 클릭하는 순간, 의도치 않게 소셜 네트워크 상의 상호작용이 발생하게 됩니다.
이러한 간단한 클릭재킹 수법으로 인해 페이스북 사용자는 자신도 모르게 특정 그룹이나 팬 페이지에 ‘좋아요’를 누르게 될 수 있습니다.
위에 언급된 시나리오는 피해자가 소셜 네트워크 그룹에 추가되는 정도의 비교적 가벼운 피해를 입는 경우입니다. 하지만 공격자는 약간의 추가 노력을 통해 동일한 기술을 사용해 사용자가 은행 계좌에 로그인한 상태인지 확인하고, 소셜 미디어 게시물에 ‘좋아요’나 ‘공유’를 하는 대신 자신의 계좌로 자금을 이체하는 버튼을 누르도록 유도할 수 있습니다. 가장 심각한 문제는 사용자가 자신의 은행 계좌에 정상적으로 로그인한 후, 자발적으로 이체 버튼을 클릭한 것이기 때문에 악의적인 행위를 추적하기 어렵다는 점입니다.
클릭재킹 공격은 사회공학적 요소가 포함되는 경우가 많기 때문에 소셜 네트워크는 공격자들이 선호하는 공격 통로가 됩니다.
이제 클릭재킹 공격이 어떻게 활용되는지 좀 더 자세히 알아보겠습니다.
트위터에서의 클릭재킹
약 10년 전, 트위터는 메시지를 빠르게 확산시키는 대규모 공격에 노출된 적이 있습니다. 당시 사용자들은 호기심에 이끌려 링크를 클릭하게 되었습니다.
“클릭하지 마세요”라는 텍스트와 링크가 포함된 트윗이 수많은 트위터 계정을 통해 급속도로 퍼져나갔습니다. 사용자가 해당 링크를 클릭한 후, 대상 페이지에서 아무 문제 없어 보이는 버튼을 클릭하면, 해당 사용자의 계정에서 똑같은 트윗이 발송되는 방식이었습니다. 해당 트윗에는 “클릭하지 마세요”라는 문구와 함께 악성 링크가 포함되어 있었습니다.
트위터 엔지니어들은 클릭재킹 공격이 시작된 직후 패치를 배포했습니다. 해당 공격은 다행히도 무해한 것으로 밝혀졌지만, 트위터에서 발생할 수 있는 클릭재킹 공격의 잠재적인 위험성을 알리는 경종 역할을 했습니다. 공격에 사용된 악성 링크는 사용자를 숨겨진 iframe이 포함된 웹 페이지로 유도했습니다. 이 프레임 안에는 사용자의 계정으로 악성 트윗을 발송하는 투명한 버튼이 숨겨져 있었습니다.
페이스북에서의 클릭재킹
페이스북 모바일 앱 사용자는 스패머들이 사용자의 동의 없이 타임라인에 클릭 가능한 콘텐츠를 게시할 수 있도록 하는 취약점에 노출된 적이 있습니다. 이 취약점은 스팸 캠페인을 분석하던 보안 전문가에 의해 발견되었습니다. 해당 전문가는 자신의 지인들이 재미있는 사진이 있는 페이지에 대한 링크를 게시하고 있는 것을 발견했습니다. 사진을 보기 전에 사용자들에게 성인 인증을 클릭하도록 유도했습니다.
하지만 그들이 알지 못했던 것은 성인 인증 버튼이 보이지 않는 프레임 아래에 위치하고 있었다는 점입니다.
사용자가 성인 인증을 완료하면 재미있는 사진이 있는 페이지로 이동했지만, 그 과정에서 사용자의 페이스북 타임라인에는 해당 링크가 게시되었습니다. 이는 안드로이드용 페이스북 앱의 웹 브라우저 구성 요소가 프레임 옵션 헤더(후술)를 제대로 처리하지 못하여 악성 프레임 오버레이를 허용했기 때문에 발생한 것입니다.
페이스북은 해당 문제를 ‘버그’로 인식하지 않았는데, 이는 사용자의 계정 무결성에 직접적인 영향을 미치지 않는다고 판단했기 때문입니다. 따라서 해당 문제가 수정될지는 불확실합니다.
소규모 소셜 네트워크에서의 클릭재킹
클릭재킹 공격에 취약한 것은 트위터와 페이스북만이 아닙니다. 인기가 덜한 다른 소셜 네트워크 및 블로그 플랫폼에도 클릭재킹을 허용하는 취약점이 존재합니다. 예를 들어 링크드인(LinkedIn)의 경우, 공격자가 사용자를 속여 사용자의 동의 없이 링크를 공유하거나 게시하도록 하는 취약점이 있었습니다. 해당 취약점이 수정되기 전에는 공격자가 링크드인의 ‘ShareArticle’ 페이지를 숨겨진 프레임에 로드한 다음, 이를 무해하고 매력적인 링크나 버튼이 있는 페이지 위에 겹쳐 놓을 수 있었습니다.
또 다른 예로는 공개 웹 블로깅 플랫폼인 텀블러(Tumblr)가 있습니다. 텀블러는 클릭재킹 공격을 방지하기 위해 자바스크립트 코드를 사용합니다. 하지만 이 보호 방법은 페이지가 자바스크립트 코드 실행을 차단하는 HTML5 프레임에서 격리될 수 있기 때문에 효과가 없습니다. 공격자들은 정교하게 조작된 기술을 사용하여 이러한 취약점을 악용하고 암호 관리 브라우저 플러그인과 결합하여 사용자의 암호를 탈취할 수 있습니다.
사이트 간 요청 위조 (CSRF)
클릭재킹 공격의 변형 중 하나는 사이트 간 요청 위조(Cross-Site Request Forgery), 줄여서 CSRF라고 불리는 공격입니다. 사회공학 기법을 이용하여 사이버 범죄자는 CSRF 공격을 수행하여 사용자가 원하지 않는 작업을 실행하도록 유도합니다. 이러한 공격은 이메일이나 채팅을 통해 전송되는 링크를 통해 이루어질 수 있습니다.
CSRF 공격은 공격자가 가짜 요청에 대한 응답을 확인할 수 없기 때문에 사용자 데이터를 훔치는 것을 목적으로 하지 않습니다. 대신, 공격은 암호 변경이나 자금 이체와 같은 상태 변경 요청을 목표로 합니다. 만약 피해자에게 관리자 권한이 있다면, 공격은 전체 웹 애플리케이션을 손상시킬 수도 있습니다.
CSRF 공격은 취약한 웹사이트, 특히 “저장된 CSRF 결함”이 있는 웹사이트에 저장될 수 있습니다. 이러한 공격은 댓글이나 검색 결과 페이지와 같이 나중에 표시되는 입력 필드에 IMG 또는 IFRAME 태그를 삽입하는 방식으로 이루어집니다.
프레이밍 공격 방지
최신 브라우저는 특정 리소스가 프레임 내에서 로드되는 것을 허용할지 여부를 결정할 수 있습니다. 또한, 사용자가 접속한 사이트와 동일한 출처에서 요청이 발생한 경우에만 리소스를 프레임에 로드하도록 설정할 수 있습니다. 이렇게 하면 사용자가 다른 사이트에서 제공하는 콘텐츠가 포함된 투명 프레임을 클릭하도록 속일 수 없으며, 클릭재킹 공격을 방지할 수 있습니다.
클라이언트 측에서 클릭재킹 공격을 완화하는 기술을 ‘프레임 버스팅’ 또는 ‘프레임 킬링’이라고 부릅니다. 이 기술은 일부 상황에서는 효과적일 수 있지만, 쉽게 우회될 수도 있다는 단점이 있습니다. 그렇기 때문에 클라이언트 측 방법은 모범 사례로 간주되지 않습니다. 보안 전문가들은 ‘프레임 버스팅’ 대신 X-Frame-Options(XFO)와 같은 서버 측 방법 또는 콘텐츠 보안 정책(Content Security Policy, CSP)과 같은 최신 기술을 사용할 것을 권장합니다.
X-Frame-Options는 웹 서버가 웹 페이지에 포함하는 응답 헤더로, 브라우저가 프레임 안에서 콘텐츠를 표시하도록 허용할지 여부를 나타냅니다.
X-Frame-Option 헤더는 세 가지 값을 허용합니다.
- 프레임 내에서 페이지 표시를 금지하는 DENY
- 동일한 도메인에 있는 경우에만 프레임 내에서 페이지를 표시할 수 있도록 하는 SAMEORIGIN
- ALLOW-FROM URI는 지정된 URI(Uniform Resource Identifier)에서만 프레임 내에서 페이지를 표시할 수 있도록 허용합니다. 예를 들어, 특정 웹페이지 내에서만 페이지를 표시할 수 있도록 허용합니다.
최근에는 프레임-조상(frame-ancestors) 지시어가 포함된 콘텐츠 보안 정책(CSP)이 클릭재킹을 방지하는 방법으로 널리 사용되고 있으며, XFO를 대체하는 추세입니다. CSP의 가장 큰 장점 중 하나는 웹 서버가 여러 도메인에 콘텐츠를 프레이밍할 권한을 부여할 수 있다는 점입니다. 그러나 아직 모든 브라우저에서 CSP를 지원하지는 않습니다.
CSP의 프레임-조상(frame-ancestors) 지시어는 세 가지 유형의 값을 허용합니다. ‘self’ – 현재 사이트만 프레임 콘텐츠를 표시하도록 허용하거나, 와일드카드(‘*’)를 사용한 URL 목록(‘*.some site.com’ 등), 또는 ‘https://www.example.com/index.html‘과 같이 목록에 있는 요소와 일치하는 페이지에서만 프레이밍을 허용할 수 있습니다.
클릭재킹으로부터 자신을 보호하는 방법
웹 서핑 중에 소셜 네트워크에 로그인 상태를 유지하는 것이 편리할 수 있지만, 이로 인해 발생할 수 있는 클릭재킹 공격에 주의해야 합니다. 방문하는 모든 웹사이트가 클릭재킹 방지를 위한 적절한 조치를 취하는 것은 아니기 때문에, 방문하는 사이트에도 주의를 기울여야 합니다. 방문 중인 웹사이트에 대한 확신이 없을 경우, 아무리 매력적인 제안이라 할지라도 의심스러운 클릭을 피해야 합니다.
또 다른 주의 사항은 사용하는 브라우저 버전입니다. 웹사이트에서 앞서 언급한 모든 클릭재킹 방지 헤더를 사용하더라도 모든 브라우저가 이러한 헤더를 완벽하게 지원하는 것은 아닙니다. 따라서 항상 최신 버전의 브라우저를 사용하고, 클릭재킹 방지 기능을 지원하는지 확인해야 합니다.
상식은 클릭재킹으로부터 스스로를 보호할 수 있는 가장 효과적인 방법 중 하나입니다. 친구가 소셜 네트워크에 게시한 링크를 포함하여 이상한 콘텐츠를 발견했을 때, 해당 콘텐츠가 평소 친구가 게시하는 유형인지 스스로에게 질문해 보아야 합니다. 그렇지 않다면, 친구에게 클릭재킹의 피해자가 될 수 있음을 경고해야 합니다.
마지막으로, 만약 당신이 인플루언서이거나 소셜 네트워크에 많은 팔로워나 친구가 있다면, 온라인 활동 시 더욱 주의하고 책임감 있는 행동을 보여야 합니다. 클릭재킹 공격의 피해자가 될 경우, 당신의 피해는 많은 사람들에게 영향을 미칠 수 있기 때문입니다.