зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1382359: Treat .onion as a secure context
Websites which collect passwords but don't use HTTPS start showing scary warnings from Firefox 51 onwards and mixed context blocking has been available even longer. .onion sites without HTTPS support are affected as well, although their traffic is encrypted and authenticated. This patch addresses this shortcoming by making sure .onion sites are treated as potentially trustworthy origins. The secure context specification (https://w3c.github.io/webappsec-secure-contexts/) is pretty much focused on tying security and trustworthiness to the protocol over which domains are accessed. However, it is not obvious why .onion sites should not be treated as potentially trustworthy given: "A potentially trustworthy origin is one which a user agent can generally trust as delivering data securely. This algorithms [sic] considers certain hosts, scheme, and origins as potentially trustworthy, even though they might not be authenticated and encrypted in the traditional sense." (https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy) We use step 8 in the algorithm to establish trustworthiness of .onion sites by whitelisting them given the encrypted and authenticated nature of their traffic.
This commit is contained in:
Родитель
8809c05b7b
Коммит
dd4fb3ba9f
|
@ -867,6 +867,10 @@ HTMLFormElement::DoSecureToInsecureSubmitCheck(nsIURI* aActionURL,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
if (nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(aActionURL)) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowOuter> window = OwnerDoc()->GetWindow();
|
||||
if (!window) {
|
||||
return NS_ERROR_FAILURE;
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "nsIImageLoadingContent.h"
|
||||
|
||||
#include "mozilla/dom/Element.h"
|
||||
#include "mozilla/dom/nsMixedContentBlocker.h"
|
||||
#include "mozilla/dom/TabChild.h"
|
||||
|
||||
NS_IMPL_ISUPPORTS(nsContentSecurityManager,
|
||||
|
@ -879,6 +880,12 @@ nsContentSecurityManager::IsOriginPotentiallyTrustworthy(nsIPrincipal* aPrincipa
|
|||
}
|
||||
}
|
||||
}
|
||||
// Maybe we have a .onion URL. Treat it as whitelisted as well if
|
||||
// `dom.securecontext.whitelist_onions` is `true`.
|
||||
if (nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(uri)) {
|
||||
*aIsTrustWorthy = true;
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -395,6 +395,28 @@ nsMixedContentBlocker::IsPotentiallyTrustworthyLoopbackURL(nsIURI* aURL) {
|
|||
return host.EqualsLiteral("127.0.0.1") || host.EqualsLiteral("::1");
|
||||
}
|
||||
|
||||
/* Maybe we have a .onion URL. Treat it as whitelisted as well if
|
||||
* `dom.securecontext.whitelist_onions` is `true`.
|
||||
*/
|
||||
bool
|
||||
nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(nsIURI* aURL) {
|
||||
static bool sInited = false;
|
||||
static bool sWhiteListOnions = false;
|
||||
if (!sInited) {
|
||||
Preferences::AddBoolVarCache(&sWhiteListOnions,
|
||||
"dom.securecontext.whitelist_onions");
|
||||
sInited = true;
|
||||
}
|
||||
if (!sWhiteListOnions) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsAutoCString host;
|
||||
nsresult rv = aURL->GetHost(host);
|
||||
NS_ENSURE_SUCCESS(rv, false);
|
||||
return StringEndsWith(host, NS_LITERAL_CSTRING(".onion"));
|
||||
}
|
||||
|
||||
/* Static version of ShouldLoad() that contains all the Mixed Content Blocker
|
||||
* logic. Called from non-static ShouldLoad().
|
||||
*/
|
||||
|
@ -725,6 +747,13 @@ nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
|
|||
return NS_OK;
|
||||
}
|
||||
|
||||
// .onion URLs are encrypted and authenticated. Don't treat them as mixed
|
||||
// content if potentially trustworthy (i.e. whitelisted).
|
||||
if (isHttpScheme && IsPotentiallyTrustworthyOnion(innerContentLocation)) {
|
||||
*aDecision = ACCEPT;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// The page might have set the CSP directive 'upgrade-insecure-requests'. In such
|
||||
// a case allow the http: load to succeed with the promise that the channel will
|
||||
// get upgraded to https before fetching any data from the netwerk.
|
||||
|
|
|
@ -48,6 +48,7 @@ public:
|
|||
// See:
|
||||
// https://w3c.github.io/webappsec-secure-contexts/#is-origin-trustworthy
|
||||
static bool IsPotentiallyTrustworthyLoopbackURL(nsIURI* aURL);
|
||||
static bool IsPotentiallyTrustworthyOnion(nsIURI* aURL);
|
||||
|
||||
/* Static version of ShouldLoad() that contains all the Mixed Content Blocker
|
||||
* logic. Called from non-static ShouldLoad().
|
||||
|
|
Загрузка…
Ссылка в новой задаче