⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 294371 in webkit


Ignore:
Timestamp:
May 17, 2022, 5:55:16 PM (4 years ago)
Author:
commit-queue@webkit.org
Message:

Private relay should fail closed for third party loads if the main resource was loaded over private relay
​https://bugs.webkit.org/show_bug.cgi?id=240483
<rdar://92697007>

Patch by Alex Christensen <​achristensen@webkit.org> on 2022-05-17
Reviewed by Chris Dumez.

This re-lands the change from r293861 along with r293481 which should fix problems related to rdar://92336270
along with r293591 which should fix performance regressions related to rdar://92458995 but was insufficient.
During a basic browsing test, I found two more places where we were making a NetworkDataTask without setting the
parameters' top origin, one in the SpeculativeLoad constructor and another in WebLoaderStrategy::preconnectTo.

  • Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp:

(WebKit::NetworkCORSPreflightChecker::startPreflight):

  • Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp:

(WebKit::NetworkCache::SpeculativeLoad::SpeculativeLoad):

  • Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm:

(WebKit::NetworkDataTaskCocoa::NetworkDataTaskCocoa):

  • Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm:

(-[WKNetworkSessionDelegate URLSession:dataTask:didReceiveResponse:completionHandler:]):
(WebKit::NetworkSessionCocoa::createWebSocketTask):

  • Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp:

(WebKit::WebLoaderStrategy::preconnectTo):

Location:
trunk/Source/WebKit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/NetworkProcess/NetworkCORSPreflightChecker.cpp

    r293628 r294371  
    7676
    7777    loadParameters.webPageProxyID = m_parameters.webPageProxyID;
     78    loadParameters.topOrigin = m_parameters.topOrigin;
     79    loadParameters.sourceOrigin = m_parameters.sourceOrigin.ptr();
    7880
    7981    if (auto* networkSession = m_networkProcess->networkSession(m_parameters.sessionID)) {
  • trunk/Source/WebKit/NetworkProcess/cache/NetworkCacheSpeculativeLoad.cpp

    r289134 r294371  
    6868    parameters.contentEncodingSniffingPolicy = ContentEncodingSniffingPolicy::Sniff;
    6969    parameters.request = m_originalRequest;
     70    parameters.topOrigin = SecurityOrigin::create(m_originalRequest.firstPartyForCookies());
    7071    parameters.isNavigatingToAppBoundDomain = isNavigatingToAppBoundDomain;
    7172    m_networkLoad = makeUnique<NetworkLoad>(*this, nullptr, WTFMove(parameters), *networkSession);
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkDataTaskCocoa.mm

    r294261 r294371  
    340340    RetainPtr<NSURLRequest> nsRequest = request.nsURLRequest(WebCore::HTTPBodyUpdatePolicy::UpdateHTTPBody);
    341341    RetainPtr<NSMutableURLRequest> mutableRequest = adoptNS([nsRequest.get() mutableCopy]);
     342
     343    if (parameters.isMainFrameNavigation
     344        || parameters.hadMainFrameMainResourcePrivateRelayed
     345        || !parameters.topOrigin
     346        || request.url().host() == parameters.topOrigin->host()) {
     347        if ([mutableRequest respondsToSelector:@selector(_setPrivacyProxyFailClosedForUnreachableNonMainHosts:)])
     348            [mutableRequest _setPrivacyProxyFailClosedForUnreachableNonMainHosts:YES];
     349    }
    342350
    343351#if ENABLE(APP_PRIVACY_REPORT)
  • trunk/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm

    r294261 r294371  
    937937        NSURLSessionTaskTransactionMetrics *metrics = taskMetrics.transactionMetrics.lastObject;
    938938#if HAVE(NETWORK_CONNECTION_PRIVACY_STANCE)
    939         auto privateRelayed = metrics._privacyStance == nw_connection_privacy_stance_direct ? PrivateRelayed::No : PrivateRelayed::Yes;
     939        auto privateRelayed = metrics._privacyStance == nw_connection_privacy_stance_direct
     940            || metrics._privacyStance == nw_connection_privacy_stance_not_eligible
     941            ? PrivateRelayed::No : PrivateRelayed::Yes;
    940942#else
    941943        auto privateRelayed = PrivateRelayed::No;
    … …  
    17131715#endif
    17141716
     1717    // FIXME: This function can make up to 3 copies of a request.
     1718    // Reduce that to one if the protocol is null, the request isn't app initiated,
     1719    // or the main frame main resource was private relayed, then set all properties
     1720    // on the one copy.
     1721    if (hadMainFrameMainResourcePrivateRelayed || request.url().host() == clientOrigin.topOrigin.host) {
     1722        RetainPtr<NSMutableURLRequest> mutableRequest = adoptNS([nsRequest.get() mutableCopy]);
     1723        if ([mutableRequest respondsToSelector:@selector(_setPrivacyProxyFailClosedForUnreachableNonMainHosts:)])
     1724            [mutableRequest _setPrivacyProxyFailClosedForUnreachableNonMainHosts:YES];
     1725        nsRequest = WTFMove(mutableRequest);
     1726    }
     1727
    17151728    auto& sessionSet = sessionSetForPage(webPageProxyID);
    17161729    RetainPtr<NSURLSessionWebSocketTask> task = [sessionSet.sessionWithCredentialStorage.session webSocketTaskWithRequest:nsRequest.get()];
  • trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp

    r293368 r294371  
    830830    }
    831831
     832    NetworkResourceLoadParameters parameters;
     833
    832834    if (auto* document = webPage.mainFrame()->document()) {
    833835        if (shouldPreconnectAsFirstParty == ShouldPreconnectAsFirstParty::Yes)
    … …  
    837839        if (auto* loader = document->loader())
    838840            request.setIsAppInitiated(loader->lastNavigationWasAppInitiated());
    839     }
    840 
    841     NetworkResourceLoadParameters parameters;
     841        parameters.topOrigin = &document->topOrigin();
     842        parameters.sourceOrigin = &document->securityOrigin();
     843    }
     844
    842845    parameters.request = WTFMove(request);
    843846    if (parameters.request.httpUserAgent().isEmpty()) {
Note: See TracChangeset for help on using the changeset viewer.