51期间微博有个热点,是关于某地一对情侣因为一方自动连上酒店Wi-Fi导致分手,很多人在评论区争吵,到底能否自动连上?专业的非专业的都有,正反观点都有。

我认为,实际上所有的分析都可能是正确的,即使是互相矛盾的,就像无法解出的数学题一样,因为条件不够。

跟Wi-Fi相关技术是非常复杂的,终端上有手机、Pad、IoT、电脑,路由器有不同厂家,操作系统有Windows、Linux、iOS、Android,协议的演进有WEP、WPA、WPA2、WPA3,每个协议里面的握手参数也非常多,RFC都有几十个,很多RFC又是不断打补丁。

而且为了兼容性,为了便利性,很多终端界面上隐藏了非常多的细节,导致你很难进行技术性分析。

因为这些不透明,所以大家才会很糊涂。

我如何确认我要连的Wi-Fi是我想连的?

答案是,很难。因为Wi-Fi路由器没有证书这种东西。手机在扫描过程中,遇到相同的SSID和加密类型,他就会自动使用密码跟AP/Wi-Fi路由器进行握手,如果密码正确,手机就可以通过那个AP上网了。

跟以前手机的2G网络一样,只有单向的认证,所以有很多伪基站的存在。现在很多地方已经下线2G基站了,如果你的手机有设置不回退到2G的选项,建议设置上。

有些人会谈到BSSID,这一般是AP的MAC地址,SSID只是给人看的,真正的手机是通过BSSID跟AP进行通讯的,所以BSSID也是一个非常重要的概念,为了实现漫游,不同的BSSID会广播相同的SSID,所以手机一般不会看BSSID不同而阻止这个自动连接。

所以在微博热点这个案例里,很大概率是会自动连接的。如果你设置了“前台”,并且密码是8个8,并且选择了自动连接,那你可能经常手机的部分流量就被一些流氓AP抓走。你可能认为这些人傻了,我能上网省流量好像是我有利,实际上不是的,你抓包就可以知道,很多连接都还是没有加密的。

提前知道:我需要关注什么安全问题

写到后面我自己头都已经有点晕了,因为我不是专业搞无线的,强行写会有很多错误。我试着写出我的理解,欢迎指出错误。不过最重要的,我放在最前面,避免很多人无法坚持阅读到最后。

  • 如果流量够,尽量只使用移动运营商的4G/5G网络,不要去连接各类Wi-Fi,对于你所看到的Wi-Fi是不是你想连接的Wi-Fi的认证,现在还有很多缺失。偶尔使用,也不要设置“自动连接”,并且定期删除“已保存的网络“。
  • 低版本的开放的无线网络是没有加密的,尽量不使用。如果临时要用,注意可以拨号VPN加密隧道。有些学校的VPN只会路由校内IP,不会帮你过所有流量。HTTPS和已经记住证书指纹的远程桌面是安全的。
  • 手机定期一两年就要更新一下。家里的Wi-Fi路由器几年也要更新一下。钱不多,不能省。
  • 家里路由器必须有访客模式,IoT设备比较多的,可以再多分区分域。智能家居可单独一个隐藏的SSID,可能是2.4G的,密码复杂并且更新频率可以更长一点。记在Windows里的Wi-Fi密码可以简单通过netsh wlan show profiles name=xxx key=clear获得。
  • 企业Wi-Fi网络的证书、匿名、和随机MAC很重要。
  • 出发漫游之前先在安全的环境下信任证书,配置账户名和密码。

Wi-Fi网络最重要的加密和认证

因为Wi-Fi跟有线网差别比较大,任何人都是可以接收到空中的数据的,所以加密在这里非常重要。又由于家用方面,密码被同时用在加密和认证,所以下面2个部分很多会搅合在一起。

加密:开放的Wi-Fi网络

开放的Wi-Fi网络一般是在宾馆或者机场,这类网络没有任何安全加密,你连上后需要的进行基于浏览器的认证,这个认证只是认证你是否有上网的权限,而不对任何信息进行加密。你的所有通信都可以被在空中截取,篡改。在开放的网络上,你只能依赖上层提供的安全能力,比如HTTPS、DNSSEC、VPN等等。而DNSSEC应用还较少,如果你要明确的安全,建议可以使用DoH、DoT确保。但是任何情况下,不建议连接开放的Wi-Fi网络。

