phishing-1今天,在微博上看了一篇《微信和淘宝到底是谁封谁》的文章,我觉得文章中逻辑错乱,所以,我发了一篇关于这篇文章逻辑问题的长微博。后面,我被原博主冷嘲热讽了一番,说是什么鸡汤啊,什么我与某某之流的人在一起混淆视听啊,等等。并且也有一些网友找我讨论一下相关的钓鱼式攻击的技术问题。所以,我想写下这篇纯技术文章,因为我对那些商业利益上的东西不关心,所以,只谈技术,这样最简单。

首先说明一下,我个人不是一个安全专家,也不是一个移动开发专家,按道理来说,这篇文章不应该我来写,但是我就试一试,请原谅我的无知,也期待抛砖引玉了,希望安全的同学斧正

关于钓鱼式攻击,其实是通过一种社会工程学的方式来愚弄用户的攻击式,攻击者通常会模仿一个用户信任的网站来偷取用户的机密信息,比如用户密码或是信用卡。一般来说,攻击者会通过邮件和实时通信工具完成,给被攻击者发送一个高仿的网站,然后让用户看不出来与正统网站的差别,然后收集用户的机密数据。

移动端钓鱼攻击点分析

因为钓鱼式攻击并不新鲜,所以我这里只讲移动方面的。

在移动端,这个事情会更容易干,因为移动端有如下特点:

  • 移动端的UI只能有一个应用占据整个屏幕,你只能看到一个应用,而且用户屏幕小,能显示的信息有限,比如浏览器里的网址是显示不全的。这会给钓鱼攻击有很多可乘之机。
  • 移动端的平台有其安全的设计。每个应用都是隔离开的,一个应用无法获取另一个应用的数据。而且应用的下载基本上来说都是来自合法的地方。比如iOS的设备通过App Store下载,每个程序都有自己的签名保证不会被篡改。而且移动端的的应用有各种权限配置,这样也能很大程度提高安全性。
  • 移动端的APP有些有些是收费的,所以自然会有盗版需求,虽然在平台上做了一些安全设计,但是并不完美。用户可以越狱,可以root。这给恶意软件有了可乘之机。

下面我们来分析下移动端的用户操作,我们重点关注用户控制权的切换过程(因为这是攻击点)

在移动设备上,基本上来说,用户的控制切换有四种:

  • 从一个APP切到另一个APP,也就是我们所谓的唤出APP。
  • 从一个APP唤出一个Web,常见为一个嵌入式的WebView或是一个浏览器
  • 从一个Web唤出一个APP,这需要浏览器支持一些非标准的HTTP协议,比如skype://之类的。
  • 从一个Web到另一个Web,这和Web上的方式差不多。

基本上来说,黑客的攻击从来都是找这样的转换环节来做文章的,并且需要一个用户非常熟悉的场景(这样用户才会放松警惕)

通过观察移动APP的特性,我们可以知道,当用户控制切换时,有下面的这些特性:

  • 到另一个APP时,需要用户登录(如果登录的session过期了)
  • 当支付的时候,需要用户输入支付信息(信用卡信息、支持密码)

那么用户在移动APP上经常做的事是什么?

  • 社交分享:分享到微博,分享到微信等等,分享的时候,可能需要你输入用户名和口令。
  • 应用内购:一般来说APP会有两种,一种免费的,一种是收费的,大量的用户都是下载免费的,然后通过什么“开通更多关卡”、“去广告”、“买道具”之类的东西,让用户输入支付信息。Apple的支付的时候也会要用户输入Apple ID的密码。
  • 点击链接:有时候,我们收到短信,或是二维码,或是一个微信微博,会让我们去点击一个网站链接,这个网站链接要么就是打开一个网页,要么就是启动应用,要么就是跳转到应用市场去下载应用(如果你没安装)。

