Branch: refs/heads/main Home: https://github.com/WebKit/WebKit Commit: 647e80ac22b36756d0b194b3f0526fae8f62447a https://github.com/WebKit/WebKit/commit/647e80ac22b36756d0b194b3f0526fae8f62447a Author: Kiet Ho <kiet...@apple.com> Date: 2025-05-23 (Fri, 23 May 2025)
Changed paths: A LayoutTests/http/tests/security/access-cssstylesheet-after-removing-from-document-expected.txt A LayoutTests/http/tests/security/access-cssstylesheet-after-removing-from-document.html A LayoutTests/http/tests/security/access-imported-cssstylesheet-after-removing-from-document-expected.txt A LayoutTests/http/tests/security/access-imported-cssstylesheet-after-removing-from-document.html M LayoutTests/http/tests/security/cannot-read-cssrules-redirect-expected.txt M LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-cross-origin.https-expected.txt M Source/WebCore/css/CSSImportRule.cpp M Source/WebCore/css/CSSStyleSheet.cpp M Source/WebCore/css/CSSStyleSheet.h M Source/WebCore/dom/ProcessingInstruction.cpp M Source/WebCore/html/HTMLLinkElement.cpp Log Message: ----------- Tighten up cross-site access to CSSStyleSheet rdar://148513087 https://bugs.webkit.org/show_bug.cgi?id=290992 Reviewed by Youenn Fablet. CSSStyleSheet::canAccessRules() gates access to rules within CSSStyleSheet, depending on whether the JS code and stylesheet comes from the same origin. bool CSSStyleSheet::canAccessRules() const { if (m_isOriginClean) // (1) return m_isOriginClean.value(); URL baseURL = m_contents->baseURL(); // (2) if (baseURL.isEmpty()) return true; Document* document = ownerDocument(); // (3) if (!document) return true; // (4) return document->protectedSecurityOrigin()->canRequest(baseURL, OriginAccessPatternsForWebProcess::singleton()); // (5) } If CSSStyleSheet is constructed with an explicit same-origin flag, (which indicates the origin status of the JS code and stylesheet), that flag is used (1). Otherwise, it manually checks the origin: * get the base URL of the stylesheet (2) * get the document owner of the CSSStyleSheet (also the document that the JS code is in) (3) * check whether the JS code and the stylesheet is same-origin (5) There's a bug at (4) - it grants access if the CSSStyleSheet doesn't belong to a Document. Malicious JS code can manipulate a cross-origin CSSStyleSheet into this state: * If the CSSStyleSheet comes from HTMLLinkElement.sheet (<link rel="stylesheet">) or HTMLStyleElement.sheet (<style>), remove the <link> or <style> element from the document e.g using Node.removeChild * If it comes from CSSImportRule.styleSheet (@import), remove the stylesheet containing the @import rule from the document Following the removal, ownerDocument() returns nullptr, and access is granted. Fix this by changing (4) to return false instead. Unfortunately, many places in the codebase construct CSSStyleSheet without supplying the same-origin flag, instead relying on the fallback check. For those cases, this change introduces a regression where if a same-origin stylesheet is created without the same-origin flag, then is removed from the document, the fallback check will incorrectly deny access. Fix this by hunting down places that construct CSSStyleSheet and supply the flag if possible. Also fix CSSStyleSheet.{insert,delete}Rule to always check with canAccessRules() before allowing insertion/deletion. * LayoutTests/http/tests/security/access-cssstylesheet-after-removing-from-document-expected.txt: Added. * LayoutTests/http/tests/security/access-cssstylesheet-after-removing-from-document.html: Added. * LayoutTests/http/tests/security/access-imported-cssstylesheet-after-removing-from-document-expected.txt: Added. * LayoutTests/http/tests/security/access-imported-cssstylesheet-after-removing-from-document.html: Added. * LayoutTests/http/tests/security/cannot-read-cssrules-redirect-expected.txt: - Adjust expectation. This now matches Chrome's output. * LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-css-cross-origin.https-expected.txt: * Source/WebCore/css/CSSImportRule.cpp: (WebCore::CSSImportRule::styleSheet const): - Supply same-origin flag when creating CSSStyleSheet if possible. * Source/WebCore/css/CSSStyleSheet.cpp: (WebCore::CSSStyleSheet::create): - Make ::create for @import rules take an optional same-origin flag. (WebCore::CSSStyleSheet::createInline): - Take an optional same-origin flag. (WebCore::CSSStyleSheet::canAccessRules const): - Deny access if the CSSStyleSheet does not belong to a Document. (WebCore::CSSStyleSheet::insertRule): - Deny access if not allowed (using canAccessRules()) (WebCore::CSSStyleSheet::deleteRule): - Deny access if not allowed (using canAccessRules()) * Source/WebCore/css/CSSStyleSheet.h: * Source/WebCore/dom/ProcessingInstruction.cpp: (WebCore::ProcessingInstruction::setCSSStyleSheet): - Supply same-origin flag when creating CSSStyleSheet. * Source/WebCore/html/HTMLLinkElement.cpp: (WebCore::HTMLLinkElement::initializeStyleSheet): - Always set the origin clean flag, regardless whether the fetch request is CORS or not. Originally-landed-as: be53cebfe0d9. rdar://151714711 Canonical link: https://commits.webkit.org/295342@main Commit: 1d88cd372a58384f14f98fb95b5d5c83a4fd4c22 https://github.com/WebKit/WebKit/commit/1d88cd372a58384f14f98fb95b5d5c83a4fd4c22 Author: Sihui Liu <sihui_...@apple.com> Date: 2025-05-23 (Fri, 23 May 2025) Changed paths: M Source/WebCore/platform/network/ResourceResponseBase.cpp M Source/WebCore/platform/network/ResourceResponseBase.h Log Message: ----------- ResourceResponseData::proxyName is not properly isolated copied https://bugs.webkit.org/show_bug.cgi?id=291646 rdar://148182167 Reviewed by Chris Dumez. In existing implementation, ResourceResponseData::proxyName is not isolated copied or moved correctly at the places it is supposed to be, and this can be the cause of increasing crashes we saw in recent builds. Credits to Chris who found the issue. * Source/WebCore/platform/network/ResourceResponseBase.cpp: (WebCore::ResourceResponseData::isolatedCopy const): (WebCore::ResourceResponseBase::crossThreadData const): (WebCore::ResourceResponseBase::fromCrossThreadData): * Source/WebCore/platform/network/ResourceResponseBase.h: (WebCore::ResourceResponseBase::setProxyName): (WebCore::ResourceResponseBase::proxyName const): Originally-landed-as: cdd407b46a54. rdar://151714620 Canonical link: https://commits.webkit.org/295343@main Compare: https://github.com/WebKit/WebKit/compare/150fa103a89e...1d88cd372a58 To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications _______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes