RESOLVED FIXED 121548
[SOUP] TLSErrors do not cause page load to fail when not ignored
https://bugs.webkit.org/show_bug.cgi?id=121548
Summary [SOUP] TLSErrors do not cause page load to fail when not ignored
Brian Holt
Reported 2013-09-18 03:36:34 PDT
When the m_ignoreTLSErrors in WebContext is set to false and a page like https://www.aeat.com is loaded, page loading does not fail (i.e. webkitWebViewLoadFailedWithTLSErrors is not called). Investigation into this issue revealed that the GTtlCertificateFlags in ResourceResponseSoup.cpp updateFromSoupMessage() are not persisted for more than a single update.
Attachments
Patch (1.78 KB, patch)
2013-09-18 03:46 PDT, Brian Holt
no flags
Patch (2.02 KB, patch)
2014-04-30 09:00 PDT, Brian Holt
cgarcia: review-
Alternative patch (2.63 KB, patch)
2014-05-03 04:33 PDT, Carlos Garcia Campos
no flags
Updated patch including GTK unit test (5.42 KB, patch)
2014-05-07 02:37 PDT, Carlos Garcia Campos
svillar: review+
Brian Holt
Comment 1 2013-09-18 03:46:19 PDT
Carlos Garcia Campos
Comment 2 2013-09-18 03:50:57 PDT
Is this a regression or has always happened? Could you add a unit test for this?
Brian Holt
Comment 3 2013-09-18 03:57:35 PDT
(In reply to comment #2) > Is this a regression or has always happened? Could you add a unit test for this? TestSSL passes without it, but I think this is because there is only one soup update, whereas https://www.aeat.com results in many updates and the error is overwritten on the second update. So I think it's always been like this, but I'm surprised you didn't encounter it in https://bugs.webkit.org/show_bug.cgi?id=90267#c12.
Sergio Villar Senin
Comment 4 2013-09-18 04:00:40 PDT
Are you sure https://www.aeat.com is showing that behaviour, it redirects to a non secure http site. Anyway... so the tls errors (if any) in the SoupMessage are set once the SSL connection is completed. When reading the description I was wondering why they would be cleared. When you say "are not persisted for more than a single update" do you mean that they are no longer there on reload?
Carlos Garcia Campos
Comment 5 2013-09-18 04:14:34 PDT
The thing is why updateFromSoupMessage is called multiple times. Then try to reproduce that in a unit test.
Brian Holt
Comment 6 2013-09-18 05:47:28 PDT
(In reply to comment #4) > Are you sure https://www.aeat.com is showing that behaviour, it redirects to a non secure http site. Anyway... > Try it in Firefox/Chrome and compare to WK2, you should expect to see 3 errors: expired + bad identity + unknown CA > so the tls errors (if any) in the SoupMessage are set once the SSL connection is completed. When reading the description I was wondering why they would be cleared. When you say "are not persisted for more than a single update" do you mean that they are no longer there on reload? I mean that there are multiple calls to soup_message_get_https_status(soupMessage, &certificate, &m_tlsFlags); and its only in the first one that m_tlsFlags is set to 11. On the second and subsequent calls it is set to 0 by soup_message_get_https_status().
Carlos Garcia Campos
Comment 7 2013-09-18 05:51:33 PDT
(In reply to comment #6) > (In reply to comment #4) > > Are you sure https://www.aeat.com is showing that behaviour, it redirects to a non secure http site. Anyway... > > > > Try it in Firefox/Chrome and compare to WK2, you should expect to see 3 errors: expired + bad identity + unknown CA > > > so the tls errors (if any) in the SoupMessage are set once the SSL connection is completed. When reading the description I was wondering why they would be cleared. When you say "are not persisted for more than a single update" do you mean that they are no longer there on reload? > > I mean that there are multiple calls to > soup_message_get_https_status(soupMessage, &certificate, &m_tlsFlags); and its only in the first one that m_tlsFlags is set to 11. On the second and subsequent calls it is set to 0 by soup_message_get_https_status(). The patch makes sense, the question is why this is called multiple times for this page and not others, is it because of the redirection? can we emulate that in a unit test?
Brian Holt
Comment 8 2013-09-18 05:58:36 PDT
(In reply to comment #5) > [...] > The patch makes sense, the question is why this is called multiple times for this page and not others, is it because of the redirection? can we emulate that in a unit test? Sure, I'll try to reproduce it in the TestSSL unit test and upload a new patch.
Carlos Garcia Campos
Comment 9 2013-09-18 06:01:29 PDT
(In reply to comment #8) > (In reply to comment #5) > > [...] > > The patch makes sense, the question is why this is called multiple times for this page and not others, is it because of the redirection? can we emulate that in a unit test? > > Sure, I'll try to reproduce it in the TestSSL unit test and upload a new patch. Thanks!
Sergio Villar Senin
Comment 10 2013-09-18 07:23:07 PDT
(In reply to comment #6) > (In reply to comment #4) > > Are you sure https://www.aeat.com is showing that behaviour, it redirects to a non secure http site. Anyway... > > > > Try it in Firefox/Chrome and compare to WK2, you should expect to see 3 errors: expired + bad identity + unknown CA Yeah but that's because they warn the user, probably we should do the same, but currently we just go on with the redirection. So it's normal that the errors are cleared because they belong to the original https site not to the redirected one. IMO it makes no sense to show the errors in the redirected page, we either ask the user for confirmation or just completely forget about the errors.
Brian Holt
Comment 11 2013-09-18 07:44:55 PDT
(In reply to comment #10) > [...] > Yeah but that's because they warn the user, probably we should do the same, but currently we just go on with the redirection. Should we fail page loading at this point with TLS errors and not allow the redirection to go ahead? Why does this not happen now and what is the best way of doing this?
Sergio Villar Senin
Comment 12 2013-09-18 07:56:15 PDT
(In reply to comment #11) > (In reply to comment #10) > > [...] > > Yeah but that's because they warn the user, probably we should do the same, but currently we just go on with the redirection. > > Should we fail page loading at this point with TLS errors and not allow the redirection to go ahead? Why does this not happen now and what is the best way of doing this? I think we definitely should, that redirection is a huge security issue because users won't notice that a compromised "secure" site (like your bank) is redirecting you to some let-me-steal-your-password pirate site. In any case I think that's a matter of the webkit embeders and not the engine itself. So in your example, epiphany should get the "decide-policy" signal which carries a WebKitNavigationPolicyDecision which has the request. I think in that case epiphany should get the request, check that there are some errors and ask the user whether they want to complete the navigation or cancel the redirection.
Carlos Garcia Campos
Comment 13 2013-09-18 08:01:54 PDT
We don't warn because we are currently ignoring TLS errors by default, but Brian said that webkitWebViewLoadFailedWithTLSErrors is not called even when not ignoring TLS errors, if that's true, it's a bug. The plan is to shown an error page, but first we need to add support to allow the user to ignore individual TLS errors, and that's the API Brian is currently working on.
Brian Holt
Comment 14 2013-09-18 08:04:23 PDT
> In any case I think that's a matter of the webkit embeders and not the engine itself. So in your example, epiphany should get the "decide-policy" signal which carries a WebKitNavigationPolicyDecision which has the request. I think in that case epiphany should get the request, check that there are some errors and ask the user whether they want to complete the navigation or cancel the redirection. That's exactly what I'm aiming to support in https://bugs.webkit.org/show_bug.cgi?id=120160. The only problem is that webkitWebViewLoadFailedWithTLSErrors is not called when a site is loaded that has TLS errors...
Sergio Villar Senin
Comment 15 2013-09-18 08:08:43 PDT
(In reply to comment #13) > We don't warn because we are currently ignoring TLS errors by default, but Brian said that webkitWebViewLoadFailedWithTLSErrors is not called even when not ignoring TLS errors, if that's true, it's a bug. > The plan is to shown an error page, but first we need to add support to allow the user to ignore individual TLS errors, and that's the API Brian is currently working on. Ah OK then I didn't understand the bug correctly. In any case I think the real issue is to know why the errors are being removed something that is not clear to me.
Carlos Garcia Campos
Comment 16 2013-09-18 08:15:10 PDT
(In reply to comment #15) > (In reply to comment #13) > > We don't warn because we are currently ignoring TLS errors by default, but Brian said that webkitWebViewLoadFailedWithTLSErrors is not called even when not ignoring TLS errors, if that's true, it's a bug. > > The plan is to shown an error page, but first we need to add support to allow the user to ignore individual TLS errors, and that's the API Brian is currently working on. > > Ah OK then I didn't understand the bug correctly. In any case I think the real issue is to know why the errors are being removed something that is not clear to me. And that's why I'm asking for a unit test :-)
Brian Holt
Comment 17 2013-10-02 10:03:30 PDT
Removing the dependency, as the TLS permission API patch works without this. I will investigate this soon.
Carlos Garcia Campos
Comment 18 2014-04-30 03:11:51 PDT
Comment on attachment 211983 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=211983&action=review > Source/WebCore/ChangeLog:8 > + No new tests (OOPS!). You should remove this, commit-queue will refuse to land this patch with this line here. > Source/WebCore/platform/network/soup/ResourceResponseSoup.cpp:71 > + GTlsCertificateFlags tlsFlags = static_cast<GTlsCertificateFlags>(0); I would use tldErrors instead of tlsFlasg for consistency, making clear that this is the same as m_tlsErrors
Brian Holt
Comment 19 2014-04-30 09:00:28 PDT
Brian Holt
Comment 20 2014-04-30 09:05:40 PDT
I have a unit test, but I'm not convinced that it tests the issue properly. So in order to make progress with this issue I've rebased and uploaded the patch again and created a new bug for the GTK unit test (bug 132384). This fix should probably also be backported to the 2.4 (and possibly the 2.2) releases.
Carlos Garcia Campos
Comment 21 2014-04-30 09:14:00 PDT
(In reply to comment #20) > I have a unit test, but I'm not convinced that it tests the issue properly. why? what's the issue? You should have a failing test (maybe timing out because the expected signal is not emitted) without the patch and a passing test with the patch. > So in order to make progress with this issue I've rebased and uploaded the patch again and created a new bug for the GTK unit test (bug 132384). Well, having a unit tests reproducing the issue would help me to understand the problem, the fact that you have a unit test that you don't know if it tests the issue makes me doubt, because I don't understand the EFL test. > This fix should probably also be backported to the 2.4 (and possibly the 2.2) releases. Yes, I'll backport it.
Brian Holt
Comment 22 2014-05-01 03:05:16 PDT
Carlos, if you were wondering if this really is a bug, you can follow these steps to reproduce with the problem in the MiniBrowser: 1) Modify main.c of MiniBrowser to set the TLS policy to fail (default is ignore) webkit_web_context_set_tls_errors_policy(webkit_web_context_get_default(), WEBKIT_TLS_ERRORS_POLICY_FAIL); 2) Build webkit and run $ ./bin/MiniBrowser https://www.aeat.com/ The site https://www.aeat.com/ has an invalid certificate so if it did not redirect, it would have failed. However, because it redirects to an http site http://www.ricardo-aea.com/cms/, the new site finishes the load without reporting an error. This is the bug. 3) Apply the patch attached to this bug report, rebuild and run $ ./bin/MiniBrowser https://www.aeat.com/ Observe that webkit now reports a TLS error.
Mario Sanchez Prada
Comment 23 2014-05-02 04:05:56 PDT
(In reply to comment #22) > Carlos, if you were wondering if this really is a bug, you can follow these steps to reproduce with the problem in the MiniBrowser: > > 1) Modify main.c of MiniBrowser to set the TLS policy to fail (default is ignore) > > webkit_web_context_set_tls_errors_policy(webkit_web_context_get_default(), WEBKIT_TLS_ERRORS_POLICY_FAIL); > > 2) Build webkit and run $ ./bin/MiniBrowser https://www.aeat.com/ > > The site https://www.aeat.com/ has an invalid certificate so if it did not redirect, it would have failed. However, because it redirects to an http site http://www.ricardo-aea.com/cms/, the new site finishes the load without reporting an error. This is the bug. > > 3) Apply the patch attached to this bug report, rebuild and run $ ./bin/MiniBrowser https://www.aeat.com/ > > Observe that webkit now reports a TLS error. Thanks Brian for the step-by-step guide to reproduce the problem (and for the unit test attached to bug 132384). Carlos, do you think that this is enough to land the fix now, providing an unit test (EFL, GTK or both) will follow? I'll comment on bug 131104 to see if we can get the EFL unit test reviewed promptly, assuming that the real fix would be landed through this bug anyway
Carlos Garcia Campos
Comment 24 2014-05-03 03:51:33 PDT
Comment on attachment 230480 [details] Patch Thanks!
Carlos Garcia Campos
Comment 25 2014-05-03 04:26:48 PDT
Comment on attachment 230480 [details] Patch hmm, after trying the patch I've realized that this is not the right fix. This patch is setting the tls errors to the response after the redirection, which is not even a HTTPS response. I think we should fail *before* the redirection, so that we don't see the redirected URL in the browser either.
Carlos Garcia Campos
Comment 26 2014-05-03 04:33:41 PDT
Created attachment 230752 [details] Alternative patch Checks the TLS errors before starting a redirection.
Brian Holt
Comment 27 2014-05-06 02:53:57 PDT
(In reply to comment #25) > (From update of attachment 230480 [details]) > hmm, after trying the patch I've realized that this is not the right fix. This patch is setting the tls errors to the response after the redirection, which is not even a HTTPS response. I think we should fail *before* the redirection, so that we don't see the redirected URL in the browser either. Thinking about it I agree with you that we should fail before the redirection. I wasn't sure about expected behaviour except to know that at some point the load should fail and the error should be reported. Failing earlier makes sense (and probably doesn't require it's own unit test then?).
Carlos Garcia Campos
Comment 28 2014-05-07 02:37:31 PDT
Created attachment 230980 [details] Updated patch including GTK unit test Before: /webkit2/WebKitWebView/tls-errors-redirect-to-http: ** ERROR:../../Tools/TestWebKitAPI/Tests/WebKit2Gtk/TestSSL.cpp:142:void testTLSErrorsRedirect(SSLTest*, gconstpointer): assertion failed: (test->m_loadFailed) After: /webkit2/WebKitWebView/tls-errors-redirect-to-http: OK
Sergio Villar Senin
Comment 29 2014-05-07 02:50:48 PDT
Comment on attachment 230980 [details] Updated patch including GTK unit test Nice fix!
Carlos Garcia Campos
Comment 30 2014-05-07 03:12:08 PDT
Note You need to log in before you can comment on or make changes to this bug.