睡一觉就一无所有了,手机验证码是怎么泄露的?

标签: | 发表时间:2018-08-05 07:47 | 作者:
出处:https://mp.weixin.qq.com

豆瓣上那个关于多个账号被盗刷的帖《这下一无所有了》最近比较火。



受害者的手机在半夜连续接到了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网络传输,增加通过无线监听窃取短信的难度。具体方法是:


电信用户发送“KTVoLTE”到10001,

移动用户发送“KTVoLTE”到10086,

联通用户发送“VBNCDGFBDE”到10010。



但目前不一定所有运营商在所有城市都支持了VoLTE。如果对安全比较重视,建议 单独准备一台手机,这台手机禁用WiFi,禁用移动网络,仅用于打电话发短信。所有重要的验证码都只用这台手机来接收。至于“睡觉前关机”,也许有那么一点用。但手机毕竟是个联络工具,万一家人夜里有急事找你呢?


 

至于运营商,为阻止通过无线监听窃取短信的攻击, 应加快2G网络的淘汰,尽早让短信业务默认都使用VoLTE。手机厂商也应向用户提供关闭2G支持的选项。否则,即使运营商默认用了VoLTE,攻击者还是可能有办法让用户的通信降级到GSM。而各公司自建的用来发送短信的“猫池”,也应升级为使用VoLTE来发送。

 

作者:tombkeeper


相关 [一无所有 手机 验证码] 推荐:

睡一觉就一无所有了,手机验证码是怎么泄露的?

- -
豆瓣上那个关于多个账号被盗刷的帖《这下一无所有了》最近比较火. 受害者的手机在半夜连续接到了100多条验证码,醒来发现自己 支付宝等账号被盗,损失很重. 仅从这些描述,其实还不足以断定攻击者采用了怎样的方式. 有些人猜测这是通过无线监听窃取了验证码短信,还有人说睡觉前关机就可以防止被无线监听. 不幸的是,安全问题从来都是比较复杂的.

java 验证码

- - ITeye博客
// 创建字体,字体的大小应该根据图片的高度来定. // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到. // randomCode用于保存随机产生的验证码,以便用户登录后进行验证. // 随机产生codeCount数字的验证码. // 得到随机产生的验证码数字. // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同.

拥有一切与一无所有

- hikerlive - 谢文的blog
周有机会与几个朋友一道与美国《连线》杂志的创办人Kevin Kelly聊了一个下午. KK(圈内人昵称)以其对互联网发展的方向和趋势的预测准确闻名于世,也以其诸多讨论科技进步与社会的关系的超前论断引发不断的讨论与争议. 发了一篇关于与KK对话的博客后,不少业内朋友说有点意思. 那我就再就其中一个观点在多说几句.

验证码新趋势:NuCaptcha推出动态验证码

- Mac.Baby - 36氪
曾开发过提供视频验证码服务的加拿大创业公司NuCaptcha刚刚发布了动态验证码,可为网站提供新的安全保证,有望为验证码市场带来新气象. 验证码是人们在网站上最常见的安全问题,只要是上网的人都会遇到被要求辨认和输入数字或者单词的情况. 网站通过验证码来区分人和恶意程序. 而我们所见的大部分的验证码都是基于文字的.

10种用户友好的验证码

- Liang - cnBeta.COM
众所周知,验证码就是帮助我们确定答案不是由电脑自己生成的. 今天我推荐给大家10种用户体验绝佳、令人意想不到的验证码设计风格.

使用 PIL 生成验证码图片

- HarryHan - python.cn(jobs, news)
现在的网页中,为了防止机器人提交表单,图片验证码是很常见的应对手段之一. 这里就不详细介绍了,相信大家都遇到过. 现在就给出用Python的PIL库实现验证码图片的代码. _letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z. _upper_cases = _letter_cases.upper() # 大写字母.

response生成图片验证码

- - ITeye博客
服务器对客户端浏览器做出的响应被封装成一个HttpResponse对象. 要对浏览器进行操作,只需要操作HttpRespones对象,通过HttpServletResponse.getWriter()获得PrintWriter,该对象为outputStream的子类.     本例将使用Servlet输出图片验证码.

验证码的现在与未来

- Yishen - 爱范儿 · Beats of Bits
”验证码“( CAPTCHA )其实并不是各位网友总是在不同网站上看到的难以辨认的字母组合的代名词,而是“全自动区分计算机和人类的图灵测试”的俗称,顾名思义,它的作用是区分计算机和人类. 在 CAPTCHA 测试中,作为服务器的计算机会自动生成一个问题由用户来解答. 这个问题可以由计算机生成并评判,但是必须只有人类才能解答.

jsp+servlet实现验证码功能

- - CSDN博客推荐文章
验证码的功能大多数人可能不都理解,但几乎每个安全网站都会有. 验证码是用来防止非人为因素操作的行为,例如一个黑客要黑一个网站,怎么弄呢. 最简单的思路当然是造成其网路拥堵直至系统瘫痪掉. 如果没有验证码,那么我就可以在注册页面,写一个程序,只有注册表单,不断更换主键或不可重复的内容,不停的提交. 那这样每秒可以注册几万次都有可能,这样服务器就大量负载,很容易就瘫痪并死掉.

Servlet实现图形验证码

- - CSDN博客推荐文章
|-- 配置开发图形验证码Servlet. // 设置响应头 Content-type类型. // 以下三句是用于设置页面不缓存. // 建立指定宽、高和BufferedImage对象. Graphics g = image.getGraphics(); // 该画笔画在image上. Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场.