WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
Bug 235873
CSP: Improve compatibility of source matching
https://bugs.webkit.org/show_bug.cgi?id=235873
Summary
CSP: Improve compatibility of source matching
Patrick Griffis
Reported
2022-01-30 12:44:41 PST
CSP: Improve compatibility of source matching
Attachments
Patch
(12.87 KB, patch)
2022-01-30 12:45 PST
,
Patrick Griffis
no flags
Details
Formatted Diff
Diff
Patch
(12.85 KB, patch)
2022-01-30 13:04 PST
,
Patrick Griffis
no flags
Details
Formatted Diff
Diff
Patch
(14.40 KB, patch)
2022-02-01 13:46 PST
,
Patrick Griffis
no flags
Details
Formatted Diff
Diff
Patch
(12.73 KB, patch)
2022-04-01 11:09 PDT
,
Patrick Griffis
no flags
Details
Formatted Diff
Diff
Patch
(12.83 KB, patch)
2022-04-01 11:13 PDT
,
Patrick Griffis
no flags
Details
Formatted Diff
Diff
Patch
(13.00 KB, patch)
2022-04-01 12:28 PDT
,
Patrick Griffis
ews-feeder
: commit-queue-
Details
Formatted Diff
Diff
Show Obsolete
(5)
View All
Add attachment
proposed patch, testcase, etc.
Patrick Griffis
Comment 1
2022-01-30 12:45:22 PST
Comment hidden (obsolete)
Created
attachment 450365
[details]
Patch
Patrick Griffis
Comment 2
2022-01-30 13:04:03 PST
Created
attachment 450366
[details]
Patch
Darin Adler
Comment 3
2022-01-30 13:56:39 PST
Comment on
attachment 450366
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=450366&action=review
Generally good; room for improvement
> Source/WebCore/page/csp/ContentSecurityPolicy.cpp:240 > + m_selfSource = makeUnique<ContentSecurityPolicySource>(*this, m_selfSourceProtocol, securityOrigin.host(), effectivePort, emptyString(), false, false, true);
This “false, false, true” is not a good pattern: difficult to spot mistakes. This is why we end up using the cumbersome techniques that involve enumerations. Otherwise there is just super subtle code like this.
> Source/WebCore/page/csp/ContentSecurityPolicy.h:173 > + const String& selfScheme() const { return m_selfSourceProtocol; };
Why mix terminology between “scheme“ and “protocol“?
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:61 > + const String& scheme = m_scheme.isEmpty() ? m_policy.selfScheme() : m_scheme;
auto&
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:62 > + String urlScheme = url.protocol().convertToASCIILowercase();
auto
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:120 > + bool isUpgradeSecure = (port && port.value() == 443) || (!port && WTF::isDefaultPortForProtocol(443, url.protocol()));
“port == 443” should so the same thing as “port && port.value() == 443”
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:121 > + bool isCurrentUpgradable = (m_port && m_port.value() == 80) || (m_scheme == "http" && (!m_port || m_port.value() == 443));
Same thing here. “m_port == 80” By the way, could also do m_port.value_or(443) == 443 or just leave out .value().
> Source/WebCore/page/csp/ContentSecurityPolicySource.h:39 > + ContentSecurityPolicySource(const ContentSecurityPolicy&, const String& scheme, const String& host, std::optional<uint16_t> port, const String& path, bool hostHasWildcard, bool portHasWildcard, bool isSelfSource);
This new argument should be an enumeration, not a bool. All callers are passing constant values, and this is just the situation where WebKit style calls for enumerations so that you can see at the call site what the value means.
> LayoutTests/imported/w3c/web-platform-tests/content-security-policy/connect-src/connect-src-websocket-self.sub-expected.txt:2 > +PASS Expecting logs: ["allowed", "allowed"]
Not enough test coverage. This progression is great, but we need tests covering all the improvements this patch makes. If not already in WPT, then add to WPT or at least to WebKit tests.
Patrick Griffis
Comment 4
2022-02-01 13:46:48 PST
Created
attachment 450564
[details]
Patch
Patrick Griffis
Comment 5
2022-02-01 13:49:28 PST
(In reply to Darin Adler from
comment #3
) I applied all of your fixes.
> Not enough test coverage. This progression is great, but we need tests > covering all the improvements this patch makes. > > If not already in WPT, then add to WPT or at least to WebKit tests.
I ended up limiting this patch is scope a bit by removing the default port changes, as WebKit tests asserted otherwise and I honestly think its correct. I'll try to have a discussion with some Chromium folks about this. In the end the test cases covers http->wss and http->ws which is the majority of this change. I don't see an obvious way to set up WPT to use non-http custom protocols that can upgrade to https. If that sounds reasonable to you I'll commit it soon.
Darin Adler
Comment 6
2022-02-01 14:02:50 PST
It’s always risky to make improvements that don’t have regression tests. In past, when that happened, we expanded the capabilities of WebKit regression tests so we could test the improvements, sometimes using tests written in C++ or Objective-C if we couldn’t do them in LayoutTests-style tests. But that would not block landing the fix. It’s important follow-through for the health of the product, though. We don’t want a future contributor to unknowingly break this.
Darin Adler
Comment 7
2022-02-01 14:05:54 PST
Comment on
attachment 450564
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=450564&action=review
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:120 > + bool isUpgradeSecure = (port == 443) || (!port && WTF::isDefaultPortForProtocol(443, url.protocol()));
I don’t think the WTF:: prefix is needed here.
> Source/WebCore/page/csp/ContentSecurityPolicySourceList.h:64 > - bool hasWildcard { false }; > + HasWildcard hasWildcard { HasWildcard::No };
Is this change helpful? I don’t strongly object, after all it’s consistent with what we have to do to make function arguments look good, and is helpful if we are using structure initialization syntax, but I’m not sure how you decided.
> Source/WebCore/page/csp/ContentSecurityPolicySourceList.h:68 > - bool hasWildcard { false }; > + HasWildcard hasWildcard { HasWildcard::No };
Ditto.
Patrick Griffis
Comment 8
2022-02-01 16:52:14 PST
(In reply to Darin Adler from
comment #7
)
> Is this change helpful? I don’t strongly object, after all it’s consistent > with what we have to do to make function arguments look good, and is helpful > if we are using structure initialization syntax, but I’m not sure how you > decided.
It was only for consistency in the area.
Darin Adler
Comment 9
2022-02-01 16:56:45 PST
Well the data member is just a bool, not a HasWildcard, so it’t not completely consistent.
Patrick Griffis
Comment 10
2022-02-01 17:46:25 PST
Alright, I'll change it back. Also found
bug 235992
while in the area.
Kate Cheney
Comment 11
2022-02-02 09:09:11 PST
rdar://83788668
Brent Fulgham
Comment 12
2022-03-04 16:59:19 PST
(In reply to Patrick Griffis from
comment #10
)
> Alright, I'll change it back. > > Also found
bug 235992
while in the area.
Did you intend to do more here? I'm not sure if we should review either of these patches, or if the work was done elsewhere?
Patrick Griffis
Comment 13
2022-03-05 07:42:37 PST
(In reply to Brent Fulgham from
comment #12
)
> (In reply to Patrick Griffis from
comment #10
) > > Alright, I'll change it back. > > > > Also found
bug 235992
while in the area. > > Did you intend to do more here? I'm not sure if we should review either of > these patches, or if the work was done elsewhere?
I was intending for another revision. Just got sick and pulled to other tasks. It's on my list.
Brent Fulgham
Comment 14
2022-03-15 13:37:53 PDT
***
Bug 201591
has been marked as a duplicate of this bug. ***
Patrick Griffis
Comment 15
2022-04-01 11:09:54 PDT
Comment hidden (obsolete)
Created
attachment 456375
[details]
Patch
Patrick Griffis
Comment 16
2022-04-01 11:13:09 PDT
Created
attachment 456376
[details]
Patch
Kate Cheney
Comment 17
2022-04-01 11:35:42 PDT
Comment on
attachment 456376
[details]
Patch View in context:
https://bugs.webkit.org/attachment.cgi?id=456376&action=review
Looks good! I see Darin already reviewed it but I just had one spec question.
> Source/WebCore/page/csp/ContentSecurityPolicySource.cpp:70 > + return true;
I'm looking at the spec: " More formally, two ASCII strings (A and B) are said to scheme-part match if the following algorithm returns "Matches": 1. If one of the following is true, return "Matches": 1. A is an ASCII case-insensitive match for B. 2. A is an ASCII case-insensitive match for "http", and B is an ASCII case-insensitive match for "https". 3. A is an ASCII case-insensitive match for "ws", and B is an ASCII case-insensitive match for "wss", "http", or "https". 4. A is an ASCII case-insensitive match for "wss", and B is an ASCII case-insensitive match for "https". 2. Return "Does Not Match". " It seems we directly cover (1) with the first check of (scheme == urlScheme). We cover (2) with (scheme == "http" && urlScheme == "https"). And we cover part of (3) with (scheme == "ws" && urlScheme == "wss"). Do we also need a check for scheme == 'ws' && urlScheme == 'http'/'https' and (4)?
> Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:125 > + // Also not allowed by the Content Security Policy Level 3 spec., we allow a data URL to match
Tiny nit that already existed before your patch: we usually try to make comments full sentences with periods at the end.
Patrick Griffis
Comment 18
2022-04-01 12:28:40 PDT
Created
attachment 456390
[details]
Patch
Patrick Griffis
Comment 19
2022-04-01 12:29:44 PDT
(In reply to Kate Cheney from
comment #17
)
> It seems we directly cover (1) with the first check of (scheme == > urlScheme). We cover (2) with (scheme == "http" && urlScheme == "https"). > And we cover part of (3) with (scheme == "ws" && urlScheme == "wss"). Do we > also need a check for scheme == 'ws' && urlScheme == 'http'/'https' and (4)?
You're right. Updated to handle this.
> > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:125 > > + // Also not allowed by the Content Security Policy Level 3 spec., we allow a data URL to match > > Tiny nit that already existed before your patch: we usually try to make > comments full sentences with periods at the end.
This was a multi-line comment that ended with a period.
Kate Cheney
Comment 20
2022-04-01 12:35:27 PDT
Comment on
attachment 456390
[details]
Patch
> > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:125 > > > + // Also not allowed by the Content Security Policy Level 3 spec., we allow a data URL to match > > > > Tiny nit that already existed before your patch: we usually try to make > > comments full sentences with periods at the end.
> This was a multi-line comment that ended with a period.
Nice! I missed the second line.
EWS
Comment 21
2022-04-02 09:23:29 PDT
Committed
r292266
(
249164@main
): <
https://commits.webkit.org/249164@main
> All reviewed patches have been landed. Closing bug and clearing flags on
attachment 456390
[details]
.
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug