RESOLVED FIXED 155007
CSP: Implement support for inline script and inline style hashes
https://bugs.webkit.org/show_bug.cgi?id=155007
Summary CSP: Implement support for inline script and inline style hashes
Daniel Bates
Reported 2016-03-03 20:47:34 PST
We should implement support for inline script and inline stylesheet hashes per <https://www.w3.org/TR/2015/CR-CSP2-20150721/#script-src-hash-usage> and <https://www.w3.org/TR/2015/CR-CSP2-20150721/#style-src-hash-usage>, respectively.
Attachments
Patch and Layout Test (93.65 KB, patch)
2016-03-04 12:46 PST, Daniel Bates
no flags
Patch and Layout Test (93.73 KB, patch)
2016-03-08 13:55 PST, Daniel Bates
no flags
Archive of layout-test-results from ews121 for ios-simulator-wk2 (701.14 KB, application/zip)
2016-03-09 01:29 PST, Build Bot
no flags
Patch and Layout Test (94.33 KB, patch)
2016-03-09 17:23 PST, Daniel Bates
bfulgham: review+
Daniel Bates
Comment 1 2016-03-03 20:47:59 PST
Daniel Bates
Comment 2 2016-03-04 12:46:10 PST
Created attachment 273027 [details] Patch and Layout Test
WebKit Commit Bot
Comment 3 2016-03-04 12:47:39 PST
Attachment 273027 [details] did not pass style-queue: ERROR: Source/WebCore/page/csp/ContentSecurityPolicyHash.h:51: More than one command on the same line [whitespace/newline] [4] Total errors found: 1 in 35 files If any of these errors are false positives, please file a bug against check-webkit-style.
Brent Fulgham
Comment 4 2016-03-04 21:40:16 PST
It looks like this patch has some issues: /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp:208:25: error: invalid range expression of type 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>'; no viable 'begin' function available for (auto algorithm : algorithms) { ^ ~~~~~~~~~~ /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp:258:43: error: no member named 'isEmpty' in 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>' if (!m_hashAlgorithmsForInlineScripts.isEmpty() && !scriptContent.isEmpty() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp:270:47: error: no member named 'isEmpty' in 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>' if (!m_hashAlgorithmsForInlineStylesheets.isEmpty() && !styleContent.isEmpty() ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ 3 errors generated.
Brent Fulgham
Comment 5 2016-03-04 22:06:05 PST
Comment on attachment 273027 [details] Patch and Layout Test View in context: https://bugs.webkit.org/attachment.cgi?id=273027&action=review This patch looks great! But it doesn't apply cleanly for some reason. Can you rebaseline it and see if we get a green EWS, and I'll approve it? > Source/WebCore/ChangeLog:68 > + by making use Vector's equality operator. "by making use *OF* Vector's equality operator." > Source/WebCore/dom/StyledElement.cpp:205 > + } else if (reason == ModifiedByCloning || document().contentSecurityPolicy()->allowInlineStyle(document().url(), startLineNumber, String(), isInUserAgentShadowTree())) Is it better to use "emptyString()" here? I can't remember under which circumstances it is more efficient. > Source/WebCore/page/csp/ContentSecurityPolicy.cpp:206 > + // FIXME: Compute the digest with respect to the raw bytes received from the page. Do we have a Radar or Bugzilla bug for this work? > Source/WebCore/page/csp/ContentSecurityPolicy.cpp:243 > +// FIXME: We should compute the document encoding once and cache it instead of computing it on each invocation. Can you please file a Bugzilla for this so we do not forget? > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:406 > +} The presence of these "Found" / "Not found" comments makes it seem like this might be better served by returning an enum indicating found/not found. > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:440 > + // FIXME: Normalize Base64URL to Base64 instead of decoding twice. Bugzilla, please! :-)
Daniel Bates
Comment 6 2016-03-07 14:33:35 PST
(In reply to comment #4) > It looks like this patch has some issues: > > /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp: > 208:25: error: invalid range expression of type > 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>'; no viable > 'begin' function available > for (auto algorithm : algorithms) { > ^ ~~~~~~~~~~ > /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp: > 258:43: error: no member named 'isEmpty' in > 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>' > if (!m_hashAlgorithmsForInlineScripts.isEmpty() && > !scriptContent.isEmpty() > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ > /Volumes/Data/EWS/WebKit/Source/WebCore/page/csp/ContentSecurityPolicy.cpp: > 270:47: error: no member named 'isEmpty' in > 'WTF::OptionSet<WebCore::ContentSecurityPolicyHashAlgorithm>' > if (!m_hashAlgorithmsForInlineStylesheets.isEmpty() && > !styleContent.isEmpty() > ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^ > 3 errors generated. These errors are because we need to fix for bug #154941. Bug #154941 implements support for iterating over an OptionSet and determining if the set is empty.
Daniel Bates
Comment 7 2016-03-08 13:43:56 PST
Comment on attachment 273027 [details] Patch and Layout Test View in context: https://bugs.webkit.org/attachment.cgi?id=273027&action=review >> Source/WebCore/ChangeLog:68 >> + by making use Vector's equality operator. > > "by making use *OF* Vector's equality operator." Will fix. >> Source/WebCore/dom/StyledElement.cpp:205 >> + } else if (reason == ModifiedByCloning || document().contentSecurityPolicy()->allowInlineStyle(document().url(), startLineNumber, String(), isInUserAgentShadowTree())) > > Is it better to use "emptyString()" here? I can't remember under which circumstances it is more efficient. I can use emptyString(). Using emptyString() is less efficient than creating a null string because it is an out-of-line call among other things. From my understanding we use an empty string to convey a valid string that contains no characters and a null string to convey an invalid string. I chose to use the latter to convey the "invalidness" of the content of the style attribute - CSP should not consider the content of the HTML style attribute. >> Source/WebCore/page/csp/ContentSecurityPolicy.cpp:206 >> + // FIXME: Compute the digest with respect to the raw bytes received from the page. > > Do we have a Radar or Bugzilla bug for this work? Filed bug #155184. >> Source/WebCore/page/csp/ContentSecurityPolicy.cpp:243 >> +// FIXME: We should compute the document encoding once and cache it instead of computing it on each invocation. > > Can you please file a Bugzilla for this so we do not forget? As per our in-person conversation today (03/08), this FIXME comment reflects an idealized implementation. I hope you do not mind that I defer filing a bug for this FIXME at this time. Should it turn out that the inefficiencies of this code show up in profiles then we can file a bug and address this FIXME. For completeness, I wrote this comment to reflect my unhappiness that we compute the document encoding on each invocation as opposed to computing it once after the parser determines it. Addressing this FIXME may be a non-trivial refactoring and the performance inefficiencies of this code are unlikely to be significant enough to be worth the refactoring alone. Although I do not feel that a bug is needed to track this FIXME, I feel that there is value in having this FIXME comment to capture the inefficiency of this code and in the hopes that a reader (maybe myself) consider fixing it from a theoretical performance and architectural perspective. >> Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:406 >> +} > > The presence of these "Found" / "Not found" comments makes it seem like this might be better served by returning an enum indicating found/not found. Looking at this code again, I do not feel that these comments add much value. I will remove the comments unless you feel strongly about keeping the comments are using an enum. >> Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:440 >> + // FIXME: Normalize Base64URL to Base64 instead of decoding twice. > > Bugzilla, please! :-) Filed bug #155186.
Daniel Bates
Comment 8 2016-03-08 13:55:17 PST
Created attachment 273335 [details] Patch and Layout Test
WebKit Commit Bot
Comment 9 2016-03-08 13:57:23 PST
Attachment 273335 [details] did not pass style-queue: ERROR: Source/WebCore/page/csp/ContentSecurityPolicyHash.h:51: More than one command on the same line [whitespace/newline] [4] Total errors found: 1 in 35 files If any of these errors are false positives, please file a bug against check-webkit-style.
Daniel Bates
Comment 10 2016-03-08 14:03:51 PST
I am open to suggestion on this patch. I am unhappy about parseHashAlgorithmAdvancingPosition(). Maybe there is a better way to implement this function? One idea is to make use of StringView.startsWith() to make the implementation more straightforward to read. Another idea is to unroll the loop.
Build Bot
Comment 11 2016-03-09 01:29:32 PST
Comment on attachment 273335 [details] Patch and Layout Test Attachment 273335 [details] did not pass ios-sim-ews (ios-simulator-wk2): Output: http://webkit-queues.webkit.org/results/946205 New failing tests: http/tests/security/contentSecurityPolicy/1.1/scripthash-default-src.html
Build Bot
Comment 12 2016-03-09 01:29:35 PST
Created attachment 273412 [details] Archive of layout-test-results from ews121 for ios-simulator-wk2 The attached test failures were seen while running run-webkit-tests on the ios-sim-ews. Bot: ews121 Port: ios-simulator-wk2 Platform: Mac OS X 10.10.5
Daniel Bates
Comment 13 2016-03-09 17:23:36 PST
Created attachment 273515 [details] Patch and Layout Test
WebKit Commit Bot
Comment 14 2016-03-09 17:26:10 PST
Attachment 273515 [details] did not pass style-queue: ERROR: Source/WebCore/page/csp/ContentSecurityPolicyHash.h:51: More than one command on the same line [whitespace/newline] [4] Total errors found: 1 in 36 files If any of these errors are false positives, please file a bug against check-webkit-style.
Brent Fulgham
Comment 15 2016-03-10 09:15:19 PST
Comment on attachment 273515 [details] Patch and Layout Test View in context: https://bugs.webkit.org/attachment.cgi?id=273515&action=review r=me. Nice work! > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:410 > + if (!stringView.startsWithIgnoringASCIICase(String(ASCIILiteral(entry.label)))) Could we compute the value of String(ASCIILiteral(entry.label)) when building the labelToHashAlgorithmTable, rather than doing so every time we enter this function? > Source/WebCore/page/csp/ContentSecurityPolicySourceList.cpp:412 > + position += strlen(entry.label); If we stored Strings instead of char*, this could just be entry.length(). > LayoutTests/TestExpectations:-830 > -webkit.org/b/154203 http/tests/security/contentSecurityPolicy/1.1/stylehash-default-src.html :-)
Daniel Bates
Comment 16 2016-03-10 09:41:43 PST
(In reply to comment #15) > Could we compute the value of String(ASCIILiteral(entry.label)) when > building the labelToHashAlgorithmTable, rather than doing so every time we > enter this function? > Yes, we can compute these String object in advance. Will update parseHashAlgorithmAdvancingPosition() to read: static bool parseHashAlgorithmAdvancingPosition(const UChar*& position, size_t length, ContentSecurityPolicyHashAlgorithm& algorithm) { static struct { NeverDestroyed<String> label; ContentSecurityPolicyHashAlgorithm algorithm; } labelToHashAlgorithmTable[] { { ASCIILiteral("sha256"), ContentSecurityPolicyHashAlgorithm::SHA_256 }, { ASCIILiteral("sha384"), ContentSecurityPolicyHashAlgorithm::SHA_384 }, { ASCIILiteral("sha512"), ContentSecurityPolicyHashAlgorithm::SHA_512 }, }; StringView stringView(position, length); for (auto& entry : labelToHashAlgorithmTable) { String& label = entry.label.get(); if (!stringView.startsWithIgnoringASCIICase(label)) continue; position += label.length(); algorithm = entry.algorithm; return true; } return false; }
Daniel Bates
Comment 17 2016-03-10 09:46:00 PST
Note You need to log in before you can comment on or make changes to this bug.