Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Check the correct network connection integrity policy after a navigation #9955

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions Source/WebCore/dom/Document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3579,7 +3579,7 @@ const URL& Document::urlForBindings() const
return false;

auto* topDocumentLoader = topDocument().loader();
if (!topDocumentLoader || !topDocumentLoader->networkConnectionIntegrityPolicy().contains(NetworkConnectionIntegrity::Enabled))
if (!topDocumentLoader || !topDocumentLoader->originatorNetworkConnectionIntegrityPolicy().contains(NetworkConnectionIntegrity::Enabled))
return false;

auto preNavigationURL = loader()->originalRequest().httpReferrer();
Expand Down Expand Up @@ -5581,7 +5581,7 @@ String Document::referrer()
String Document::referrerForBindings()
{
if (auto* loader = topDocument().loader(); loader
&& loader->networkConnectionIntegrityPolicy().contains(WebCore::NetworkConnectionIntegrity::Enabled)
&& loader->originatorNetworkConnectionIntegrityPolicy().contains(WebCore::NetworkConnectionIntegrity::Enabled)
&& !RegistrableDomain { URL { frame()->loader().referrer() } }.matches(securityOrigin().data()))
return String();
return referrer();
Expand Down
4 changes: 4 additions & 0 deletions Source/WebCore/loader/DocumentLoader.h
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,9 @@ class DocumentLoader
void setNetworkConnectionIntegrityPolicy(OptionSet<NetworkConnectionIntegrity> policy) { m_networkConnectionIntegrityPolicy = policy; }
OptionSet<NetworkConnectionIntegrity> networkConnectionIntegrityPolicy() const { return m_networkConnectionIntegrityPolicy; }

void setOriginatorNetworkConnectionIntegrityPolicy(OptionSet<NetworkConnectionIntegrity> policy) { m_originatorNetworkConnectionIntegrityPolicy = policy; }
OptionSet<NetworkConnectionIntegrity> originatorNetworkConnectionIntegrityPolicy() const { return m_originatorNetworkConnectionIntegrityPolicy; }

void setIdempotentModeAutosizingOnlyHonorsPercentages(bool idempotentModeAutosizingOnlyHonorsPercentages) { m_idempotentModeAutosizingOnlyHonorsPercentages = idempotentModeAutosizingOnlyHonorsPercentages; }
bool idempotentModeAutosizingOnlyHonorsPercentages() const { return m_idempotentModeAutosizingOnlyHonorsPercentages; }

Expand Down Expand Up @@ -694,6 +697,7 @@ class DocumentLoader
#endif

OptionSet<NetworkConnectionIntegrity> m_networkConnectionIntegrityPolicy;
OptionSet<NetworkConnectionIntegrity> m_originatorNetworkConnectionIntegrityPolicy;
AutoplayPolicy m_autoplayPolicy { AutoplayPolicy::Default };
OptionSet<AutoplayQuirk> m_allowedAutoplayQuirks;
PopUpPolicy m_popUpPolicy { PopUpPolicy::Default };
Expand Down
5 changes: 5 additions & 0 deletions Source/WebCore/loader/FrameLoadRequest.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#pragma once

#include "FrameLoaderTypes.h"
#include "NetworkConnectionIntegrity.h"
#include "ReferrerPolicy.h"
#include "ResourceRequest.h"
#include "ShouldTreatAsContinuingLoad.h"
Expand Down Expand Up @@ -105,6 +106,9 @@ class FrameLoadRequest {
void setIsRequestFromClientOrUserInput() { m_isRequestFromClientOrUserInput = true; }
bool isRequestFromClientOrUserInput() const { return m_isRequestFromClientOrUserInput; }

void setNetworkConnectionIntegrityPolicy(OptionSet<NetworkConnectionIntegrity> policy) { m_networkConnectionIntegrityPolicy = policy; }
OptionSet<NetworkConnectionIntegrity> networkConnectionIntegrityPolicy() const { return m_networkConnectionIntegrityPolicy; }

private:
Ref<Document> m_requester;
Ref<SecurityOrigin> m_requesterSecurityOrigin;
Expand All @@ -126,6 +130,7 @@ class FrameLoadRequest {
InitiatedByMainFrame m_initiatedByMainFrame { InitiatedByMainFrame::Unknown };
bool m_isRequestFromClientOrUserInput { false };
bool m_isInitialFrameSrcLoad { false };
OptionSet<NetworkConnectionIntegrity> m_networkConnectionIntegrityPolicy;
};

} // namespace WebCore
1 change: 1 addition & 0 deletions Source/WebCore/loader/FrameLoader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1549,6 +1549,7 @@ void FrameLoader::load(FrameLoadRequest&& request)
Ref<DocumentLoader> loader = m_client->createDocumentLoader(request.resourceRequest(), request.substituteData());
loader->setIsRequestFromClientOrUserInput(request.isRequestFromClientOrUserInput());
loader->setIsContinuingLoadAfterProvisionalLoadStarted(request.shouldTreatAsContinuingLoad() == ShouldTreatAsContinuingLoad::YesAfterProvisionalLoadStarted);
loader->setOriginatorNetworkConnectionIntegrityPolicy(request.networkConnectionIntegrityPolicy());
addSameSiteInfoToRequestIfNeeded(loader->request());
applyShouldOpenExternalURLsPolicyToNewDocumentLoader(m_frame, loader, request);

Expand Down
4 changes: 4 additions & 0 deletions Source/WebKit/Shared/LoadParameters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ void LoadParameters::encode(IPC::Encoder& encoder) const
encoder << existingNetworkResourceLoadIdentifierToResume;
encoder << isServiceWorkerLoad;
encoder << sessionHistoryVisibility;
encoder << networkConnectionIntegrityPolicy;
platformEncode(encoder);
}