即使你在开放的Wi-Fi网络上进行HTTPS的认证,你其实也无法准确确认这个HTTPS的URL是权威的网站的URL,你在这个HTTPS里输入的账户名和密码有可能被劫持。所以只看TLS证书是不够的,还需要明确,URL确实是官方的URL。如果认证界面本身不是HTTPS的,建议你第一时间关闭浏览器,因为可能说明这个网络的后端管理员安全意识或者能力不强。

加密:Wi-Fi的加密方式

接着到有加密的Wi-Fi网络,一般会有WEP、WPA、WPA2、WPA3。WPA/WPA2/WPA3又分为Personal和Enterprise。简单说就是家用和企业版的。区分家用和企业级的,就看是否每个人是独立的Wi-Fi密码。家用的只有一个密码,而企业级的,是每个人一个独立的账户名和密码的。当然,你如果小型企业,或者家里有钱,这2个也是可以混用的。

在家用方面,Wi-Fi的密码称为PSK(Pre-Shard Key),预共享密钥。也就是有一个密码,保存在你手机和Wi-Fi路由器里面,这个密码通过带外设置。这个密码不会明文在Wi-Fi网络里传输。这个涉及到后面说到的密码的验证机制。

WEP我们都知道,已经不够安全,会导致PSK非常简单被破解出。

WPA们使用了PTK会话密钥加密。WPA使用TKIP算法加密,已经被认为不安全。WPA2使用AES-CCMP算法加密,WPA3更进一步,使用SAE(Simultaneous Authentication of Equals,对等实体同时验证)协议。

在家用方面,PTK从PSK等派生出来,所以在家用的Wi-Fi网络加密中,如果攻击者可以完整抓到所有的流量,从4次握手开始一个不拉,并且知道PSK,是可以解开所有流量的。

在企业级,PTK派生自PMK,PMK又是MSK的一部分,MSK通过认证后交换,后面会谈到认证,在TLS加密隧道里交换MSK,可以认为是安全的,所以即使攻击者能拿到所有流量,也无法解开。

所以可以认为,企业级,是把加密和认证分开了,而家用是混在一起。

WPA3也引入了WPA3-OWE,可以在不需要密码的情况下进行加密,也就是前面说到的开放的Wi-Fi网络,可以不使用密码连接,但是每个手机和AP之间流量是加密的。

认证:密码是如何验证的

说完了加密方式,接着说密码的验证。

最简单的密码验证方式是,你提交给远程服务器你的账户名和密码,远程服务器拿到后将密码跟服务器数据库内保存的明文或哈希进行比较,正确了,确认你是你。一般正经的数据库不会保存明文密码。但是他会收到你的明文密码。

再进一步,有一些Web前端他会把你的密码在浏览器进行哈希后提交给远程Web服务器,这个保护会更进一步,但是意义不大。恶意用户拿到哈希,直接提交给远程Web服务器,还是会验证通过。这个实现意义不大并且工作量大,一般主流的Web应用程序不会这么做,而是依赖于通信链路的安全,比如端到端的TLS加密。

在上面这个实现,密码没有明文在网络中传输,只有最后的哈希,但是无法抵抗暴力破解和重放攻击。

再进一步,为了防止重放攻击和加大暴力破解难度,服务端会发送一个随机数,客户端把这个随机数加到密码里面来哈希(Salt盐)。这就是Wi-Fi里经常用到的Challenge-Response、CHAP(Challenge Handshake Authentication Protocol,质询握手认证协议)的机制。

然而挑战/应答只是加大了暴力破解难度,Salt对于拿到了流量的恶意用户是可见的。

家用

PSK参与了加密和认证,在WPA们,常用的四次握手协议,在这四次握手过程中,除了服务端会验证客户端是否有正确的PSK外,客户端也会验证服务端有正确的PSK,达到了伪双向认证的目的。

所以你不用担心有流氓Wi-Fi路由器在不知道PSK的情况下,可以让你的手机通过它上网抓取上网流量。

但是无法解决暴力破解问题。流氓Wi-Fi路由器他会设置跟你一样的SSID和加密方式,来收集你哈希过后的PSK,进行暴力破解。

这个暴力破解可以脱机进行。脱机暴力破解就是恶意用户他可以拿到你的Wi-Fi流量,在整个过程中不停尝试PSK,因为流量里有验证通过的逻辑,所以如果PSK较弱并且给足够的时间,是可以尝试出PSK的。一旦有了PSK,流量可以被全部解析。而且一个PSK泄露,会导致历史上的所有流量被解密,没有前向安全(Forward Secrecy)。HTTPS是否还会被监听

