Skip to content

Latest commit

 

History

History
252 lines (198 loc) · 15.1 KB

File metadata and controls

252 lines (198 loc) · 15.1 KB

Firefox DOM navigation site-isolation flaw (CVE-2026-15719)

메타데이터

항목 내용
CVE ID CVE-2026-15719
영향 제품 Mozilla Firefox 152.0.6 미만
영향 컴포넌트 DOM: Navigation / site isolation
심각도 Mozilla Critical
공개일 2026-07-14
수정 버전 Firefox 152.0.6
CVSS v3.1 CISA-ADP 5.4 Medium — AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
공개 악용 상태 Mozilla는 공개 exploit code를 인지하나, 실제 악용 사례는 인지하지 못했다고 밝힘
분석 기준 Mozilla MFSA·Firefox 소스 문서·NVD 공개 메타데이터. 보안 버그와 수정 diff는 접근 제한 상태

개요

CVE-2026-15719는 Firefox의 DOM Navigation 컴포넌트에서 site isolation을 우회할 수 있는 Critical 취약점이다. Mozilla는 공개 exploit code의 존재를 알고 있지만 실제 공격 사례는 알지 못한다고 밝혔으며, Firefox 152.0.6에서 수정했다. 공개 Bugzilla 항목은 권한 제한 상태라서 취약 함수, 재현 페이지, 영향받은 객체, 패치 diff는 확인할 수 없다.

이 취약점은 웹 브라우저의 site isolation이 단순히 "사이트마다 프로세스를 나눈다"는 설정이 아니라, 탐색 중에 어느 프로세스와 어떤 문서 상태가 더 이상 유효한지 정확히 교체하는 프로토콜임을 보여준다. 교차 사이트 탐색에서는 기존 문서·WindowGlobal·nsDocShell·IPC actor 일부가 폐기되고 새 프로세스/문서와 연결된다. 이 교체가 불완전하면 공격자 사이트의 콘텐츠 프로세스가 더 높은 권한의 브라우저 프로세스에 잘못된 상태를 받아들이게 하거나, 다른 site의 격리 상태를 침범할 가능성이 생긴다. 단, 이것은 취약점 분류와 공개 아키텍처를 결합한 경계 모델이며, CVE의 정확한 결함 순서를 뜻하지는 않는다.

사전 지식

Site isolation의 목표는 메모리 공간과 권한을 함께 나누는 것이다

Firefox의 content process는 웹 페이지의 HTML과 JavaScript를 실행하는 sandboxed 프로세스다. 반면 parent process는 프로필, UI, 프로세스 선택, 탐색 같은 핵심 기능을 담당하고, 다른 프로세스의 생성과 IPC 연결을 중개한다. Firefox 문서는 content process를 분리하면 HTML/JS가 손상되어도 브라우저와 나머지 시스템을 보호할 수 있고, site isolation은 서로 다른 site의 HTML/JS를 추가 프로세스로 분리한다고 설명한다.

                 Parent process (sandbox 밖)
          UI · navigation 결정 · process 선택 · IPC broker
                        │
       ┌────────────────┼────────────────┐
       ▼                ▼                ▼
 Content process A  Content process B  GPU / Socket 등
 site-a.example     site-b.example     특수 권한 기능
 sandboxed          sandboxed

여기서 격리는 "A가 B의 메모리를 읽을 수 없다"는 효과만을 뜻하지 않는다. parent process가 각 content process에 허용할 IPC와 remote type을 정하고, 신뢰할 수 없는 웹 콘텐츠가 parent process에서 로드되지 않도록 막는 것이 함께 필요하다. 따라서 격리 실패는 메모리 안전성 버그가 아니더라도, 잘못된 프로세스에 잘못된 권한이나 문서 상태가 연결되는 논리적 보안 경계 실패가 될 수 있다.

Navigation은 URL 교체가 아니라 객체 그래프의 교체다

페이지를 이동하면 이전 document만 사라지는 것이 아니다. Firefox DOM 탐색 문서는 탐색 방식에 따라 Document, WindowContext, WindowGlobal, nsDocShell, BrowserChild/BrowserParent, RemoteBrowser 등이 보존되거나 교체된다고 정리한다. 특히 cross-process navigation에서는 nsDocShell, WindowGlobal, browser actor와 원격 browser 연결이 교체된다.

같은 process 안의 navigation

Browser / BrowsingContext ────────── 유지
       │
       └─ Document, inner Window ─── 새 객체로 교체

cross-process navigation

Browser / BrowsingContext ────────── 일부 상위 식별성 유지
       │
       ├─ old content process A / old WindowGlobal ─ 폐기
       └─ new content process B / new WindowGlobal ─ 생성·연결

