tabnabbing 공격 방어 대책 정리

퍼블리셔를 폄훼할 생각은 없으나 퍼블리셔들이 tabnabbing 공격에 대한 고민이나 관심이 없는 경우가 대부분이고, 보안 관련 이슈라는 꼬리표가 붙으면 자신들이 고민해야할 것도 의레 개발 딱지가 붙은 사람들에게 떠넘기기 일수라 활동중인 프론트 개발관련 그룹에 정리한 글을 남깁니다. ㅠㅠ


최근 보안 팀에서 tabnabbing 공격에 대한 대응 가이드가 내려와서 메일 폼에 target=”_blank” 속성이 적용된 <a> 테그에 대해 rel=”noopener noreferrer” 를 적용했습니다.
여기까지는 누구나 쉽게 찾고 적용한 내용이겠지만, 관련해서 조사하고 테스트한 바로는 더 고민할 부분이 존재합니다. (요즘은 간단한게 없네요 …)

# target 속성이 존재하는 <area>, <base>, <form> 테그도 확인해야 합니다

<area>,<base>,<form> 역시 target 속성이 _blank 로 되어 있으면 새창(새탭) 으로 열리고, window.opener 에 참조가 걸립니다.
당연히 위 3개 테그에도 rel=”noopener noreferrer” 를 추가 되어야 합니다.

# 자동으로 target=”_blank” 추가되는 e-mail 서비스

(당연한 이유로) 서비스 되는 페이지를 유지하도록 gmail 과 hotmail 같은 e-mail 서비스들은 <a> 테그를 포함한 <area>,<base>,<form> 테그에 자동으로 target=”_blank” 를 추가하고 있습니다.
따라서 e-mail 폼에는 4개 테그 모두 target=”_blank” 가 없어도 rel=”noopener noreferrer” 를 추가하는게 안전 합니다.

# window.open() 역시 취약점이 존재합니다

대부분의 e-mail service 에서는 보안 문제 때문에 inline javascript 가 제거(stipped out) 되므로 window.open() 함수가 왜 문제가 되냐고 반문하는 사람들이 있습니다. 이는 tabnabbing 공격이 e-mail 에 국한된 것으로 잘못 이해하기 때문입니다.
tabnabbing 공격은 해커에 의해 위변조될 가능성이 있는 페이지를 새창 또는 새탭으로 여는 경우가 대상이 됩니다.

window.open() 으로 창을 열 경우, window.opener 에 부모창 참조가 남습니다. 이것을 막기 위해서는 noopener 파라페터를 추가하면 됩니다.
자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/Window/open 에서 noopener 로 검색 하면 확인할 수 있습니다.

Chrome 또는 Firefox 개발자 도구창에서 noopener 가 추가된 예제를 실행해 봅니다.

window.open('https://www.naver.com', 'naver', 'width=300,height=300,resizable,scrollbars,noopener');

새로 열린 창에서 window.opener 를 확인해 봅니다. null 로 나오는 것을 확인할 수 있습니다.

window.open() 함수에 noopener 속성 추가시 주의할 점

  1. window.open() 함수에 두번째 파라메터인 windowName 을 명시해도 중복창이 뜨게 됩니다. (Firefox, Chrome 공통 사항).
  2. Chrome 에서는 noopener 파라메터를 추가할 경우, width 와 height 선언을 무시하고 미리 설정된 기본 사이즈로 화면을 띄웁니다. ㅠㅠ (Firefox 는 정상 동작 합니다)
    noopener 옵션이 추가될 경우, window.open() 의 반환값은 null 이므로 부모창 역시 새창 또는 새탭에 대한 제어는 불가능합니다. 따라서 새창에서 창크기를 조정하는 스크립트가 추가되지 않으면 Chrome 에선 원하는 크기의 창이 뜨지 않습니다.

Mobile First 가 당연한 세상이라 2번은 큰 문제가 되지 않으리라 생각되지만, 아직도 데스크탑 에서 popup 사이즈를 딱 맞게 해달라고 생때를 쓰거나 꽁수(?) 및 noopener 를 빼달라고 요청하는 고객이나 상사가 있을 수 있습니다. 이 분들에게 보안은 타협의 대상이 될 수 없음을 꼭 인지 시켜 주시길 바랍니다.

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.