Changeset 230495 in webkit


Ignore:
Timestamp:
Apr 10, 2018 3:16:27 PM (6 years ago)
Author:
youenn@apple.com
Message:

Beacon redirect responses should be CORS validated
https://bugs.webkit.org/show_bug.cgi?id=184378

Reviewed by Chris Dumez.

Source/WebKit:

Add CORS checks to any redirection response if mode is CORS.
Update response tainting and redirected accordingly.

  • NetworkProcess/NetworkLoadChecker.cpp:

(WebKit::NetworkLoadChecker::checkRedirection):
(WebKit::NetworkLoadChecker::validateResponse):

  • NetworkProcess/NetworkLoadChecker.h:
  • NetworkProcess/PingLoad.cpp:

(WebKit::PingLoad::willPerformHTTPRedirection):

LayoutTests:

  • TestExpectations:
  • http/wpt/beacon/cors/cors-redirect-failure-expected.txt: Added.
  • http/wpt/beacon/cors/cors-redirect-failure.html: Added.
  • http/wpt/beacon/resources/redirect.py:

(main):

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r230493 r230495  
     12018-04-10  Youenn Fablet  <youenn@apple.com>
     2
     3        Beacon redirect responses should be CORS validated
     4        https://bugs.webkit.org/show_bug.cgi?id=184378
     5
     6        Reviewed by Chris Dumez.
     7
     8        * TestExpectations:
     9        * http/wpt/beacon/cors/cors-redirect-failure-expected.txt: Added.
     10        * http/wpt/beacon/cors/cors-redirect-failure.html: Added.
     11        * http/wpt/beacon/resources/redirect.py:
     12        (main):
     13
    1142018-04-10  Youenn Fablet  <youenn@apple.com>
    215
  • trunk/LayoutTests/TestExpectations

    r230483 r230495  
    10051005http/wpt/beacon/contentextensions [ Skip ]
    10061006
     1007http/wpt/beacon/cors/cors-redirect-failure.html [ DumpJSConsoleLogInStdErr ]
     1008
    10071009webkit.org/b/149072 svg/animations/svgboolean-animation-1.html [ Pass Failure ]
    10081010
  • trunk/LayoutTests/http/wpt/beacon/resources/redirect.py

    r220497 r230495  
    99               ("Pragma", "no-cache"),
    1010               ("Access-Control-Allow-Credentials", "true")]
    11     headers.append(("Access-Control-Allow-Origin", request.headers.get("Origin", "*")))
     11    if not "disallowCorsOnResponseNotPreflight" in request.GET or request.method == "OPTIONS":
     12        headers.append(("Access-Control-Allow-Origin", request.headers.get("Origin", "*")))
     13
    1214    token = None
    13 
    1415    if "token" in request.GET:
    1516        token = request.GET.first("token")
  • trunk/Source/WebKit/ChangeLog

    r230489 r230495  
     12018-04-10  Youenn Fablet  <youenn@apple.com>
     2
     3        Beacon redirect responses should be CORS validated
     4        https://bugs.webkit.org/show_bug.cgi?id=184378
     5
     6        Reviewed by Chris Dumez.
     7
     8        Add CORS checks to any redirection response if mode is CORS.
     9        Update response tainting and redirected accordingly.
     10
     11        * NetworkProcess/NetworkLoadChecker.cpp:
     12        (WebKit::NetworkLoadChecker::checkRedirection):
     13        (WebKit::NetworkLoadChecker::validateResponse):
     14        * NetworkProcess/NetworkLoadChecker.h:
     15        * NetworkProcess/PingLoad.cpp:
     16        (WebKit::PingLoad::willPerformHTTPRedirection):
     17
    1182018-04-10  Sihui Liu  <sihui_liu@apple.com>
    219
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.cpp

    r230223 r230495  
    6565}
    6666
    67 void NetworkLoadChecker::checkRedirection(ResourceRequest&& request, ValidationHandler&& handler)
     67void NetworkLoadChecker::checkRedirection(WebCore::ResourceResponse& redirectResponse, ResourceRequest&& request, ValidationHandler&& handler)
    6868{
    6969    ASSERT(!isChecking());
     70
     71    auto error = validateResponse(redirectResponse);
     72    if (!error.isNull()) {
     73        handler(makeUnexpected(WTFMove(error)));
     74        return;
     75    }
    7076
    7177    m_previousURL = WTFMove(m_url);
     
    8894
    8995    checkRequest(WTFMove(request), WTFMove(handler));
     96}
     97
     98ResourceError NetworkLoadChecker::validateResponse(ResourceResponse& response)
     99{
     100    if (m_redirectCount)
     101        response.setRedirected(true);
     102
     103    if (m_isSameOriginRequest) {
     104        response.setTainting(ResourceResponse::Tainting::Basic);
     105        return { };
     106    }
     107
     108    if (m_mode == FetchOptions::Mode::NoCors) {
     109        response.setTainting(ResourceResponse::Tainting::Opaque);
     110        return { };
     111    }
     112
     113    ASSERT(m_mode == FetchOptions::Mode::Cors);
     114
     115    String errorMessage;
     116    if (!WebCore::passesAccessControlCheck(response, m_storedCredentialsPolicy, *m_origin, errorMessage))
     117        return ResourceError { errorDomainWebKitInternal, 0, m_url, WTFMove(errorMessage), ResourceError::Type::AccessControl };
     118
     119    response.setTainting(ResourceResponse::Tainting::Cors);
     120    return { };
    90121}
    91122
  • trunk/Source/WebKit/NetworkProcess/NetworkLoadChecker.h

    r230223 r230495  
    5252    using ValidationHandler = CompletionHandler<void(RequestOrError&&)>;
    5353    void check(WebCore::ResourceRequest&&, ValidationHandler&&);
    54     void checkRedirection(WebCore::ResourceRequest&&, ValidationHandler&&);
     54    void checkRedirection(WebCore::ResourceResponse&, WebCore::ResourceRequest&&, ValidationHandler&&);
     55
     56    WebCore::ResourceError validateResponse(WebCore::ResourceResponse&);
    5557
    5658    void setCSPResponseHeaders(WebCore::ContentSecurityPolicyResponseHeaders&& headers) { m_cspResponseHeaders = WTFMove(headers); }
  • trunk/Source/WebKit/NetworkProcess/PingLoad.cpp

    r230223 r230495  
    9494void PingLoad::willPerformHTTPRedirection(ResourceResponse&& redirectResponse, ResourceRequest&& request, RedirectCompletionHandler&& completionHandler)
    9595{
    96 
    97     m_networkLoadChecker->checkRedirection(WTFMove(request), [this, completionHandler = WTFMove(completionHandler)](auto&& result) {
     96    m_networkLoadChecker->checkRedirection(redirectResponse, WTFMove(request), [this, completionHandler = WTFMove(completionHandler)](auto&& result) {
    9897        if (!result.has_value()) {
    9998            completionHandler({ });
Note: See TracChangeset for help on using the changeset viewer.