这也就有了WPA3的SAE(PAKE 中的 Dragonfly 协议)。使用了SAE,攻击者无法离线尝试密码,因为里面用到了公钥私钥机制,并且即使PSK泄露,通过中间人攻击他可能可以窃听在线解密流量,但是历史上保存的流量无法被解析。

但是SAE还只是对等实体同时验证,只验证双方知道PSK,无法验证你要连的Wi-Fi就是你想连的。在难度很高的情况下,是会受到中间人攻击的。这时候就必须引入企业级Enterprise的认证机制,常用的就是802.1X,基于RADIUS的认证。

更安全的企业级Wi-Fi

更安全只是当前,从前面协议的变迁来看,协议他不是一开始就解决所有问题的,而且很多问题是出来后才发现的。所以现在的安全也不代表未来的安全。

在企业级的Wi-Fi环境里,如果正确地配置了客户端,服务器,可以认为是安全的,但是最大的前提是,要正确的配置。

企业级的Wi-Fi使用802.1X,你在客户端配置了账户名和密码,会使用EAP协议进行封装,通过AP交给后端的RADIUS来认证,RADIUS一般会继续交给再后端的LDAP或者数据库来认证。

eduroam

我们以一个更加复杂的eduroam来说明企业级如何验证,并且如何保证隐私。这个前期是你必须有一点点的eduroam知识,802.1X和RAIDUS知识,简单的科普我不在这里细说。

前面说到正确配置,这涉及到管理员的安全意识和他编写的手册和用户自身的安全意识。比如某次eduroam发现部分单位使用Web Captive Portal

xxxx University using a Web Captive Portal for an open network named “eduroam”.

这实际上违反了加入eduroam签署的协议,很多管理员可能都没看就签了。

为什么说eduroam复杂,因为这涉及到你的终端,你的机构(Home Institution,HI)的AP和RADIUS服务器,你到访的机构(Visited Institution, VI)的AP和RADIUS服务器,还有中间的漫游联盟的RADIUS服务器。如果把恶意用户加入,就会有:在你身边抓包的人;仿冒eduroam的人;恶意的AP或RADIUS管理员;管理员不是恶意的,但是管理员技术能力较弱,被恶意入侵。

你要知道在整个链路过程中,你的哪些信息是没有加密的,哪些是加密的。

在配置合理、正确的eduroam环境里,我们可以认为是安全的,安全在于

  • eduroam的802.1X认证是端到端的TLS加密,也就是,你的密码哈希只有你的机构才知道,你到访的机构是无法获得密码哈希的。
  • 在启用了匿名身份后(匿名身份在层次化RADIUS里更有用,如果是单个企业或学校内部,意义较小。又因为加密是在认证后开始的,所以前期数据是没有任何加密的,单个企业或者学校内部,匿名化可以确保周边的人不会抓包看到你是谁),你到访的机构和中间的国家级漫游联盟、国际漫游联盟是无法知道你到了哪里,只能知道有个机构的人到了另外一个机构。在eduroam中,两个层级之间通过点对点认证,一般是管理员之间共享密码和IP限制。未来的eduroam可能会再次进化,比如去掉中间商,让VI和HI直接通讯,这会使得只有VI才知道有个机构HI的人到了他这里。
  • 如果再设置了随机MAC,VI将较难将多次来访的同一个人关联在一起。随机MAC是增强用户隐私保护的功能,目的是防止设备被追踪。随机MAC只在网络扫描和初次连接时才有用,一旦连接构建完成,可能会使用真实MAC,也可能是随机的MAC,但是是固定的。这里各个终端实现不一样,具体你的终端如何实现的,可以简单做个实验。
  • 前面只说较难,你从人家的门口经过,就算带着口罩,也有很多种方法可以识别到你是同一个人,比如不小心的非加密连接泄露的浏览器指纹,Cookie等。比如连接的远程IP等等。当然这个比较无所谓,只是隐私,不是安全的问题。有些单位有加密VPN走所有流量,这确保了你即使漫游,隐私也是有保障的,不过这会让网络速度变慢。
  • 在漫游的环境下,VI会有些限制,比如限制你访问他们内网。也可能给了你一个IPv6地址,让你直接暴露在互联网。

企业级Wi-Fi的CA证书