Expand Down Expand Up @@ -173,6 +174,9 @@ bool LoadParameters::decode(IPC::Decoder& decoder, LoadParameters& data)
if (!decoder.decode(data.sessionHistoryVisibility))
return false;

if (!decoder.decode(data.networkConnectionIntegrityPolicy))
return false;

if (!platformDecode(decoder, data))
return false;

Expand Down
3 changes: 3 additions & 0 deletions Source/WebKit/Shared/LoadParameters.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "WebsitePoliciesData.h"
#include <WebCore/FrameIdentifier.h>
#include <WebCore/FrameLoaderTypes.h>
#include <WebCore/NetworkConnectionIntegrity.h>
#include <WebCore/ResourceRequest.h>
#include <WebCore/ShouldTreatAsContinuingLoad.h>
#include <WebCore/SubstituteData.h>
Expand Down Expand Up @@ -100,6 +101,8 @@ struct LoadParameters {
#endif // PLATFORM(IOS)
#endif // !ENABLE(CONTENT_FILTERING_IN_NETWORKING_PROCESS)
#endif

OptionSet<WebCore::NetworkConnectionIntegrity> networkConnectionIntegrityPolicy;
};

} // namespace WebKit
2 changes: 2 additions & 0 deletions Source/WebKit/Shared/NavigationActionData.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <WebCore/BackForwardItemIdentifier.h>
#include <WebCore/FloatPoint.h>
#include <WebCore/FrameLoaderTypes.h>
#include <WebCore/NetworkConnectionIntegrity.h>
#include <WebCore/PrivateClickMeasurement.h>
#include <WebCore/SecurityOriginData.h>

