手机验证码,这个看似安全的“双因子验证”方式,实际上存在着巨大的安全隐患。如何在危险的网络环境中保护自己的信息和财产安全?果壳网邀请网络安全专家tk教主为大家一解短信窃取的秘密。
豆瓣上那个关于多个账号被盗刷的帖《这下一无所有了》最近比较火。受害者的手机在半夜连续接到了100多条验证码,醒来发现自己支付宝等账号被盗,损失很重。发生了什么呢?仅从这些描述,其实还不足以断定攻击者采用了怎样的方式。有些人猜测这是通过无线监听窃取了验证码短信,还有人说睡觉前关机就可以防止被无线监听。
不幸的是,安全问题从来都是比较复杂的。窃取短信不一定只能通过无线监听;而即使真是通过无线监听攻击的,睡觉前关机也不一定就能防止。但还是可以说一下,为什么银行支付宝等机构会选择使用短信验证码这个机制,这个机制为什么不够安全,以及普通用户到底有什么能做的。
普遍意义上来说,信息系统是不太靠得住的。若干年前,网络安全环境比较糟糕的时候,绝大部分电脑都被至少一个恶意软件感染过。现在情况好一些,恶意软件感染量比过去少多了,但从服务器侧泄露数据的事儿仍然很多。再加上坏人手里还有过去十几年来陆续窃取的各种数据,所以我们在考虑安全问题的时候,只能假设每个人的基本信息:姓名、地址、身份证号、常用密码等在坏人手上都有一份。
短信验证码到底起什么作用?为了能在靠不住的信息系统里比较靠得住地进行一些重要操作,人们用了很多办法,其中一个叫“双因子验证”(Two-factor verification)。比如你要用电脑进行网银转账。设计网银安全体系的人就要假设你的账号密码早晚会被坏人窃取。在这种情况下怎么防止坏人用你的账号密码登录你的网银呢?
大家比较熟悉的“U盾”就是一种解决办法。这个设备是独立于电脑而存在的。要在电脑上操作网银,把你账户里的钱转给别人,就需要把这个设备连在电脑上。坏人没有你的“U盾”,所以即使拿到了你的账户密码,也动不了你的钱。在这里,你的密码是一个验证因子,U盾是另一个验证因子。需要密码+U盾才能验证身份登录网银转账,这就是双因子验证。
双因子验证这个思路其实很古老,比计算机技术古老得多。有些银行金库的门需要由两个人分别保管的两把钥匙一起操作才能开启,这就是双因子验证。美军如果要发射民兵核导弹,不但需要两个操作员各自用确认钥匙开一把锁才能验证发射代码的正确性,还需要两人把两把发射钥匙插进两个发射孔同时转动,两个孔还设计得距离遥远以防一个人同时转两把钥匙,这就是它的高级版本。
U盾这种解决办法是相对比较安全的。但网络安全领域有这么一个“不可能三角”:“安全-方便-廉价“这三者无法同时达成。U盾方案的成本不高,安全性也不错,但不够方便。因为如果要随时使用网银,就要随时携带U盾。于是一些对安全性要求没有那么高的场合,人们广泛使用了另一种验证因子:手机短信验证码。手机总是要随身带的,所以这种方法比用U盾要方便得多。
手机相对于电脑,是一个独立设备。短信验证码相对于用户口令,也是独立的。如果我们假设攻击者即使掌握了很多用户个人数据,能入侵用户电脑,也仍无法获取手机短信,那么用手机短信作为一个独立验证因子也是可靠的。但是因为网络环境的变化,短信验证这种方式正在面临着问题。
在非智能手机时代,要入侵手机窃取短信是比较困难的——不是不可能,但比较困难。但随着智能手机的普及,入侵手机窃取短信已经变得比较容易。比如,很多APP都有读取短信的权限。只要这些APP中的任意一个存在漏洞,或者干脆本身就是恶意的,那你的短信也就危险了。
另外,对于用电脑访问的业务来说,短信验证码是相对独立的一个因子。但对在手机上访问的业务来说,短信验证码就没那么独立了。
电脑沦陷后,短信可能还是安全的。但手机沦陷后,短信也很可能也会被攻击者拿到。短信验证的漏洞而甚至不入侵手机也可以窃取到短信。前几年,有些运营商推出了“短信保管箱”业务,用户可以用电脑在运营商网站上在线读取短信——也就是说,如果你的电脑被入侵了,短信也就保不住了,不再是一个独立可信的因子。所以一些网络犯罪者就开始利用这一点。最终“短信保管箱”业务被取消了。
现在运营商虽然不在网站上保存短信了,但有些手机有自动把短信备份到云端的功能。如果开启了这个功能,那么攻击者只要掌握了你的云端账号,就可以访问到短信。这时候,短信也不再是一个独立可信的因子了。那么如果手机上不开启任何会把短信保存到云端的功能,也能保证手机不被入侵,是不是短信就不会被窃取了呢?即使你今天仍在使用诺基亚黑白屏手机,短信还是可能被窃取。因为短信所用的无线信道并不那么可靠。
虽然目前国内3G/4G已经普及,但大部分地区只是上网走3G/4G,短信还是通过不安全的GSM网络在发送,而GSM是非常容易被监听的。
在十几年前,如果要通过监听无线信号窃取短信,所用设备至少价值几十万元。但在今天,数千元就能买到同样功能的设备。如果要求不高并且愿意自己动手,花上不到一百元也能做出勉强可用的设备。我2013年做过一个相关主题的演讲,其中谈到了这类设备成本下降对安全的威胁。下面这张图就是当时通过监听无线信号获取到的一条运营商流量提醒短信:作者通过监听无线信号获取的短信。
有人说晚上睡觉前把手机关机就能防止通过无线监听窃取短信。这话只对了一半。你们想一下:给别人发短信的时候,如果对方手机关机了,短信是不是仍然可以发的出去?所以,睡觉前把手机关机也许可以防止攻击者到你的附近窃取短信,但无法阻止攻击者在短信发送者附近窃取短信。比如攻击者要窃取A公司给你发的验证码,只需要在A公司发短信的设备附近监听无线信号即可。
而对攻击者来说,在A公司发短信的设备附近进行监听显然是更划算的做法。因为只要在这一个地方,就能实现窃取所有A公司发出的验证码。
靠短信实现双因子验证,总还是比完全没有双因子要强的。但因为存在上面这些问题,所以在今天,短信验证码也许仍然可以作为一个验证因子,但各公司在设计业务安全体系的时候,对它的信任度需要调低一些。至少需要结合地理位置信息、设备信息、用户特征等等来综合判断。而不能像很多年前一样,仅凭一个短信验证码就确定用户身份。
用户也不是毫无办法,可以尝试开通VoLTE功能,让短信也通过3G/4G网络传输,增加通过无线监听窃取短信的难度。具体方法是:有办法防备短信验证码的漏洞吗?但目前不一定所有运营商在所有城市都支持了VoLTE。如果对安全比较重视,建议单独准备一台手机,这台手机禁用WiFi,禁用移动网络,仅用于打电话发短信。所有重要的验证码都只用这台手机来接收。至于“睡觉前关机”,也许有那么一点用。
但手机毕竟是个联络工具,万一家人夜里有急事找你呢?
电信用户发送“KTVoLTE”到10001,移动用户发送“KTVoLTE”到10086,联通用户发送“VBNCDGFBDE”到10010。至于运营商,为阻止通过无线监听窃取短信的攻击,应加快2G网络的淘汰,尽早让短信业务默认都使用VoLTE。手机厂商也应向用户提供关闭2G支持的选项。
否则,即使运营商默认用了VoLTE,攻击者还是可能有办法让用户的通信降级到GSM。而各公司自建的用来发送短信的“猫池”,也应升级为使用VoLTE来发送。