所以,一个好的钓鱼式攻击一定会从这些地方入手,然后高仿UI以及交互流程,这个交互流程和用户日常操作的完全一样,让用户无法察觉。任何方式的钓鱼攻击简单来说,会有两种:

  • 一种是直接攻击:你下载了一个恶意的APP,或是打开了一个恶意的冒牌APP。
  • 一种是中间人攻击:用户控制权转换时的两端都是正规应用,但是中间的过程不是正常的。

攻击方式

下面是一些常见的攻击方式:

从一个应用唤起另一个应用的方式

直接攻击

当你点击一个社交分享按钮,或是一个支付按钮的时候。就会转到一个页面,这个页面需要你输入用户机密信息(密码或是支付信息),然后再唤起真正的APP。

一个有恶意的APP可能会让你放松警惕,因为,这个你在安装这个APP的时候,你会发现这个APP根本不需要任何的权限(Android上的),甚至连网络访问的权限都不要,因为在Android下,App可以通过别的组件访问互联网,比如:恶意应用可能创建一个MediaPlayer Object,然后就可以通过这个对象访问一个URL然后把偷到的信息发送出去。

你的手机要被安装一个恶意的应用并不难,同样通过社工的方式,比如:盗版,色情,伪装成客服等等通过人性的弱点让你去一些非受信的市场上安装。iOS设备上的应用也可以不用通过App Store安装(通过itms-services协议,可以通过safari浏览器直接在IOS设备上安装应用程序)。

还有,人们都是贪小便宜的人,所以,会到某些地方买一些便宜的手机(比如淘宝),现在的高仿手机,翻新的二手手机对于一般人甚至安全专家来说完全没有识别能力。这些手机中有很大可能藏有恶意程序。你千万不要以为你格式化手机就OK了。今天(2015年4月14日)早上CCTV2台的“第一时间”就说了一个案例,你可以看看。另外,你可以看看相关的新闻。(另外,你把你的旧手机卖了也要小心,因为你的数据就在里面,旧手机已经成了一个灰色产业链)

另外,Apple的App需要有一个review过程,这个过程对大众是神秘的,但我觉得应该会包括安全方面的review。不过,这个审核过程可能也有空子可以钻。比如:在review的时候,这个应用完全正常,但在用户使用的时候,会自己从网站下载一些自己的配置文件而改变行为(更为直接的就是访问外部网页时在审核时和在用户应用时可能完全不一样,Apple应该完全没有能力审核应用要访问的外部站点)

中间人攻击

我们知道,一个APP唤起另一个APP好多都是用url-scheme的,也就是某种协议,审核这样的协议非常简单,所以如果有恶意的东西在里面基本上很容易看到。但是,如果某些APP并没有注册自己的url-scheme,或是没有被安装,反而,另一个有恶意的APP注册了这个scheme,那么,就会导致恶意的APP被唤起来了(这就是我为什么在我的微博中说,如果用户没有安装淘宝的客户端,那么,让微信唤起淘宝的客户端时,有可能是另一个有恶意的APP。但是很多人不懂这个事。在iOS下,两个APP通讯正确的做法是“钥匙串机制”)。

当然如果有两个应用被注册了同一个scheme,那么,iOS和Android会给出一个选择,让用户来选(注:iOS的系统有可能会直接跳某个 App 上去,不同版本的跳规则不明确,可以认为是随机跳转)。于是乎,恶意的APP就要努力的让自己比正规的APP看起来更像个正规的APP就可以了。

在Android平台上,这个事可能更变态,只要恶意的应用有两个权限,一个是随手机操作系统在后台启动,一个是task list(然而这两个权限都是一般权限)。这样一来,当你进行两个APP切换时,恶意程序可以通过task list权限监控到,然后自己马上先于正规的app出现,等到收集完用户数据后简单的退出就好了。这个方式只需要你的程序能在10ms以内反应过来(最佳是5ms左右),人的肉眼根本看不出来。(在iOS设备下,除了jail break后的iPhone可以这么干,正常的都iPhone还没有找到这样的攻击方式)

在一个应用内内嵌Web的方式

