
Firefox BrowsingContext 권한 부여 우회(CVE-2026-4692)에 대한 개념 증명 익스플로잇으로, 위조된 IPC 메시지를 통해 InRDMPane을 설정하고 권한 있는 UI 터치 이벤트 주입을 활성화하는 방법을 시연합니다.
BrowsingContext 필드 동기화의 누락된 권한 검사에 대한 개념 증명: 손상된 콘텐츠 프로세스가 자체 최상위 BrowsingContext에 InRDMPane = true를 설정하는 PContent::CommitBrowsingContextTransaction 메시지를 위조하고, 부모 프로세스가 이를 적용합니다.
대상: Firefox 149.0a1 nightly @ 2fbc0748c4 (취약, 수정 전), macOS arm64.
Firefox 149에서 수정됨 — 버그 2017643, 커밋 a9279ce332ed ("Prevent toggling RDM BrowsingContext flag from content processes"), 다음을 추가:
bool BrowsingContext::CanSet(FieldIndex<IDX_InRDMPane>, const bool&,
ContentParent* aSource) {
return XRE_IsParentProcess() && IsTop() && !aSource; // 콘텐츠에서 온 경우 거부
}
InRDMPane은 탭이 반응형 디자인 모드(RDM) 창임을 부모 프로세스에 알려줍니다. 부모 프로세스는 합성 터치 이벤트의 히트 테스트(BrowserParent::RecvDispatchTouchEvent) 시 이를 신뢰합니다: 명목상 RDM 창을 대상으로 하는 이벤트는 권한 있는 크롬 UI에 도달할 수 있습니다. 플래그를 설정한 손상된 콘텐츠 프로세스는 음수/콘텐츠 외 좌표로 터치 이벤트를 보내 사용자 상호작용 없이 권한 있는 UI를 클릭할 수 있습니다 (버그 2017643의 리포터 repro.patch 참조 — 패치된 빌드로 정확히 이를 시연합니다). 이 저장소는 실제 메시지 위조를 통해 활성화 경계 위반 자체를 시연합니다 — 브라우저 소스 패치는 없습니다.
PContent::CommitBrowsingContextTransaction — 메시지 유형 0x3a0137
(PContentMsgStart=58 << 16 | 서수 311), 라우팅 MSG_ROUTING_CONTROL
(INT64_MAX), 플래그 NOT_NESTED (0x001):
u64 bcid 센티널 235406151 ('aContext')
u64 0x0000000000800000 수정된 비트셋 워드0 (비트 23 = InRDMPane)
u64 0 비트셋 워드1 (BitSet<84> 워드는 size_t = u64!)
u32 1 WriteBool(true)
u32 523371752 센티널 'aTransaction'
u64 epoch (epoch 검사는 MOZ_ASSERT 전용; 여기서는 컴파일 제외)
u32 132121169 센티널 'aEpoch'
전달은 CVE-2026-74939 전송 경로를 재사용합니다: operator new →
IPC::Message::Message(routing, type, capacity, flags) → Pickle::WriteBytes →
PContent 채널의 MessageChannel::Send, wasm funcref-call 프리미티브(wasm-bytes.js, 1단계 = CVE-2026-2796)를 통해 JS에서 구동.
부모 측 로그 (MOZ_LOG=BrowsingContextSync:5) ./irun 실행 후:
D/BrowsingContextSync Transaction::Apply(#380000001, ipc): InRDMPane(false->true)
#380000001은 팝업의 최상위 BrowsingContext(자식 할당 ID, from IPC로 생성)이며, ipc는 트랜잭션이 콘텐츠에서 시작되었음을 표시합니다. 수정된 빌드에서는 동일한 메시지가 CanSet 검증에 실패하여 거부됩니다.
전제 조건: 취약한 Nightly 빌드 /Users/sid/gecko-2766/obj-browser,
psutil이 포함된 .venv, 번들된 로깅 서버 실행:
python3 srv.py > /tmp/srv4692.log 2>&1 & # 이 디렉토리를 :8781에서 서빙
python3 forge_bctx.py # bctx.bin/bctx.json 빌드
./irun # 실행 + 주입 + 증거 수집
a9279ce332ed (MFSA 2026-20, Firefox 149)../poc-cve-2026-74939)../poc-cve-2026-12295)| 파일 | 용도 |
|---|
bctx.html | PoC 페이지: 런타임에 팝업 BC ID를 계산하여 위조 메시지에 패치하고 전송 |
forge_bctx.py | bctx.bin/bctx.json 빌드(자체 검증), BC ID를 제외하고 완전히 정적 |
wasm-bytes.js | 1단계 프리미티브: 임의 읽기/쓰기, funcref 호출 |
mdrive2.py | 마리오네트 하네스 |
irun | 계측 실행: lldb 연결 + BrowsingContextSync 증거 |
srv.py | PoC 페이지용 로깅 웹 서버 (:8781) |
profile.user.js | Firefox 프로필 환경설정 (fission 켜짐, 덤프 활성화) |