런타임에서 DOM 인젝션 탐지: 정적 방어가 실패하는 이유

발행: (2026년 2월 6일 오전 01:18 GMT+9)
12 min read
원문: Dev.to

Source: Dev.to

현대 웹 애플리케이션과 클라이언트‑사이드 인젝션

현대 웹 애플리케이션은 클라이언트‑사이드 로직에 크게 의존합니다. 프레임워크, 서드‑파티 SDK, 분석 도구, A/B‑테스트 라이브러리 — 이 모든 것이 DOM을 동적으로 조작합니다.

그 같은 유연성 때문에 브라우저가 방어하기 가장 어려운 장소 중 하나로 조용히 변했습니다.

DOM 인젝션은 이제 명백한 스크립트 태그나 악의적인 페이로드처럼 보이지 않습니다. 오늘날에는 동적으로 자체를 조립하고, 조건에 따라 활성화되며, 합법적인 실행 경로에 섞여 들어가 전통적인 보안 도구의 범위를 벗어나 있습니다.

Source: https://venturebeat.com/security/browser-security-gap-ciso-enterprise-breaches

클라이언트‑사이드 인젝션이 잡히기 어려워지는 이유

DOM 인젝션은 서버‑사이드 공격과 중요한 차이점이 있습니다:

  • 사용자의 브라우저 안에서 완전히 실행됩니다.
  • 잘못된 요청이 없습니다.
  • 의심스러운 엔드포인트가 없습니다.
  • 서버 로그가 없습니다.

여러 요인이 탐지를 특히 어렵게 만듭니다.

애플리케이션 복잡성

대부분의 최신 사이트는 여러 출처에서 수십 개의 스크립트를 로드합니다. 이로 인해 악의적인 로직이 종속성이나 삽입된 조각 안에 숨을 수 있는 크고 지속적으로 변하는 실행 표면이 형성됩니다. 서명 기반 탐지는 여기서 어려움을 겪습니다 — 코드가 정적인 형태로 존재하지 않을 수 있기 때문입니다.

동적 및 조건부 실행

전체 스크립트를 삽입하는 대신, 공격자는 점점 더 다음과 같은 방식을 사용합니다:

  • 기존 프레임워크에 훅 걸기
  • 런타임에 DOM 요소 수정
  • 특정 사용자 행동 이후에만 트리거

정적 스캐너나 CSP 규칙이 이상을 감지할 때쯤이면 이미 피해가 발생한 상태입니다.

전통적인 도구의 한계

블랙리스트, 오프라인 스캐너, 규칙 기반 시스템은 예측 가능한 위협을 위해 설계되었습니다. DOM 인젝션은 예측 가능하지도, 정적이지도 않으며—실시간으로 세션 내에서 조립되고 실행 후 사라지는 경우가 많습니다.

이는 틈새 사례나 이론적인 우려가 아닙니다. Omdia 연구에 따르면, 대부분의 기업이 지난해 브라우저 기반 공격 활동을 경험했으며 많은 공격이 인증된 브라우저 세션 내부에서 완전히 실행되어 전통적인 보안 제어가 거의 가시성을 확보하지 못했습니다.

사건 전반에 걸친 패턴은 일관됩니다: 공격자는 주변 방어를 우회하거나 제로‑데이 취약점을 이용할 필요가 없습니다. 대신, 기존 도구가 접근이 이미 허용된 후에는 감시하도록 설계되지 않은 신뢰된 브라우저 환경 내에서 합법적인 실행 경로를 악용합니다.

일반적인 DOM‑레벨 공격 패턴

다양한 구현 방식에도 불구하고 대부분의 DOM 인젝션은 몇 가지 행동 범주로 나뉩니다:

  • 인터페이스 조작 – 링크, 버튼, UI 요소를 교체하여 사용자를 리다이렉트하거나 동작을 가로챕니다.
  • 입력 가로채기 – 키 입력, 폼 데이터, 사용자 상호작용을 포착하고 조용히 탈취합니다.
  • DOM 스푸핑 – 애플리케이션에 자연스럽게 보이는 가짜 배너, 팝업, 임베디드 폼을 렌더링합니다.
  • 정책 남용 – 신뢰할 수 있는 로더, 서브도메인, 혹은 관대하게 설정된 CSP 규칙을 활용해 정책 제약을 위반하지 않고 악성 로직을 실행합니다.

Why Static Rules Aren’t Enough

A key misconception is that DOM injections are a purely syntactic problem. They’re not.

