[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로 설정했습니다.
Patch Details
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 오귀속.
Background
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를 나타냅니다.
Analysis
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가 표시됩니다.
Aaaaaaaaaa Aaaaaaa Aaa a Aa Aaaaaa Aaaaaaaaaaaa Aaaaaaaaaa Aa Aa Aaaa Aaaa Aa Aaa Aa Aaaaaaaaa Aaaaa Aa Aaaaaa Aaaaaaaa Aaaaaaa Aaa a Aa Aa Aaaa Aaa Aaaaa Aa a Aaaaa Aaa Aaa Aa Aaaaaa Aaaaaaaaaaaaa Aaaa a Aaa Aaaaaa Aaaaaaaaaa Aaaa Aaaaa Aaaa Aaaa Aaa a Aaaaa
a Aaaaaaaaaaaaaa Aaaaaaa Aaa Aaa Aaaaaaa Aaaaaa Aaaaaaaaaaa Aaa Aa Aaa Aaaaaaa Aaaa Aaaa Aaaaaaaa Aaa Aaa Aaa Aa Aaaaaaaaa Aaaa Aaa Aaaa Aaaaaa Aaaaaaaaaaa Aaa Aaaaaa
🔒Explores the origin attribution logic and how navigation type metadata can be weaponized for UI-level spoofing
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaaaaaaaa Aa Aaa Aa Aaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaaaa Aaaaaa Aaaaaaaaaaaaaa Aaaaaaaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aa Aaa Aaa Aaaaaaaaaaaaa Aaaaaaa Aaaaaaaaa Aaaaaaaaaaaaaaaa Aaaaaaaaaa Aaa Aa Aaa Aaaa Aaaaaa Aaaaa Aa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaa
a Aaaaaaa Aaaaaaaaaaa Aaaaaa Aaaa Aa Aa Aaaaaa Aaaaaa Aaaaaaaaaa Aa Aaa Aa Aaa Aaaaaaaaaaaa Aaaa Aaaa Aa Aaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaa Aa Aaaaaaaa Aaaaa Aaa Aaa Aaaaa
a Aaaaaaaaaa Aaaaaaa Aaaaaaa Aaaaaaaaaaaa Aaaaaaaaaaa Aaaaaaaa Aaaaa Aaaaaa Aaaaaaaaa Aaaaa Aaa Aaaaaaaaaaaaaaa Aaa Aaaa Aaaaa Aaa Aaaa Aa Aaaaaaaaa Aaa a Aaaaaaaaaa Aaa Aaaaaa Aaaaa Aaaaaa
🔒Multiple audit directions identified for navigation origin attribution patterns across WebKit's UIProcess delegate APIs
더 확인하려면 구독해 주세요