VPN 能防住 KRACK 吗?补丁到底修了什么
VPN 能把流量藏起来,却修不了 WPA2 握手。这里说明 2017 年那个补丁改了什么,以及每一层各自管什么。
如果你买 VPN 是因为看到标题说 KRACK 攻破了 Wi-Fi 加密,那你修的是错误的层。2017 年那次披露描述的是一类针对 WPA2 四次握手的密钥重装攻击,而修复是以操作系统更新、无线驱动补丁和路由器固件的形式到来的。隧道能把你的流量藏起来,不让本地网络看见,却修不了在它下面完成的握手。所以第一个问题不是该买哪家 VPN,而是你哪些设备还在跑没打补丁的无线协议栈。
同样的区分也回答了预算上的顾虑。买不起订阅的人从来没有被排除在真正的解法之外,因为解法是免费更新。花钱的地方在于更换那些再也拿不到更新的硬件。
攻击究竟动了什么
WPA2 在关联时通过四次握手派生新的成对密钥。接入点发出一个随机数,客户端用自己的随机数回应,双方算出成对临时密钥,接入点再用一条客户端确认的消息完成确认。密钥重装攻击不猜口令,而是打乱这个顺序,迫使客户端安装一个它已经装过的密钥。每一次重装都可能把绑定在该密钥上的发送随机数和接收重放计数器清零。
计数器一旦回退,本该被拒收的一部分流量又变得可以接受。视变体和实现而定,处在无线电范围内的攻击者可以重放、解密或注入帧。组密钥握手和快速切换握手各有自己的变体,所以那份公告列出的攻击名称不止一个。
Android 6.0 及更高版本是最糟的情况。它的 wpa_supplicant 版本会被迫安装一个全零密钥,这让解密比那些重装只清零计数器的平台容易得多。这个细节把当时最常见的手机平台上的理论弱点变成了实际弱点。
修复住在无线协议栈里
上游的修正要求 supplicant 和接入点在密钥已经装好之后忽略重发的握手消息。打过补丁的 wpa_supplicant 和 hostapd 构建都带着它,各发行版也把它回移到旧分支,所以 wpa_supplicant -v 打印出来的字符串只是起点,不是判决。请读发行版的安全公告,确认那一个具体补丁,而不只是版本号。报着旧版本号的构建也可能已经修好,报着新版本号的构建也可能缺厂商的回移。
链路两端都要看。修好的路由器不会给连它的笔记本打补丁,修好的笔记本也不会给路由器打补丁。厂商按产品发布公告,而路由器修复往往落后于手机更新,因为每个型号都需要自己的固件构建。如果某台设备的最后一个版本早于公告,就把它当作未修复,直到厂商另有说法。
对无法更新的设备,选择既窄又不体面。让它退役,把它隔离在承载敏感流量的网络之外,或者把它限制在一个只有同样可弃的同类所在的网段。这些选择都不需要订阅,也都不会因为换一家隧道服务商而变好。
隧道到底覆盖什么
VPN 挪动的是边界。你的设备把每个包加密后发给 VPN 服务器,由服务器解密再转发。摆弄 Wi-Fi 链路的人看到的是隧道外层的数据包,而不是里面的载荷,所以一次暴露链路层帧的重装攻击,并不会自动暴露被隧道保护的连接内容。即便下面的无线协议栈仍然脆弱,这层保护也依然成立,而这两种手段被混为一谈,原因正在于此。
前提是走了隧道。分流、绕过清单或门户例外会把一部分流量放到隧道之外,那部分流量从中得不到任何好处。同一个网络里那些从没装过客户端的设备也是如此。隧道是按设备、按路由的决定,不是房间的属性,而路由器级别的 VPN 只覆盖真正经过路由器的那部分。
隧道做不到的是修驱动、挡住取消认证洪水,或者阻止攻击者干扰信道。它也保护不了一条从不进入它的连接。这些属于可用性和链路层的问题,无论隧道的密码套件多强,都留在无线协议栈那边。
HTTPS 和隧道保护的是不同的跳
一次页面加载可能包含三层独立的保护:Wi-Fi 链路、到 VPN 服务器的隧道,以及到网站的 TLS 会话。每一层都独立协商。带有效证书和现代协议版本的 TLS,即便第一跳是敌对的,也能给你浏览器与站点之间经过认证的加密,因为正是证书校验挡住了冒充者塞进自己的密钥。
这项校验在边缘上有薄弱点。把 HTTPS 重定向到 HTTP、页面用普通 HTTP 加载脚本,或者用户点过证书警告继续前进,都会把流量挪到受保护会话之外。HSTS 和浏览器的中间页之所以存在,是因为这些错误很常见,而不是因为 TLS 脆弱。
保留 HTTPS 和隧道,并不会让无线实现变得无懈可击。帧仍然被有缺陷的驱动解密;区别在于攻击者能在里面找到什么,以及那些内容是否已经被别的手段保护过。
混合网络的修复顺序
从接入点开始,因为它是你管得着、每个客户端都依赖的那台设备。然后逐个过客户端的操作系统,从最老的开始,因为停止收到更新的平台就是永远不会被修复的那些。等这份清单做完,VPN 的决定才有意义,而且它管的是暴露面,不是修复。反过来做,先隧道后固件,只会让真正的缺陷在原地待着,直到订阅到期。
把你核实过的东西写下来,包括固件版本和日期。已更新不是一个别人以后能审计的状态。
三项检查覆盖了大部分工作,而且按这个顺序来。别因为前两项干净就跳过第三项。
- 路由器固件:把已装版本与厂商的公告页对照,而不是去按更新按钮。
- 客户端系统:为每台手机、笔记本和平板确认补丁级别包含那项无线修复。
- 遗留项:列出没有补丁路径的设备,决定退役、隔离还是接受。
如果遗留清单很长,带客户端隔离的访客网络能在换硬件期间争取时间。然后在每个频段上测一台已知客户端,记下结果,等下一次固件发布后再查一遍。硬件清单是让下一份公告变快的东西;隧道是那段时间里补住缺口的东西。