BrowsingContext처럼 탭과 frame의 지속적인 정체성을 나타내는 객체와, 한 번의 document를 나타내는 WindowGlobal/Document를 구분하는 이유가 여기에 있다. 상위 식별성은 history, 탭 UI, frame 관계를 위해 유지될 수 있지만, 이전 문서의 capability·IPC endpoint·script state가 새 문서로 무비판적으로 이어지면 안 된다.

Process switch는 신뢰 경계 재협상이다

Fission(site isolation)이 켜진 Firefox에서는 다른 site로 가는 탐색이 process switch를 필요로 할 수 있다. 공개 문서에 따르면 DocumentLoadListener가 process switch 필요 여부를 판단하고, 최종 document를 어느 process에 로드할지는 응답의 site·header와 현재 상태를 조합하는 ProcessIsolation.cpp 로직이 결정한다.

content process A                 parent process                 content process B
site-a.example                    navigation / isolation          site-b.example
      │ navigation request                │                               │
      ├──────────────────────────────────>│                               │
      │                                   │ response site·header 검사     │
      │                                   │ process B 선택                │
      │                                   ├──────────────────────────────>│
      │ old document/actor 종료           │                               │ new document 생성
      │<──────────────────────────────────┴──────── 새 연결만 전달 ───────┤

이때 유지해야 할 불변식은 다음과 같다.

  1. 새 document의 process 선택은 현재 탐색의 site와 응답 정책에 근거해야 한다.
  2. 이전 WindowGlobal과 IPC actor는 새 document를 대표하면 안 된다.
  3. parent process는 새 문서에 속하지 않는 content process 메시지와 capability를 거부해야 한다.
  4. process 전환·취소·history 복원처럼 비동기적으로 교차하는 경우에도 위 세 조건이 유지돼야 한다.

IPC actor의 수명은 탐색 객체 수명과 맞아야 한다

Firefox는 IPDL로 process 간 메시지와 actor를 모델링한다. actor는 양쪽 process에 쌍으로 있고, 문서나 frame에 종속된 actor는 해당 문서가 교체될 때 더는 유효하지 않아야 한다. IPC는 필요한 통신 수단이지만, 메시지를 받는 쪽이 "이 sender가 아직 이 문서·frame·process를 대표하는가"를 검증하지 않으면 종료된 문서의 권한이 새 문서까지 남는 confused-deputy 문제가 생길 수 있다.

안전한 actor 수명

old WindowGlobal ── owns ── old IPC actor ── navigation ──> destroy
                                                         │
new WindowGlobal ── owns ── new IPC actor <─────────────┘

위험한 상태

old actor / old capability ────────────────> new document 처리 경로에 재사용

이는 use-after-free와 다른 문제다. 객체가 메모리에서 살아 있어도, 보안상 이미 폐기되어야 할 문서의 identity와 권한을 계속 사용하면 site isolation은 깨질 수 있다. 반대로 CVE-2026-15719가 actor lifetime, process 선택, history, opener, response header 중 무엇에 해당하는지는 공개 자료만으로 알 수 없다.

취약점 분석

확인된 사실

  • Mozilla MFSA 2026-67은 CVE-2026-15719를 DOM: Navigation의 site isolation 취약점으로 분류하고 Critical impact를 부여했다.
  • 취약점은 Firefox 152.0.6에서 수정됐다.
  • Mozilla는 public exploit code를 인지하지만 in-the-wild abuse는 인지하지 못한다고 밝혔다.
  • NVD는 Firefox 152.0.6 미만을 영향 범위로 기록하고, CISA-ADP는 사용자 상호작용이 필요한 네트워크 공격 모델과 부분적 기밀성·무결성 영향을 평가했다.
  • 연결된 Bugzilla bug 2043820은 권한 제한으로 공개 기술 내용을 확인할 수 없었다.

취약점 동작 원리의 제한적 모델

패치 전 실제 코드 경로는 공개되지 않았다. 다음 그림은 공식 분류인 "site isolation in the DOM Navigation component"와 Firefox의 문서화된 탐색/프로세스 모델에서 도출한 검증해야 할 경계이지, 실제 exploit의 재현 절차가 아니다.

패치 전 가능한 경계 실패 모델 (추정)

[공격자 site A의 content process]
        │ 탐색·frame·window 상태 변화를 일으킴
        ▼
[DOM navigation / process-switch orchestration]
        │
        ├─ 정상: old document actor·capability 폐기
        │
        └─ 실패 가능성: 이전 문서/프로세스의 identity 또는 권한이
                         새 site B 문서의 상태와 잘못 연결됨
                                  │
                                  ▼
                    [site isolation 경계 약화]
                                  │
                                  ▼
                 다른 site 또는 더 높은 권한 경로에 대한
                 의도하지 않은 상태 접근·동작 가능성