在管理员和你都设置了正确的配置后,你在连接的时候会看到一个证书。这个证书不是AP或者Wi-Fi路由器的证书,是后端认证服务器RADIUS的证书。前面一直在说,你无法确认你要连接的Wi-Fi就是你想连的。考虑一种攻击,你设置了证书检查,但是你组织的RADIUS是对外开放的,没有防火墙配置,并且没有对AP进行认证,那恶意用户就可以拿着一个AP,就可以骗到你从他的AP上上网。

在对这个证书的信任上,多个终端行为有很大的不同。以Windows为例,有线无线也不同。在Wi-Fi网络里,在你连接时,只要求你输入账户名和密码,接着给你展示RADIUS服务公钥的指纹,请求你的确认。你只有点击进去才能看到证书详情。包括Android也是,貌似没有系统内置的某个根证书对这个证书的验证。Android在配置CA证书时,使用系统证书时需要输入一个域名(或者叫字符串),这个域名跟CA证书的CN或者SAN通配符匹配即可。但是如果没有根证书进行证书链验证,CN和SAN是可以任意写的。这使得第一次配置和CA证书轮替后的接受时间点的周边环境非常重要。

Apple设备可能也只认证书指纹,导致证书更换后都必须手工确认。

我们来看一个正确的客户端的eduroam的配置。

  • “EAP 方法”有PEAP、TLS、TTLS、PWD、SIM等等各类协议,根据不同的选择下面的其他选项不同。常用的一般就是PEAP。EAP是802.1X认证的核心部分,用于在802.1X认证中传输认证信息,PEAP具体实现了EAP。PEAP在EAP里面套壳了EAP,阶段1协商出一个隧道密钥,就是端到端的TLS加密,很安全。阶段2进行认证并且协商出内部会话密钥。
  • “阶段 2 身份验证”,选了PEAP,阶段2一般就是MSCHAPV2。
  • “CA 证书”就是前面说到的RADIUS的证书,这是确保阶段1安全的基础。我的小米手机比较奇怪,“首次使用时信任”不能使用,所以选择了“使用系统证书”,并且设置了“域名”为证书的CN或SAN。
  • “最低TLS版本”从1.0到1.3。1.3更为安全,但是要看RADIUS服务器是否支持。
  • “隐私”设置为“使用随机MAC”。
  • “身份”填写在单位的标识,是否加@和域名无所谓,因为路由实际上在“匿名身份”里完成。如果“匿名身份”不填写(不推荐),那会把“身份”设置到“匿名身份”,这时候必须加上@和域名。
  • “匿名身份”填写anonymous@域名,这是edoroam能否正确路由到你HI的关键。只有“@域名”这个才是路由,前面随便写都无所谓(为了真正达到匿名,应使用系统默认的匿名字符串,一般就是anonymous),这个会暴露给在阶段1抓包的人和所有经过的机构。

其他:

配置的管理

由于客户端实在太多,要正确配置很难,所以就有出现很多种简化这个配置过程的手段。比如家用路由器的扫码连接、WPS功能、PIN码连接。IoT设备的自动发现。企业推送的证书设置,使用MDM管理,profile的导入导出,或者类似geteduroam的App等等。这里面有些手段会引入新的安全问题。最好是弄明白后完全自己配置。

密码的策略

一些安全意识较高的高校密码顶层设计者一般会将统一身份认证密码、网络接入密码和邮箱密码分开。因为这3个是不同的概念,当然,这增加了用户记忆的难度,会被用户误解,并且很难阻止用户自己将他们设置为一样。

  • 统一身份认证密码一般用在Web应用程序里,在这里,你必须每次输入,或者扫码,或者有OTP认证,可以看到URL和Web服务器的TLS证书,相对安全。如果用户自己将其保存到浏览器里不是这里讨论的。
  • 网络接入密码一般是记忆在802.1X的客户端里的,如果你的终端被人拿到,这个密码是可以被获取的。有些组织本来没有打算将2个密码分开,但是由于LDAP和RADIUS的HASH算法不同,如果LDAP开始就没有生成多个密码哈希,导致误打误撞就将2个密码分开了,加大了安全性。
  • 邮箱密码是记录在邮件客户端的,并且每隔一段时间需要提交到邮件服务器进行验证的。如果你的终端被人拿到,这个密码是可以被获取的。如果验证过程不采用TLS加密,可能会被人嗅探。