这种方式更容易攻击了,现在很多很多应用都是内嵌的Web的形式,你完全不知道打开的网页的网站是什么,因为这些内嵌的WebView你连地址都看不见。而且无论是iOS或Android,其WebView都可以执行任何的Javascript代码,就算显示URL,URL也可能是被混乱过的,你也看不全,你也很容易上当。当然,那些使用带SSL证书的支持HTTPS的网站(尤其是EV证书)可以在地址栏上显示一个绿色的标记表示你访问的就是正确网址,但是并不是所有的浏览器都会这样,比如iPhone的Safari并没有这个提示,所以,你一定要用Chrome。

更狠的是就算你打开的是一个正确的URL,你依然可能被中间人攻击。尤其是这个网站使用了明文的HTTP协议,而你又喜欢蹭那些免费的WiFi,于是很容易给把服务器返回给你的网页中做修改,比如,修改网页中login表单或是支付表单提交的网站(想想天朝的网络运营商给你访问的正常的网页弹广告这事吧)

关于DNS劫持,有些人觉得这事可能遇不上,因为这是一个全网的问题,如果你有这样的想法你就错了。还是那样,你爱占便宜,蹭上那些没有密码的WiFi,你完不知道,你连上去的那个WiFi会设置什么样的DNS服务器,你输入了www.taobao.com,但你打开的网站根本就是不是淘定,而是一个钓鱼网站。你会知道你打开的是错的了么?基本不可能。所以,安全点的网站都是要用HTTPS,但是还是那句话,iPhone的Safari并不会提示你打开网站的SSL证书合不合法(事实上,在手机上的很多浏览器都不会这提示,只有Chrome会)。

关于攻击的方式我不想讲太多,还有很多高级+猥琐的方式我也不是完全知道,知道了我也不说,不然,教人犯罪了。

关于从Web端唤起APP是和,APP唤醒APP的攻击方式基本一样。我就不说了。

怎么防范钓鱼式攻击

首先,我们要知道,钓鱼式攻击是一件非常难搞的事。要搞定这个事,一般来说需要四个方面:立法层面用户培训层面宣传层面、与技术保全措施层面

教育方面

打击网钓的策略之一,是试着培养人们识别网钓,并教导怎样处理这些问题。只需要稍稍修改人们浏览习惯的方式,很多问题都可以避免。随着人们越来越认识到网钓者所使用的社会工程学技俩,传统的网钓欺诈技术可能在未来过时。

  • 对别人发来的链接要小心,尤其是让你输入机密信息的链接要小心检查。
  • 到正规的地方买手机,不要贪图小便宜。旧手机在卖前要“物理删除”数据。
  • 不要对手机越狱,不要root。
  • 不要从非信任的地方下载软件。
  • 要小心免费的WiFi。
  • 输入机密数据的时候一定要小心检查。
  • 多依赖一些不同的安全体系,比如:网上支付不要只依赖支付宝,尽量使用信用卡(信用卡千万不要设密码),这样就算是被钓鱼了,你还有一个银行安全的缓冲地带——可以不承认交易。
  • 现在使用手机的频率越来越高,所以,我非常建议你使用更为安全的iPhone手机,一定要打开“查找我的iPhone”功能,然后设上开机密码。iPhone手机可以做到手机丢失了别人都无法使用,包括刷机都刷不了(iOS7以上版本)
  • 对于一些关键网站,开启两步验证,这样就算你的用户名和密码被钓走了,还有一个动态手机口令做为登录的关卡。

技术方面

  • 利用SSL证书来保证从浏览器到网站的访问是现在采用比较多的方式,也是在理论上可行的方式。现代的浏览器都会在URL上放上一个锁的标志,对于EV证书,你会看到浏览器的URL是绿色的(很容易分辨)
  • 另外,像firefox浏览器有一个petname的插件,你可以为你常上的网站设置一些标签。这样,当你打开钓鱼网站的时候,你会发现这些标签没有显示出来,那就有问题了。
  • 关于SSL的CA认证机构,你需要管理好你浏览的那些根证书,有些根证书你需要删掉。
  • 增加式登录方式。这种方式被美国银行采用,就是说,你可以上传一个你自己知道的图片,而当你打开登录页面里时,输入了自己的用户名后,你会看到你设置的这个图片被显示出来。如果没有或是显示错了,表示你打开的是钓鱼网站。
  • 两步验证,通过用户自设密码+手机动态口令登录(好些网站都在使用Google Authenticator的方式,这有点像公司VPN的动态口令)。