핵심은 "새 URL이 보인다"는 사실만으로 process 전환이 완료됐다고 볼 수 없다는 점이다. 탐색은 요청 생성, 응답 검사, process 선택, old actor 종료, new actor 생성, history와 frame tree 반영이 서로 다른 시점에 이뤄지는 상태 전이이다. 이 전이 중 하나가 이전 document의 정체성을 새 document에 넘기거나, sender 검증 전에 메시지를 허용하면 공격자는 웹 콘텐츠로 이 경계를 교란할 표면을 얻는다.

Mozilla가 이 취약점을 site isolation으로 분류한 것은 위와 같은 문서·process 귀속 검증이 중요한 분석 축임을 보여 주지만, 실제로 어떤 불변식이 깨졌는지까지 공개한 것은 아니다. 특히 이를 메모리 손상, sandbox escape, cross-origin data read, 임의 코드 실행으로 단정해서는 안 된다. NVD의 현재 CISA-ADP 평가는 S:U와 부분적 C/I 영향이며, 정확한 보안 결과는 비공개 bug가 열리거나 Mozilla가 추가 설명을 낼 때까지 미확정이다.

왜 navigation 버그가 강한 보안 영향을 가질 수 있는가

웹 content process는 공격자가 제공한 HTML과 JavaScript를 실행한다. Firefox가 process를 분리하는 목적은 바로 그 코드가 손상되거나 적대적이어도 다른 site와 browser 핵심 기능에 영향을 주지 못하게 하는 것이다. 탐색 레이어는 서로 다른 process 사이에서 문서 상태를 넘기는 관문이므로, 여기서 identity 검증이 어긋나면 sandbox 내부의 적대적 페이지가 더 가치 있는 경로에 영향을 줄 수 있다.

정상
site A의 script ──> sandboxed process A ──X──> site B / parent 권한

경계 실패 시 위험
site A의 script ──> navigation 상태 혼동 ──> 잘못 연결된 actor·document·권한

이는 "탐색은 기능, isolation은 보안 기능"이라는 분리가 틀렸음을 뜻한다. process 선택과 문서 교체는 보안 정책을 실제로 집행하는 경로이며, 따라서 navigation code도 인증·권한 부여 코드와 같은 수준으로 오래된 상태와 경쟁 조건을 다뤄야 한다.

수정 방법

확인 가능한 조치는 Firefox를 152.0.6 이상으로 업데이트하는 것이다. Mozilla의 릴리스 노트는 152.0.6을 2026-07-14 Release 채널에 제공했으며, MFSA 2026-67은 이 버전을 수정 버전으로 명시한다. 조직 환경에서는 업데이트 정책이 적용됐는지와 실제 설치 버전이 152.0.6 이상인지 함께 확인해야 한다.

보안 bug와 패치 diff가 비공개이므로, 아래와 같은 구체적 패치 후 흐름 그림은 만들 수 없다. 예를 들어 actor 폐기 검증을 추가했는지, process 선택 조건을 고쳤는지, 탐색 취소의 순서를 바꿨는지는 확인되지 않았다. 이 빈칸을 일반적인 "강화 검증" 그림으로 채우면 실제 수정 메커니즘을 꾸며 내는 것이 된다.

운영상 보완책은 업데이트 전의 임시 수단일 뿐이다. Mozilla가 public exploit code의 존재를 알고 있다고 밝힌 이상, 신뢰할 수 없는 사이트 회피나 콘텐츠 차단만으로는 충분하지 않으며 업데이트가 우선이다. Bugzilla 공개 또는 후속 패치가 나오면 다음 항목을 재검증해야 한다.

  • 실제로 교체/보존된 DOM·IPC 객체와 깨진 불변식
  • 공격에 필요한 navigation, frame, opener, history, response-header 조건
  • isolation 우회의 정확한 영향 범위와 패치 후 regression test

PoC 관련 언급

Mozilla는 public exploit code의 존재를 인지한다고만 공개했다. 이 실행에서는 해당 코드의 위치·작성자·내용을 신뢰할 수 있는 공개 출처로 확인하지 못했으며, 어떤 코드도 내려받거나 실행하지 않았다. 따라서 본문은 exploit 구현을 근거로 삼지 않았고, 재현 단계도 제공하지 않는다.

미해결/불확실 지점

  • Bugzilla bug 2043820은 접근이 거부되어 실제 취약 함수, trigger, patch diff, regression test를 확인하지 못했다.
  • Mozilla의 "site isolation in the DOM: Navigation component" 분류는 확인됐지만, 구체적으로 process selection, actor lifetime, BrowsingContext 교체, history, opener 중 어느 불변식이 깨졌는지는 공개되지 않았다.
  • Mozilla가 언급한 public exploit code의 출처와 신뢰성은 독립적으로 검증하지 못했다.
  • NVD의 CISA-ADP CVSS는 현재 평가이며, Mozilla가 세부 영향을 공개하면 등급이나 해석이 달라질 수 있다.

참고 자료