[9] Don't log interaction from temporary gesture on storage access rejection
Severity: High | Component: WebCore DOM (Storage Access API) | 5021f99
gesture 없이 호출된 requestStorageAccess() rejection path에서 사용자 상호작용이 암묵적으로 기록되는 경로를 수정합니다. 기록된 상호작용을 ITP opener 휴리스틱이 동의로 해석하면, 프롬프트 없이 cross-site 쿠키 접근이 허용됩니다. High 분류 이유입니다.
enableTemporaryTimeUserGesture()는 기본값인 ProcessInteractionStyle::Immediate로 UserGestureIndicator를 생성합니다. 이 과정에서 합성 사용자 상호작용이 side effect로 기록됩니다. 이 함수는 rejection path에서 호출자가 window.open()을 계속 사용할 수 있도록 하는 용도로 쓰였습니다. 다만 rejection path에서 조작된 상호작용이 생성되면서 requestStorageAccessUnderOpener()가 유발되는 문제로 이어졌습니다.
Source/WebCore/dom/DocumentStorageAccess.cpp
- m_temporaryUserGesture = makeUnique<UserGestureIndicator>(IsProcessingUserGesture::Yes, protect(m_document).ptr());
+ m_temporaryUserGesture = makeUnique<UserGestureIndicator>(IsProcessingUserGesture::Yes, protect(m_document).ptr(), UserGestureType::ActivationTriggering, UserGestureIndicator::ProcessInteractionStyle::Never);
Patch Details
한 줄 변경으로 UserGestureType::ActivationTriggering과 ProcessInteractionStyle::Never를 명시적으로 전달합니다. gesture 기반 기능은 그대로 유지하면서 interaction 기록은 억제됩니다. 회귀 테스트는 cross-site iframe이 포함된 popup을 설치하며, gesture 없이 호출된 requestStorageAccess() rejection이 더 이상 storage access를 허용하지 않음을 검증합니다.
side effect가 없어야 할 용도로 사용된 side-effecting 헬퍼: 내부 제어 흐름 목적으로 생성된 임시 UserGestureIndicator가 사용자 상호작용 telemetry를 암묵적으로 방출하며, downstream privacy 휴리스틱이 이를 동의로 해석합니다.
Background
UserGestureIndicator는 코드 실행 구간을 "사용자 gesture 처리 중" 상태로 표시하는 RAII 헬퍼로, gesture 기반 API를 활성화하는 역할을 담당합니다. 생성자는 ProcessInteractionStyle 인자를 받는데, 이 값에 따라 동작이 달라집니다. Immediate를 전달하면 페이지 도메인에 사용자 상호작용 이벤트가 등록되는 side effect가 발생해 privacy telemetry에 기록됩니다. 반면 Never를 전달하면 gesture 상태만 활성화되며 telemetry 기록은 이루어지지 않습니다. document.requestStorageAccess()는 cross-site iframe이 first-party 쿠키 접근을 요청하는 API입니다. ITP(Resource Load Statistics)는 도메인별 상호작용을 추적하며, requestStorageAccessUnderOpener()는 해당 origin에 최근 상호작용 기록이 있고 popup에 opener가 존재하면 자동으로 storage access를 허용합니다.
Analysis
UserGestureIndicator는 논리적으로 분리 가능한 두 가지 역할을 수행합니다. gesture 범위를 표시하는 역할과 사용자 상호작용을 기록하는 역할입니다. 기본 생성자는 이 두 동작을 하나로 묶어두었습니다. 결과적으로 순수하게 내부 제어 흐름 목적으로만 헬퍼를 사용하던 호출자들이 의도치 않게 interaction 기록 동작까지 유발하게 된 셈입니다.
Aa Aaaaa Aaa Aaa Aaaaa Aaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaa Aa Aaaa Aaa Aaa Aaaaa Aaaaaaaaaa Aaa Aaaaaaaaaaaaaaaaaa Aaaaaaa Aaa Aa Aaaaaa Aaaaaaaa Aaaa Aaaaaaaaaa Aaaaaaa Aaa Aaaa Aaaaaa Aaaaaaa Aaaaaa Aaaa Aaa Aaaaaaa Aa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaa Aaaaaaaaaaaaa Aaaaaaaaa Aaaaaa Aa Aaaaaaaa Aa Aaaaa Aaaa Aaaa Aa Aaaaaa Aaaaa Aaaaaaaaaaaaaaaaa Aaa Aa Aaaa Aaa Aa Aaaaa Aaaa Aa Aaaaaaa Aaaaaaa Aa Aaaaaaa Aaaaaaa Aaaa Aaa Aaaaaa
a Aaaaaaaaaaaaaa Aaaa Aaaa Aaaaaaaaaaa Aaaaaaa Aaaaaaa Aaa Aa Aaa Aaaaaaa Aaaaaaa Aaaaaa Aaaa Aa Aaa Aaaaaaaaaa Aa Aaa Aaa Aaaa Aa Aa Aaaaa Aaa Aaaaa Aaaaa Aaa a Aaa Aa Aaa Aaaaa a Aa Aaaa Aaaaaaaaa Aaaaa Aa Aa Aaa Aaa a Aaaaaa
🔒The interaction between an internal control-flow helper and a privacy-heuristic telemetry channel is dissected — including how a rejection path ended up producing the very signal it was rejecting against.
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaaaaaaa Aaaa Aaaaaaa Aa Aa Aaa Aaa Aaaa Aaaaa Aaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaa Aa Aaa Aaaaa Aaa Aaa Aaaaaaaaa Aaaaaa Aaaaaaaaa Aaaaaa Aa Aaaaaaaa Aaa a Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaa Aaaaaa
a Aaaaaaaaaa Aaaa Aaaaaaaaaa Aaaaaa Aaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaa Aaaa Aaa Aa Aaaaaaaa a Aaaa Aaaa Aaa Aaaaa Aa Aaa Aaaaaaa Aa Aaaaaaaaaaaa Aaaaaaaaa Aaa Aaaa
a Aaaaa Aaaaaaaaaaa Aaa Aaa Aaa Aaaa Aaaaaaa Aaaaaaa Aaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaa Aaaaaa
a Aaaaa Aaaaaaa Aaaaaa Aaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aa Aaaa Aaa Aaa Aaa Aa Aa Aaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaa
🔒Several reusable audit patterns covering RAII helpers with hidden telemetry, ITP opener heuristics, and adjacent synthetic-gesture sites — with concrete WebKit subsystems to grep.
더 확인하려면 구독해 주세요