
Firefox 콘텐츠-부모 간 IPDL 권한 상승 (N-day, bug 2054416): RemoteTypeOverride가 포함된 위조된 PDocumentChannel -> 손상된 콘텐츠 프로세스의 mojo-port send-path 주입을 통한 권한 있는 about 프로세스 배치
Firefox 149.0a1 nightly(2fbc0748c4, 수정 전)의 샌드박스 탈출에 대한 개념 증명입니다. 손상된 콘텐츠 프로세스가 IPDL 메시지를 위조하여 부모 프로세스가 페이지를 권한 있는(privilegedabout) 프로세스로 로드하게 만듭니다.
이것은 스테이지-2 샌드박스 탈출로, 콘텐츠 프로세스 RCE(예: CVE-2026-2796) 이후에 체이닝되도록 설계되었습니다.
부모 프로세스는 콘텐츠→부모 IPDL 메시지에서 nsDocShellLoadState를 역직렬화합니다. 취약한 빌드는 콘텐츠가 설정한 RemoteTypeOverride 필드를 거부하지 않으므로, 콘텐츠가 탐색이 어떤 프로세스 유형에 도달할지를 선택할 수 있습니다.
수정(커밋 3ec5c71b41bb, "Validate RemoteTypeOverride")은 nsDocShellLoadState 생성자가 콘텐츠가 트리거한 로드에 대한 모든 override를 거부하게 만듭니다.
override가 수용되면 — about:blank의 문서 로드, 최상위 컨텍스트 — IsolationOptionsForNavigation은 로드의 원격 유형을 override 값으로 설정하고, 페이지는 권한 있는 프로세스에 배치됩니다. 샌드박스 경계가 위반됩니다.
override는 PNecko::PDocumentChannel에 실려 전달됩니다. 이 메시지는 모든 콘텐츠 프로세스가 각 문서 로드에 대해 보내는 메시지입니다(DocumentChannelCreationArgs.loadState는 nsDocShellLoadState입니다).
전달 과정이 흥미로운 부분입니다. IPC 소켓에 대한 직접 쓰기는 조용히 버려집니다. IPDL 메시지는 이제 mojo 포트를 통해 전달되기 때문입니다. 대신 PoC는 네이티브 호출을 통해 JavaScript에서 실제 전송 경로를 구동합니다(CVE-2026-2796 funcref 프리미티브 사용):
operator new — IPC::Message용 힙 블록 할당IPC::Message::Message(routing, type, capacity, flags) — 배치 생성자Pickle::WriteBytes — 위조된 페이로드 추가MessageChannel::Send — mojo 프레이밍, 포트 라우팅 및 시퀀스 번호는 모두 네이티브로 처리됨페이로드(forge.py에 의해 생성)는 RemoteTypeOverride = "privilegedabout", URI about:blank, null 주체, 런타임에 유출된 값들(BrowsingContext id, TriggeringRemoteType)을 담고 있습니다.
./irun
부모 측 로그(MOZ_LOG=ProcessIsolation:5,DocumentChannel:5)는 권한 있는 프로세스로의 프로세스 전환을 보여줍니다:
V/ProcessIsolation using remote type override (privilegedabout) for load
I/ProcessIsolation Process Switch: Changing Remoteness from 'webIsolated=http://127.0.0.1' to 'privilegedabout'
3ec5c71b41bb "Validate RemoteTypeOverride"| 파일 | 용도 |
|---|
privesc.html | PoC 페이지, 손상된 콘텐츠 프로세스 내에서 실행 |
forge.py / forge.json | 위조된 IPDL 메시지 생성(자체 검증) |
wasm-bytes.js | 스테이지-1 프리미티브: 임의 읽기/쓰기, funcref 호출 |
mdrive.py / mdrive2.py | Nightly를 실행하고 구동하는 마리오네트 하네스 |
irun | 계측 실행: 부모에 lldb 연결 + MOZ_LOG 증거 |
profile.user.js | Firefox 프로필 환경설정(fission 켜짐, 덤프 활성화) |
parse_dc.py | 캡처된 DocumentChannel 메시지용 바이트 정밀 파서 |
scan_sentinels.py / extract_fields.py | 캡처용 필드 맵 스캐너 |