12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Shelley Vohr <[email protected]>
- Date: Mon, 29 Aug 2022 11:44:57 +0200
- Subject: fix: crash loading non-standard schemes in iframes
- This fixes a crash that occurs when loading non-standard schemes from
- iframes or webviews. This was happening because
- ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin contains explicit
- exceptions to allow built-in non-standard schemes, but does not check
- for non-standard schemes registered by the embedder.
- This patch adjusts the origin calculation for non-standard schemes in
- - browser process at `NavigationRequest::GetOriginForURLLoaderFactoryUncheckedWithDebugInfo`
- - render process at `DocumentLoader::CalculateOrigin`
- When top level frame navigates to non-standard scheme url, the origin is calculated
- as `null` without any derivation. It is only in cases where there is a `initiator_origin`
- then the origin is derived from it, which is usually the case for renderer initiated
- navigations and iframes are no exceptions from this rule.
- Upstream bug https://bugs.chromium.org/p/chromium/issues/detail?id=1081397.
- Upstreamed at https://chromium-review.googlesource.com/c/chromium/src/+/3856266.
- diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
- index 8153ca434b396423ee36af27e8600be43e095c0f..8c1c72d7f3d4abef48bd0d3e632f427dec3ed88d 100644
- --- a/content/browser/renderer_host/navigation_request.cc
- +++ b/content/browser/renderer_host/navigation_request.cc
- @@ -10830,6 +10830,12 @@ NavigationRequest::GetOriginForURLLoaderFactoryUncheckedWithDebugInfo() {
- "blob");
- }
-
- + if (!common_params().url.IsStandard()) {
- + return std::make_pair(url::Origin::Resolve(common_params().url,
- + url::Origin()),
- + "url_non_standard");
- + }
- +
- // In cases not covered above, URLLoaderFactory should be associated with the
- // origin of |common_params.url| and/or |common_params.initiator_origin|.
- url::Origin resolved_origin = url::Origin::Resolve(
- diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
- index fb11dcea26684440b7b08fe5ca4da619ac4ccb5c..bd3591e3d6f1ee66c31897cdfd1994510a8ebe52 100644
- --- a/third_party/blink/renderer/core/loader/document_loader.cc
- +++ b/third_party/blink/renderer/core/loader/document_loader.cc
- @@ -2308,6 +2308,10 @@ Frame* DocumentLoader::CalculateOwnerFrame() {
- scoped_refptr<SecurityOrigin> DocumentLoader::CalculateOrigin(
- Document* owner_document) {
- scoped_refptr<SecurityOrigin> origin;
- + bool is_standard = false;
- + std::string protocol = url_.Protocol().Ascii();
- + is_standard = url::IsStandard(
- + protocol.data(), url::Component(0, static_cast<int>(protocol.size())));
- StringBuilder debug_info_builder;
- // Whether the origin is newly created within this call, instead of copied
- // from an existing document's origin or from `origin_to_commit_`. If this is
- @@ -2361,6 +2365,10 @@ scoped_refptr<SecurityOrigin> DocumentLoader::CalculateOrigin(
- // the end of this function.
- origin = origin_to_commit_;
- debug_info_builder.Append("use_origin_to_commit");
- + } else if (!SecurityOrigin::ShouldUseInnerURL(url_) &&
- + !is_standard) {
- + debug_info_builder.Append("use_url_with_non_standard_scheme");
- + origin = SecurityOrigin::Create(url_);
- } else {
- debug_info_builder.Append("use_url_with_precursor");
- // Otherwise, create an origin that propagates precursor information
|