Most malicious behavior emerges from sequences of actions, not individual API calls. A single appendChild or setAttribute invocation is rarely suspicious on its own.

What matters is:

  • When it happens
  • What else is happening in the session
  • How it correlates with user behavior

This is where purely rule‑based detection breaks down.

정적 규칙만으로는 부족한 이유

핵심 오해는 DOM 인젝션이 순수히 구문적인 문제라는 점이다. 그렇지 않다.

대부분의 악의적인 행동은 개별 API 호출이 아니라 일련의 행동에서 나타난다. 단일 appendChild 또는 setAttribute 호출만으로는 드물게 의심스럽다.

중요한 것은:

  • 언제 발생하는가
  • 세션에서 동시에 무슨 일이 일어나고 있는가
  • 사용자 행동과 어떻게 연관되는가

이것이 순수 규칙 기반 탐지가 무너지는 지점이다.

Source:

하이브리드 탐지 모델

이 문제에 접근하는 효과적인 방법 중 하나는 직접적인 런타임 관찰과 세션 수준 행동 분석을 결합하는 것입니다.

런타임 DOM 계측

코드를 스캔하는 대신, 이 접근 방식은 실행 중에 DOM이 실제로 어떻게 수정되는지를 모니터링합니다. 민감한 DOM API 호출(예: 노드 삽입, 속성 변이, 동적 평가)을 관찰함으로써, 주입된 코드가 난독화되었거나 일시적일 때도 예상되는 수정 패턴과의 편차를 감지할 수 있습니다.

세션‑레벨 상관관계

DOM 주입은 거의 단독으로 발생하지 않습니다. 보통 다음과 동시에 나타납니다:

  • 비정상적인 네비게이션 패턴
  • 반복적인 페이지 새로고침 또는 렌더링 정지
  • 일관되지 않은 브라우저 API 동작
  • 자동화 또는 합성 인터랙션의 징후

이러한 신호들을 함께 분석하면 정상적인 동적 동작과 주입된 조작을 구분하는 데 도움이 됩니다.

실제 데이터가 보여주는 내용

이 하이브리드 접근 방식을 실시간 트래픽에 적용하면 몇 가지 패턴이 드러납니다:

  • 단일 DOM 주입은 의외로 자주 발생하며, 주로 손상되었거나 과도하게 권한이 부여된 서드‑파티 위젯에서 비롯됩니다.
  • 여러 개의 상관된 주입을 포함하는 세션은 드물지만 위험도가 크게 높습니다.
  • 높은 위험도의 주입 시나리오 중 상당 부분이 정적 혹은 시그니처 기반 시스템에 의해 완전히 놓치고 있습니다.

상관 분석을 통해 무해한 동적 행동을 초기에 걸러내어 수동 조사 시간을 크게 단축할 수 있습니다.

핵심 요점: 대부분의 DOM 주입은 감지 가능하지만, 단독으로는 감지하기 어렵습니다.

이 내용이 진행되는 방향

클라이언트‑사이드 실행이 복잡해짐에 따라, 탐지 모델은 “코드가 어떻게 보이는가”에서 “세션이 어떻게 동작하는가”로 전환해야 합니다. 이 분야의 향후 개선은 다음에 초점을 맞출 가능성이 높습니다:

  • 보다 풍부한 클라이언트‑사이드 텔레메트리
  • DOM 변동과 사용자 행동 간의 더 나은 연관성
  • 주입된 로직이 사용자에게 영향을 미치기 전에 더 이른 개입 지점

이는 스크립트를 차단하는 것보다 실행 컨텍스트를 이해하는 데 더 중점을 둡니다.

마무리 생각

DOM 인젝션은 정적 분석과 런타임 동작 사이의 사각지대를 이용합니다. 이를 방어하려면 다음을 수용해야 합니다:

  • 악성 코드는 읽을 수 있는 형태로 존재하지 않을 수도 있습니다.
  • 실행 컨텍스트가 구문보다 더 중요합니다.
  • 브라우저‑측 가시성은 이제 선택 사항이 아닙니다.

정적 방어는 여전히 역할이 있지만, runti

“그들은 가장 미묘하고 파괴적인 클라이언트‑사이드 공격을 계속 놓칠 것이다.”
Me and Behavioral Insight


Disclosure: This article is based on applied research and production work by the team at JuicyScore. The implementation details were generalized to focus on architectural principles rather than product specifics.

Back to Blog

관련 글

더 보기 »