💡 Tabnabbing이란 HTML 문서 내에 링크(target이 _blank
인 Anchor 태그)를 클릭 하게될 때 새로 열린 페이지(or 새탭)에서 기존의 문서의 위치를 피싱 사이트로 변경해 정보를 탈취(계정 탈취)하는 공격 기술입니다. 보통 메일이나 오픈 커뮤니티에 걸린 링크를 눌르게 유도하는 등 쉽게 사용되는 수법입니다.
공격 절차
사용자가 현재 합법적인 브라우저(A) 탭에서 새 탭으로 여는 웹사이트(실제로는 피싱 사이트)(B)를 클릭합니다.
(B) 사이트에는 window.opener
속성이 존재합니다.
자바스크립트를 사용해 opener의 location을 피싱 목적으로 원래의 (A) 페이지의 /login
페이지로 변경합니다.
악성 웹사이트(B)는 '합법적인 웹사이트를 가장한 Fake Website'(C)를 사용자에게 가짜 버전으로 강제로 리다이렉션 합니다.
Fake Site(C)에서는 사용자가 입력한 계정 정보를 탈취한 뒤 원래의 합법적인(A) 웹 사이트로 리다이렉트합니다.
이러한 공격의 취약점을 극복하고자 noopener
속성이 추가 됐습니다.
rel=noopener
속성이 부여된 링크를 통해 열린 페이지는 location 변경과 같은 자바스크립트 요청을 거부합니다.
정확히 말해서 Uncaught TypeError
에러를 콘솔에 발생시킵니다.
이 속성은 Window Opener Demo 페이지를 통해 테스트해볼 수 있습니다.
이러한 공격이 우려스러운 서비스를 제공하고 있다면, blankshield같은 라이브러리를 사용하시는것을 제안합니다.
noopener
속성은 보안적 측면과 성능 상의 이점을 취할 수 있습니다.
_blank
속성으로 열린 탭(또는 페이지)은 언제든지 opener
를 참조할 수 있습니다. 그래서 부모 탭(원래의)과 같은 스레드에서 페이지가 동작합니다.
이 때 새탭의 페이지가 리소스를 많이 사용한다면 덩달아 부모 탭도 함께 느려집니다.
noopener
속성을 사용해서 열린 탭은 부모를 호출할 일이 없습니다. 따라서 같은 스레드일 필요 없으며 새로운 페이지가 느리다고 부모 탭까지 느려질 일도 없습니다.