Tabnabbing 공격과 HTML rel=noopener 속성에 관하여

Corner·2022년 5월 22일
0
post-thumbnail

Tabnabbing

💡 Tabnabbing이란 HTML 문서 내에 링크(target이 _blank인 Anchor 태그)를 클릭 하게될 때 새로 열린 페이지(or 새탭)에서 기존의 문서의 위치를 피싱 사이트로 변경해 정보를 탈취(계정 탈취)하는 공격 기술입니다. 보통 메일이나 오픈 커뮤니티에 걸린 링크를 눌르게 유도하는 등 쉽게 사용되는 수법입니다.

Tabnabbing 공격 흐름, 출처

공격 절차

  1. 사용자가 현재 합법적인 브라우저(A) 탭에서 새 탭으로 여는 웹사이트(실제로는 피싱 사이트)(B)를 클릭합니다.

    • (B) 사이트에는 window.opener 속성이 존재합니다.

    • 자바스크립트를 사용해 opener의 location을 피싱 목적으로 원래의 (A) 페이지의 /login 페이지로 변경합니다.

  2. 악성 웹사이트(B)는 '합법적인 웹사이트를 가장한 Fake Website'(C)를 사용자에게 가짜 버전으로 강제로 리다이렉션 합니다.

    • 사용자는 로그인이 풀렸다고 생각하고 다시 ID와 PW를 입력합니다.
  3. Fake Site(C)에서는 사용자가 입력한 계정 정보를 탈취한 뒤 원래의 합법적인(A) 웹 사이트로 리다이렉트합니다.

    • 여기서 A 사이트에 로그인 계정 정보가 그대로 남아있으므로 C 사이트에서 입력해서 -> A의 홈으로 이동시켰을 때 자연스러운 전환이기 때문에
      이상한 낌새를 찾기 어려울 것입니다.

rel=noopener 속성

이러한 공격의 취약점을 극복하고자 noopener 속성이 추가 됐습니다.

rel=noopener 속성이 부여된 링크를 통해 열린 페이지는 location 변경과 같은 자바스크립트 요청을 거부합니다.

정확히 말해서 Uncaught TypeError 에러를 콘솔에 발생시킵니다.

이 속성은 Window Opener Demo 페이지를 통해 테스트해볼 수 있습니다.

이러한 공격이 우려스러운 서비스를 제공하고 있다면, blankshield같은 라이브러리를 사용하시는것을 제안합니다.

noopener속성은 보안적 측면과 성능 상의 이점을 취할 수 있습니다.

_blank 속성으로 열린 탭(또는 페이지)은 언제든지 opener를 참조할 수 있습니다. 그래서 부모 탭(원래의)과 같은 스레드에서 페이지가 동작합니다.

이 때 새탭의 페이지가 리소스를 많이 사용한다면 덩달아 부모 탭도 함께 느려집니다.

noopener 속성을 사용해서 열린 탭은 부모를 호출할 일이 없습니다. 따라서 같은 스레드일 필요 없으며 새로운 페이지가 느리다고 부모 탭까지 느려질 일도 없습니다.

💡참고 사이트

profile
Full-stack Engineer. email - corner3499@kakao.com,

0개의 댓글