모바일 파이어폭스 악성 리다이렉트 광고 차단 삽질기 (단순 오버레이가 아니었다)

모바일 파이어폭스 악성 리다이렉트 광고 차단 삽질기 (단순 오버레이가 아니었다)

모바일 파이어폭스에서 동영상 스트리밍 사이트를 이용하다 보면, 재생 버튼을 누르는 순간 알리익스프레스나 정체불명의 사이트로 강제 이동(Redirect)되는 현상을 자주 겪습니다.

처음에는 단순히 투명한 광고 막(Invisible Overlay)이 덮여있는 줄 알고 가볍게 덤볐다가, iframe과 난독화된 자바스크립트의 조합에 호되게 당한 뒤 결국 해결해낸 과정을 기록으로 남깁니다.


1. 첫 번째 가설: 투명 오버레이 (Invisible Overlay)

가장 흔한 케이스입니다. 재생 버튼 위에 z-index가 높은 투명한 <div>를 덮어씌워 놓고, 클릭을 가로채는 방식이죠.

  • 시도: uBlock Origin의 ‘요소 지우기(Element Zapper)’ 도구로 화면을 찍어보았습니다.
  • 결과: 실패.
    • 화면상의 요소를 지워도, 재생 버튼을 누르면 여전히 납치되었습니다.
    • 단순히 위에 덮인 막이 아니라, 플레이어 내부의 클릭 이벤트 자체가 조작되어 있음을 직감했습니다.

2. 두 번째 가설: iframe 내부의 악성 코드 분석

개발자 도구(또는 소스 보기)를 통해 뜯어보니 구조가 복잡했습니다. 동영상 플레이어는 iframe 안에 갇혀 있었고, 그 안에는 의심스러운 스크립트들이 가득했습니다.

특히 눈에 띈 것은 아래와 같은 코드였습니다.

<link rel="preconnect dns-prefetch" href="https://s.click.aliexpress.com">

이 코드는 브라우저에게 “곧 이 광고 사이트들에 접속할 거니까 미리 준비해(Preconnect)“라고 지시하고 있었습니다.

  • 시도: uBlock의 HTML 필터링(##^) 기능을 이용해 소스 코드 단계에서 저 태그들을 삭제해 보았습니다.
*##^link[rel*="preconnect"]
  • 결과: 또 실패.
    • 이유를 분석해보니, 저 태그들은 미끼거나 혹은 자바스크립트가 런타임(클릭하는 순간)에 동적으로 생성했다가 순식간에 삭제하는 방식이었습니다. 정적 필터로는 타이밍을 맞출 수 없었던 것입니다.

3. 세 번째 가설: 자바스크립트 납치 (Runtime Hijacking)

범인은 iframe 내부에서 돌아가는 난독화된 자바스크립트였습니다. 사용자가 클릭하는 순간 window.location을 변경하거나 window.open으로 새 창을 띄우는 방식입니다.

게다가 iframe 내부는 ‘격리된 공간’이라 외부에서 선택자(##)로 요소를 집어내기도 까다롭습니다. 결국 원인(스크립트)을 제거하는 게 불가능하다면, 결과(이동)를 막자는 전략으로 선회했습니다.


4. 최종 해결책: ‘사이트 이탈’ 자체를 봉쇄 (Nuclear Option)

uBlock Origin의 고급 필터 기능을 사용하여, “이 사이트(도메인)에서 외부 사이트(3rd-party)로 나가는 모든 문을 용접”해버리기로 했습니다.

이 방법은 원인이 무엇이든(오버레이든, JS든, iframe이든) 결과적으로 페이지 이동을 불가능하게 만듭니다.

적용한 필터 코드

(uBlock Origin 설정 > 내 필터)

※ 주의: 현재사이트주소.com 부분에는 실제 문제가 발생하는 사이트 도메인을 적어야 합니다.

! 1. [팝업 권한 박탈] 이 사이트에서는 그 어떤 새 창(Popup)도 열 수 없음
현재사이트주소.com$popup

! 2. [JS 무력화] window.open 함수가 실행되면 무조건 무시함 (인자 불문)
현재사이트주소.com##+js(no-window-open-if)

! 3. [핵심] 해당 도메인에서 외부(3rd-party)로 이동하는 문서 요청($doc) 전면 차단
! 영상 파일(media/object)은 $doc이 아니므로 재생은 되지만, 납치 페이지 이동은 막힘
||*^$doc,third-party,domain=현재사이트주소.com

결론 및 요약

단순한 광고 차단으로 해결되지 않을 때는 다음 단계를 의심해야 합니다.

  1. 단순 오버레이인가? (요소 지우기로 해결 가능)
  2. HTML 태그가 있는가? (정적 HTML 필터링 시도)
  3. 동적 스크립트/iframe인가? (가장 악질)

마지막 경우라면, 광고 스크립트와 숨바꼭질을 하는 것보다 네트워크 규칙($doc,third-party)을 통해 페이지 이동 권한 자체를 제어하는 것이 가장 확실한 해결책이었습니다.

이제 쾌적하게 영상을 시청할 수 있게 되었습니다. 저와 같은 고통을 겪는 분들에게 도움이 되기를 바랍니다.