← All issues

[21] postMessage extends user gesture token lifetime

Severity: Medium / Medium | Component: WebCore LocalDOMWindow | 4f82ed3, 2050ddd

Medium으로 평가됩니다. diff는 LocalDOMWindow::processPostMessageUserGestureToken::hasExpired에 존재하던 TOCTOU를 수정합니다. 만료 확인과 gesture 소비 지점이 분리되어 있어, 두 시점 사이에 실제 시간이 경과할 수 있었습니다. 그 결과 1초를 방금 넘긴 token이 MessageEvent dispatch 중 UserGestureIndicator에 설치되는 상황이 가능했고, 이는 popup-blocker bypass로 이어질 수 있는 문제입니다.

두 commit은 동일한 수정을 각기 다른 브랜치에 반영한 것으로, 하나는 다른 쪽의 신속한 backport입니다. processPostMessage에서는 UserGestureIndicator 생성 직전에 userGestureToForward->hasExpired(maximumIntervalForUserGestureForwarding) 검사가 추가되어 재확인하도록 수정되었습니다.

Source/WebCore/page/LocalDOMWindow.cpp

if (userGestureToForward && userGestureToForward->hasExpired(UserGestureToken::maximumIntervalForUserGestureForwarding))
userGestureToForward = nullptr;
 
+ if (userGestureToForward && userGestureToForward->hasExpired(UserGestureToken::maximumIntervalForUserGestureForwarding))
+ userGestureToForward = nullptr;
+
UserGestureIndicator userGestureIndicator(userGestureToForward);

시간 기반 freshness predicate에 대한 TOCTOU: user-gesture 만료 확인 지점과 gesture 소비 지점이 분리되어 있었고, 그 사이에 실제 시간이 경과하는 것이 가능했습니다.

HTML/WebKit 정책상 전달된 gesture는 원래 상호작용으로부터 maximumIntervalForUserGestureForwarding(1초) 이내에서만 유효합니다. 패치 이전에는 검사가 소비 지점을 감싸지 않았기 때문에, 이 제한이 조용히 초과될 수 있었습니다. 이번 패치는 검사를 그대로 중복 추가하는 최소한의 수정입니다. 보다 근본적인 해결책은 해당 검사를 UserGestureIndicator의 constructor 안으로 이동시키는 것입니다.

🔒

How a one-line duplicated check restores the user-gesture forwarding cap, and the broader policy-bypass primitives at stake.

더 확인하려면 구독해 주세요

🔒

Multiple audit patterns identified for time-based capability tokens and RAII gesture helpers across WebKit, with concrete starting points for variant discovery.

더 확인하려면 구독해 주세요