HSTS

Published at 19th August, 2015

强制使用 HTTPS 一定能保障网站安全吗?并不是。虽然中间人在 HTTPS 协议下会被发现,然而中间人还可以阻止用户使用 HTTPS,强制使用不安全的 HTTP 从而截获和篡改流量,即使服务端只允许 HTTPS 也无法完全避免该攻击。

原理很简单,用户在浏览器中输入地址时,大多数时候是不包含 https: 的,也就是初始访问很可能是 http: 。中间人此时只需屏蔽服务端发送的 HTTPS 重定向 header (例如 location: https://example.com),并修改响应主体中的 HTTPS 地址到 HTTP,最后以 HTTP 方式继续和客户端交互数据就可以了。对于客户端来说,它以 HTTP 和中间人通信;对于中间人来说,它以 HTTPS 和服务端通信,因此服务端无法防御此类攻击。没有专业知识的客户端一般不会留意非 HTTP 通信,因此这种攻击往往很有效。

该攻击叫做 SSL stripping,具体可参见该演讲:https://www.youtube.com/watch?v=MFol6IMbZ7Y

HSTS 机制可以一定程度上降低该攻击风险,提高安全性。HSTS 是一个 header,告诉浏览器未来该域名(或该域名和子域名)的访问一律使用 HTTPS 协议。浏览器一旦收到 HSTS header,那么在有效时间内,域名下的后续请求都会强制使用 HTTPS,从而避免了后续访问中的 SSL stripping 攻击。

Strict-Transport-Security: max-age:31536000; includeSubDomains

以上就是一个 HSTS 样例,含义为,该域名及其子域名在未来 31536000 秒(365 天)内都一律使用 HTTPS 协议。

然而,这仍然不能保障完全安全。这是因为,用户的首次访问(即浏览器收到 HSTS 前)仍然可能是 HTTP,如果用户流量从最开始就被 MITM 攻击了,那么 HSTS 是可以被绕过的。

为了解决这个问题,Chrome、Firefox、IE、Edge 等浏览器引入了 HSTS Preload 机制,简单来说就是浏览器内置了一张 HSTS 表,表中的域名首次访问也会强制使用 HTTPS 协议。Chrome、Firefox、IE 11+、Edge 浏览器使用的是同一个内置列表。

您可以在这里申请将自己的域名加入 HSTS Preload 表。注意你的网站需要满足它上面所罗列的几项要求后,才会被审核通过。本站 breeswish.org 已经在 Chrome HSTS 内置列表中了,所以如果你的浏览器比较新,那么访问本站完全不会被 SSL strip 攻击 :-)

Comments