← All issues

[9] Download Prompt Origin Spoofing via Back-Forward Navigation

Severity: Medium | Component: WebKit UIProcess | a9f2dfa

Medium으로 평가한 이유는 관찰 가능한 영향이 download prompt의 origin 오귀속(UI 수준의 신뢰 혼동)에 그치기 때문입니다. social engineering을 촉진하지만 code execution이나 memory corruption은 아닙니다. guard 추가 내용과 commit 메시지의 상세한 공격 시나리오 설명을 근거로 confidence를 0.88로 설정했습니다.

NavigationResponse::navigationInitiatingFrame()에 두 가지 early-return guard가 추가되었습니다. navigation에 targetItem()이 존재하는 경우(back-forward navigation)이거나 isRequestFromClientOrUserInput()이 참인 경우(사용자가 직접 입력한 URL 또는 client가 시작한 load), 이 메서드는 현재 표시된 페이지의 frame 정보를 반환하는 대신 nullptr을 반환합니다.

Source/WebKit/UIProcess/API/APINavigationResponse.cpp

FrameInfo* NavigationResponse::navigationInitiatingFrame()
{
if (!m_navigation)
return nullptr;
 
+ if (m_navigation->targetItem() || m_navigation->isRequestFromClientOrUserInput())
+ return nullptr;
+
auto& frameInfo = m_navigation->originatingFrameInfo();
if (!frameInfo)
return nullptr;
 
RefPtr frame = WebKit::WebFrameProxy::webFrame(frameInfo->frameID);
m_sourceFrame = FrameInfo::create(WebKit::FrameInfoData { *frameInfo });
return m_sourceFrame.get();
}

Tools/TestWebKitAPI/Tests/WebKit/WKWebView/Navigation.mm

+TEST(Navigation, NavigationInitiatingFrameInGoBackNavigation)
+{
+ ...
+ navigationDelegate.get().decidePolicyForNavigationResponse = ^(WKNavigationResponse *response, void (^completionHandler)(WKNavigationResponsePolicy)) {
+ EXPECT_NULL(response._navigationInitiatingFrame);
+ done = true;
+ completionHandler(WKNavigationResponsePolicyAllow);
+ };
+ [webView _clearBackForwardCache];
+ [webView goBack];
+ ...
+}

Back-forward 및 client-initiated navigation 유형에서 navigation 시작 frame의 origin 오귀속.

WebKit이 navigation response를 처리할 때, delegate 메서드 webView:decidePolicyForNavigationResponse:decisionHandler:를 호출하고 WKNavigationResponse 객체를 전달합니다. Safari 같은 embedding client는 이 response의 _navigationInitiatingFrame 속성을 통해 download나 navigation을 시작한 사이트를 표시할 수 있습니다. Navigation 객체는 여러 메타데이터를 추적합니다. originatingFrameInfo()는 navigation을 시작한 frame, targetItem()은 back-forward list navigation일 때 non-null, isRequestFromClientOrUserInput()은 embedding app이나 URL 직접 입력과 같은 사용자 입력으로 시작된 navigation일 때 true를 나타냅니다.

NavigationResponse::navigationInitiatingFrame()은 모든 navigation 유형에 대해 조건 없이 originating frame 정보를 반환했습니다. back-forward navigation과 client-initiated/user-input navigation의 경우, originating frame 정보는 navigation을 실제로 시작한 주체가 아니라 WebView에 현재 표시된 페이지를 참조합니다. commit 메시지는 구체적인 공격 시나리오를 다음과 같이 설명합니다. site1.com으로 이동한 뒤 site2.com으로 이동하고, 악성 스크립트가 개입해 download를 시작하면서 뒤로 이동하는 경우입니다. 이때 site2가 실제로 시작하지 않았음에도 불구하고 "site2.com wants to start a download"라는 prompt가 표시됩니다.

🔒

Explores the origin attribution logic and how navigation type metadata can be weaponized for UI-level spoofing

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

🔒

Multiple audit directions identified for navigation origin attribution patterns across WebKit's UIProcess delegate APIs

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