上述都是PC Web上的防范,然而我们的手机移动端做的并不够好,移动端的安全还是要加油。

安全风控方面

什么叫安全风控,说白了就是拿钱出来赔偿给被骗的用户,大家相信我,这个事情在基本上所有的公司都会做的,也就是说,无论你怎么做安全也无法保证绝对的安全,你只能缓解或是降低用户被骗的数量或概率。所以,几乎所有的公司都会有一笔钱专门用来赔偿。

在西方国家,用户体验很好,我说一个故事,我有一个妹妹在英国,有一天她到ATM上取钱,取完钱后忘了把卡取出,结果后面的人把她的卡里的钱取走了,于是她报了警,等警察做完笔录后,她给银行的客服打了个电话说明了情况,本想冻结银行卡的,但是银行方面二话不说就赔偿了她所有的损失。为什么英国的巴克莱银行这么痛快,是因为他们有风控基金,专门用来处理这样的事的。

在中国,其实银行和一些大的公司都有这笔安全风控基金,但是,要你非常坚持不懈地申诉,他们才会赔给你,而且还不是全部。要全部的话,我估计你要做一个“刁民”,否则欺负你,没道理。

关于微信和淘宝

微信和淘宝到底是谁先屏蔽谁我并不关心,这里面的商业利益我也不关心,微信是不是支持卖东西我也不关心。我关心的是寒冬文章中所说的微信上有淘宝钓鱼的安全问题。

从技术上来说,我觉得要微信和淘宝一起干这事,单方都不行,需要两边的安全专家一起讨论(如果需要,我可以帮你们约)。我这里给一个可能很不成熟的方案,算是抛砖引玉(我不考虑你们之间的商业竞争,我只从用户的角度出发,客户第一):

我觉得,从业务上来说,淘宝可以在微信上有一个官方的商城。而淘宝的商家,需要取得微信的认证后入住,才能分享相关的商品或店家链接,对此,商家入住,我觉得可通过微信的服务账号与淘宝的商家后台集成可以做到。

然后,商家也好,买家也好,他们分享商品只能通过微信官方的商城或是商家的服务账号分享出去,而分享出去的商品信息可以是一个比较unique的形式(比如有一个不能伪造的官方认证的标签),而用户的支付可以通过内置的微信支付也可以通过内置的支付宝(通过唤起App并不是一个好的方式,还是应该你们在服务端进行相互的通信)。

然后微信和淘宝双方通过宣传手段告诉全社会,微信里的商品什么才是正规的,才不是钓鱼的,并给教育用户更为安全地使用手机。

P.S. 我虽然这么说,但从我个人来说,我非常理解微信为了让用户有很好的体验而不让微信成为一个四处都是营销商品的地方。所以,我从个人来说,希望微信不要成为一个商家的营销地。另外,我也知道阿里对移动端的看重,所以,上述的方案虽然对用户体验和安全都比较好,但是从目前商业利益的情况看来基本无法实现。不过我这里也只是抛砖引玉了。

面对安全和用户这两个事,你们两个中国最大的互联网公司,应该带头做好榜样,你们都是不缺钱的公司,应该更多的承担起社会的责任,真正为用户做点什么,而不是整天想着流量入口,互相屏蔽,互相指责,想着自己能有多少用户,这TMD太LOW了,和你们的地位完全不符。所以,从站在用户的角度上来说,我希望微信和淘宝都能站在用户的角度上思考问题,一起合作来真正的为用户更好的服务。