Issue:
Oftentimes people enter google.com
directly in the browser's address bar without including either the http://
or https://
prefixes.
Using Chrome DevTools on a fresh incognito session, I ran the following experiment:
STEPS: ----------------- Enter "google.com" (or equivalently "http://google.com") directly in the browser's address bar. 1. Request: http://google.com; Response: Status Code: 301 Moved Permanently Location: http://www.google.com/ Cache-Control: public, max-age=2592000 2. Request: http://www.google.com; Response: Status Code: 302 Found Location: https://www.google.com/?gws_rd=ssl 3. Request: https://www.google.com/?gws_rd=ssl; Response: Status Code: 200 strict-transport-security: max-age=31536000 NOTES: ----------------- * To get the same results, start a fresh incognito session (close all incognito windows and open a new one). If you already have an incognito window open you might not get the same results. Having "disable cache" checked won't help either. * If you repeat the experiment from the same incognito session, you'll notice the following differences from the first time around: * Request 1: If "disable cache" is unchecked (which mimics the browser's behavior during normal usage), the response will be from cache due to the "Cache-Control: public, max-age=2592000" response header returned the first time around. This means that the http request is not sent out (even though it still shows a 301 response) which is probably a good thing. * Request 2: The response will be a 307 instead of 302. This is due to the "strict-transport-security: max-age=31536000" returned by the third request the first time around. This is the case regardless of whether "disable cache" is checked or not. * Once the browser becomes aware that a domain is HSTS protected (either via the HSTS preload or the STS response header) the browser will "internally" redirect all http requests to https for that domain. These redirects are displayed in network tab as "Status Code: 307 Internal Redirect" (which is kind of misleading since it looks like the response is coming from a server when in reality its all happening within the browser. Notice that there is no "Remote Address" in the "General" section for these requests * Another (perhaps easier) way to check if a domain is HSTS protected is by entering the domain in https://hstspreload.org/ but there are caveats! https://hstspreload.org/ reports the following for "www.google.com": - "Response error: No HSTS header is present on the response." - "`http://www.google.com` does not redirect to `https://www.google.com`" Neither of these findings is consistent with what is observed in the network tab in the above experiment! I emailed the hstspreload mailing list and received the following interesting response: "The server for http://www.google.com doesn't always redirect http to https, which is why this error appears. E.g. if I use curl, I don't get the redirect." -----------------
Privacy/security concerns:
The initial request to
google.com
is made overhttp
sincegoogle.com
is not included in the HSTS preload list. This request is vulnerable to MITM attacks.At no point is the browser redirected to
https://google.com
, therefore the STS header is never set for this domain. This means that even future requests togoogle.com
will not be HSTS protected and may therefore be vulnerable to MITM attacks!It's worth noting that the cache-control max-age=2592000 (30 days) response header included in the initial 301 redirect does seem to provide a level of protection similar to what HSTS provides since it causes future requests to
http://google.com
to be handled "internally" by the cache (and importantly redirected to the HSTS protected "www.google.com" domain). On the other hand, the cache-controlmax-age
is set to expire after 30 days (much shorter than what the HSTSmax-age
is usually set to) and, most importantly, unlike the HSTSmax-age
which is refreshed on everyhttps
request made to an HSTS enabled domain, the cache-controlmax age
is not refreshed until a new insecurehttp
request is made! This means that your requests togoogle.com
can be intercepted as often as once every 30 days.The request to
www.google.com
is made over http and is vulnerable to MITM attacks. At least in this case the response is a 302 redirect tohttps://www.google.com
which does include the STS header. This means that any subsequent requests tohttp://www.google.com
will be "internally" redirected to https by the browser, as noted above, the HSTSmax-age
is refreshed on every request. So as long as your browser makes a request tohttps://www.google.com
at least once a year (which is what the STSmax-age
expiry is set to), all requests to that domain will be HSTS protected.
TL;DR - "google.com" is not HSTS protected and it seems as though requests can potentially be subject to MITM attacks as often as once every 30 days (or more often if cache is cleared or incognito mode is used).
This may not be as bad as it sounds for the following reasons:
- All important cookies for
.google.com
andwww.google.com
most definitely have thesecure
flag set. google.com
seems to do nothing more than redirect towww.google.com
so any request togoogle.com
would realistically only be to the root path (Therefore the URL itself wouldn't be interesting to an eavesdropper).- Google subdomains that send/receive more sensitive data (e.g. gmail.com, accounts.google.com...) are on the HSTS preload list. So even if an attacker sets up something like sslsplit and a user ends up on an attacker controlled
http://www.google.com
(which is already hard enough to pull of as it requires the user not to notice the missing padlock icon), the HSTS preloaded domains would still be protected. An attacker would therefore need to prevent a user from navigating to any of those subdomains.
Questions
- What could be the reasons why Google hasn't enabled HSTS for
google.com
- What could be the reasons why Google has only enabled the STS header for
www.google.com
but hasn't added that domain to the HSTS preload list?