Expand Down Expand Up @@ -68,6 +69,7 @@ struct NavigationActionData {
WTF::String clientRedirectSourceForHistory;
WebCore::SandboxFlags effectiveSandboxFlags { 0 };
std::optional<WebCore::PrivateClickMeasurement> privateClickMeasurement;
OptionSet<WebCore::NetworkConnectionIntegrity> networkConnectionIntegrityPolicy;
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
std::optional<WebKit::WebHitTestResultData> webHitTestResultData;
#endif
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/Shared/NavigationActionData.serialization.in
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ struct WebKit::NavigationActionData {
WTF::String clientRedirectSourceForHistory;
WebCore::SandboxFlags effectiveSandboxFlags;
std::optional<WebCore::PrivateClickMeasurement> privateClickMeasurement;
OptionSet<WebCore::NetworkConnectionIntegrity> networkConnectionIntegrityPolicy;
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
std::optional<WebKit::WebHitTestResultData> webHitTestResultData;
#endif
Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/Shared/WebsitePoliciesData.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ void WebsitePoliciesData::applyToDocumentLoader(WebsitePoliciesData&& websitePol
documentLoader.setColorSchemePreference(websitePolicies.colorSchemePreference);
documentLoader.setAllowContentChangeObserverQuirk(websitePolicies.allowContentChangeObserverQuirk);
documentLoader.setNetworkConnectionIntegrityPolicy(websitePolicies.networkConnectionIntegrityPolicy);
documentLoader.setOriginatorNetworkConnectionIntegrityPolicy(websitePolicies.networkConnectionIntegrityPolicy);
documentLoader.setIdempotentModeAutosizingOnlyHonorsPercentages(websitePolicies.idempotentModeAutosizingOnlyHonorsPercentages);

if (!documentLoader.frame())
Expand Down
5 changes: 5 additions & 0 deletions Source/WebKit/UIProcess/API/APINavigation.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include "ProcessThrottler.h"
#include "WebBackForwardListItem.h"
#include "WebContentMode.h"
#include <WebCore/NetworkConnectionIntegrity.h>
#include <WebCore/PrivateClickMeasurement.h>
#include <WebCore/ProcessIdentifier.h>
#include <WebCore/ResourceRequest.h>
Expand Down Expand Up @@ -166,6 +167,9 @@ class Navigation : public ObjectImpl<Object::Type::Navigation> {
void setWebsitePolicies(RefPtr<API::WebsitePolicies>&& policies) { m_websitePolicies = WTFMove(policies); }
API::WebsitePolicies* websitePolicies() { return m_websitePolicies.get(); }

void setOriginatorNetworkConnectionIntegrityPolicy(OptionSet<WebCore::NetworkConnectionIntegrity> networkConnectionIntegrityPolicy) { m_originatorNetworkConnectionIntegrityPolicy = networkConnectionIntegrityPolicy; }
OptionSet<WebCore::NetworkConnectionIntegrity> originatorNetworkConnectionIntegrityPolicy() const { return m_originatorNetworkConnectionIntegrityPolicy; }

private:
explicit Navigation(WebKit::WebNavigationState&);
Navigation(WebKit::WebNavigationState&, WebKit::WebBackForwardListItem*);
Expand Down Expand Up @@ -193,6 +197,7 @@ class Navigation : public ObjectImpl<Object::Type::Navigation> {
WebKit::ProcessThrottler::TimedActivity m_clientNavigationActivity;
bool m_isLoadedWithNavigationShared { false };
RefPtr<API::WebsitePolicies> m_websitePolicies;
OptionSet<WebCore::NetworkConnectionIntegrity> m_originatorNetworkConnectionIntegrityPolicy;
};

} // namespace API
2 changes: 2 additions & 0 deletions Source/WebKit/UIProcess/WebPageProxy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1607,6 +1607,7 @@ void WebPageProxy::loadRequestWithNavigationShared(Ref<WebProcessProxy>&& proces
loadParameters.effectiveSandboxFlags = navigation.effectiveSandboxFlags();
loadParameters.isNavigatingToAppBoundDomain = isNavigatingToAppBoundDomain;
loadParameters.existingNetworkResourceLoadIdentifierToResume = existingNetworkResourceLoadIdentifierToResume;
loadParameters.networkConnectionIntegrityPolicy = navigation.originatorNetworkConnectionIntegrityPolicy();
maybeInitializeSandboxExtensionHandle(process, url, internals().pageLoadState.resourceDirectoryURL(), loadParameters.sandboxExtensionHandle);

prepareToLoadWebPage(process, loadParameters);
Expand Down Expand Up @@ -6102,6 +6103,7 @@ void WebPageProxy::decidePolicyForNavigationAction(Ref<WebProcessProxy>&& proces
navigation->setLastNavigationAction(navigationActionData);
navigation->setOriginatingFrameInfo(originatingFrameInfoData);
navigation->setDestinationFrameSecurityOrigin(frameInfo.securityOrigin);
navigation->setOriginatorNetworkConnectionIntegrityPolicy(navigationActionData.networkConnectionIntegrityPolicy);

API::Navigation* mainFrameNavigation = frame.isMainFrame() ? navigation.get() : nullptr;
auto* originatingFrame = originatingFrameInfoData.frameID ? WebFrameProxy::webFrame(*originatingFrameInfoData.frameID) : nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@ Page* WebChromeClient::createWindow(LocalFrame& frame, const WindowFeatures& win
{ }, /* clientRedirectSourceForHistory */
0, /* effectiveSandboxFlags */
navigationAction.privateClickMeasurement(),
{ }, /* networkConnectionIntegrityPolicy */
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
std::nullopt, /* webHitTestResultData */
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,7 @@ void WebFrameLoaderClient::didSameDocumentNavigationForFrameViaJSHistoryAPI(Same
{ }, /* clientRedirectSourceForHistory */
0, /* effectiveSandboxFlags */
std::nullopt, /* privateClickMeasurement */
{ }, /* networkConnectionIntegrityPolicy */
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
std::nullopt, /* webHitTestResultData */
#endif
Expand Down Expand Up @@ -985,6 +986,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const Navigati
{ }, /* clientRedirectSourceForHistory */
0, /* effectiveSandboxFlags */
navigationAction.privateClickMeasurement(),
{ }, /* networkConnectionIntegrityPolicy */
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
webHitTestResultDataInNavigationActionData(navigationAction, navigationActionData, m_frame->coreFrame()),
#endif
Expand Down Expand Up @@ -1102,6 +1104,7 @@ void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const Navigat
documentLoader->clientRedirectSourceForHistory(),
coreFrame->loader().effectiveSandboxFlags(),
navigationAction.privateClickMeasurement(),
requestingFrame ? requestingFrame->networkConnectionIntegrityPolicy() : OptionSet<NetworkConnectionIntegrity> { },
#if PLATFORM(MAC) || HAVE(UIKIT_WITH_MOUSE_SUPPORT)
webHitTestResultDataInNavigationActionData(navigationAction, navigationActionData, coreFrame.get()),
#endif
Expand Down
17 changes: 17 additions & 0 deletions Source/WebKit/WebProcess/WebPage/WebFrame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1113,4 +1113,21 @@ uint64_t WebFrame::messageSenderDestinationID() const
return m_frameID.object().toUInt64();
}

OptionSet<WebCore::NetworkConnectionIntegrity> WebFrame::networkConnectionIntegrityPolicy() const
{
auto* coreFrame = this->coreFrame();
if (!coreFrame)
return { };

auto* document = coreFrame->document();
if (!document)
return { };

auto* topDocumentLoader = document->topDocument().loader();
if (!topDocumentLoader)
return { };

return topDocumentLoader->networkConnectionIntegrityPolicy();
}

} // namespace WebKit
2 changes: 2 additions & 0 deletions Source/WebKit/WebProcess/WebPage/WebFrame.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <WebCore/FrameLoaderTypes.h>
#include <WebCore/HitTestRequest.h>
#include <WebCore/LayerHostingContextIdentifier.h>
#include <WebCore/NetworkConnectionIntegrity.h>
#include <WebCore/ProcessIdentifier.h>
#include <wtf/Forward.h>
#include <wtf/HashMap.h>
Expand Down Expand Up @@ -223,6 +224,7 @@ class WebFrame : public API::ObjectImpl<API::Object::Type::BundleFrame>, public

Markable<WebCore::LayerHostingContextIdentifier> layerHostingContextIdentifier() { return m_layerHostingContextIdentifier; }

OptionSet<WebCore::NetworkConnectionIntegrity> networkConnectionIntegrityPolicy() const;
private:
WebFrame(WebPage&);

Expand Down
1 change: 1 addition & 0 deletions Source/WebKit/WebProcess/WebPage/WebPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1866,6 +1866,7 @@ void WebPage::loadRequest(LoadParameters&& loadParameters)
frameLoadRequest.setLockBackForwardList(loadParameters.lockBackForwardList);
frameLoadRequest.setClientRedirectSourceForHistory(loadParameters.clientRedirectSourceForHistory);
frameLoadRequest.setIsRequestFromClientOrUserInput();
frameLoadRequest.setNetworkConnectionIntegrityPolicy(loadParameters.networkConnectionIntegrityPolicy);

if (loadParameters.effectiveSandboxFlags) {
if (auto* localMainFrame = dynamicDowncast<LocalFrame>(corePage()->mainFrame()))
Expand Down