개념/배경

Reverse Tabnabbing은 target="_blank"로 연 새 탭이 window.opener를 통해 기존 탭을 피싱 페이지로 바꾸는 기법을 말함 새 탭이 기존 탭에 대한 참조를 갖기 때문에 발생하며, 자바스크립트로 opener의 위치를 변경 가능함 예시 window.opener.location = 'https://cgn.example.com' 이 참조를 끊는 표준 방법은 링크에 rel=“noopener” 또는 rel=“noopener noreferrer"를 명시하는 것임

공격 시나리오

  • 사용자가 cgm.example.com 접속
  • happy.example.com 링크 클릭
  • 새 탭에서 happy.example.com 열림 → 스크립트가 기존 탭을 피싱 사이트로 이동시킴 window.opener.location='https://cgn.example.com'
  • 기존 탭으로 돌아온 사용자는 세션 만료로 오인 후 자격증명 입력
  • 피싱 페이지가 정보를 수집 후 원래 페이지로 리다이렉션

방어 전략

  • 앵커 태그에 rel=“noopener” 최소 적용, 가능하면 rel=“noopener noreferrer” 적용 권장
    • noopener: 새 탭에서 window.opener가 null이 되어 기존 탭 제어 불가
    • noreferrer: 대부분 브라우저에서 opener 차단 + Referer 헤더 전송 차단
  • 자바스크립트로 새 창을 열 경우 window.open(url, '_blank', 'noopener') 사용 고려
  • 기존 코드 점검 시 target="_blank” 링크에 rel 값 누락 여부 정적 분석 또는 린트 규칙으로 검출 권장

주의 사항

  • 일부 최신 브라우저는 target="_blank"에 대해 기본적으로 noopener를 적용하는 경향 있으나 브라우저·버전별 차이 존재, 명시적 rel 사용이 안전
  • noreferrer는 분석 도구에서 유입 경로 확인이 어려워질 수 있음, 트래픽 분석 요구가 있으면 noopener만 선택하는 운영 전략 고려

참고: noopener와 noreferrer

  • noopener: 새 탭의 Window.opener를 제거하여 원탭 조작 방지
  • noreferrer: Referer 헤더 차단, 대부분 환경에서 opener 제거 동작 동반

마무리

target="_blank"는 편리하지만 기본 동작만으로는 탭 간 참조가 남아 공격면 존재 모든 외부 링크에 rel=“noopener” 또는 필요에 따라 rel=“noopener noreferrer"를 일관 적용하는 것이 가장 단순하고 효과적인 방어 전략임

참고자료