[转]支付宝的设计问题

GaRY | 2013-01-06 17:14

在reader里看到这一系列文章,作者用亲身经历对支付宝的移动支付体系做了次验证.很有意思的文章,发到zone里大家讨论讨论.

原文:第一篇  第二篇 第三篇

---------------------------------------------------------------

支付宝的一项设计问题

发表于 2012 年 12 月 30 日

话说最近,贝壳成批更新了一些密码。在更新到网络支付系统的时候,心血来潮做了个分析。感觉网银系统很不安全。尤其是支付宝的手机客户端。我们下面以一个实际例子说明一下支付宝系统(其实远不止支付宝)的问题。

情况说明

贝壳的支付宝系统做了手机和淘宝帐号绑定,开启了手机动态口令,无线支付,和手机宝令三项功能。由于可以从淘宝或者支付宝登录,因此设定了70bit以上的高强度密码,1年更换一次。支付密码强度略弱,是30bit级别的,一年更换一次。支付宝账户安全等级高。使用支付宝的系统包括两台电脑和一台手机,一台是linux,一台是受限windows,只安装特定软件,不浏览和安装风险网页。总体来说,这个安全结构在支付宝用户中都是有数的。

风险在于支付宝手机客户端上,贝壳在评估的时候发现,支付宝手机客户端可以记录密码。这是一个非常具有风险的事情。因此贝壳模拟评估了一下,假如你丢失了手机,会发生什么事情。

低于200的支付

首先,由于支付宝客户端保存了密码,因此你可以很容易的登录支付宝。上面有绑定快捷支付的话(这是贝壳的常态,相信也有很多人有绑定,或者账户内有余额),在200以下就可以直接支付给对方,不需要任何额外验证。贝壳绑定的浦发银行发出了提款警告,但是很可惜,由于手机在恶意者手上,这一行为没有任何用处。

当然,常识告诉我们,如果你丢了个手机只损失200,这个问题可以忽略不计。

超过200的支付

如果超过200,则需要支付密码和手机验证码。在这个例子中,手机验证码是没有用处了,主要的保护就在支付密码上。然而,支付宝客户端具有找回支付密码的功能。幸好,他是基于身份证的。贝壳的身份证不是每个人都知道,因此在超过200的时候是安全的。

是否还有可能,从支付宝中恢复原始密码呢?因为有原始密码,就可以用网页访问支付宝,使用手机来恢复支付密码。关于这点,直到撰文为止,贝壳没有确认。

然而,问题其实远比这个简单。在没有支付宝密码的情况下。你可以申请忘记密码。然后支付宝会要求你输入你的账号来恢复密码。帐号?我记得在支付宝客户端上有记录。。。果然,输入帐号后,贝壳收到了支付宝的验证码。输入验证码后,贝壳重设了支付宝密码。在这一过程中,贝壳绑定的邮箱收到了警告——不过依然很可惜,唯一能够即时提示的手机现在在恶意者手中,主人一无所觉。

然后就是很没有新意的重设支付密码过程,借助手里的手机,我们完整的得到了整个支付宝的所有权,并且可以提光绑定了快捷支付的整张信用卡。在这里的唯一阻碍就是信用卡开卡行的支付限额。超过限额后需要使用密码和手机验证码来解除(浦发),手机验证码可以无视,密码是未知的。

结论

粗算了一下,丢一台手机,在一个小时内没有察觉,大约会造成4000元-4500元的损失,这还没有算手机。如果发卡行没有设定限额,最高大约是10W元。

我们来细数一下,整个过程里面的问题。

手机客户端不应当保存用户名密码,尤其是涉及资金的问题

对于频繁登录的问题,可以允许客户绑定一个手机token来解决。token等效于密码,但是不能做所有涉密操作,不能修改安全性,找回密码等。客户需要可以通过安全手段查看当前有多少个手机绑定了token,并且可以删除。贝壳之所以认为支付宝的系统有弱点,就是因为找遍整个支付宝系统,找不到删除token的地方。不能删除的token等于没用。

丢失密码的找回需要更加慎重

单纯的手机找回密码是有风险的,当然,单纯的邮箱找回也有。一种方法是同时验证手机和邮箱可以立刻找回密码,否则需要等待一定时间(例如几个小时,等待主人发现手机丢失)。

但是这仍然有风险。一般android里都会绑定邮件接收吧,借助这个很容易收到邮件。设计一个安全的密码找回方案并不是那么容易的,看来只有多等几个小时的方案略安全一些了。

同时这里也提醒一下。如果你在银行挂失银行卡找回密码的时候,觉得业务很方便。贝壳建议你立刻更换银行。在找回密码时越麻烦的银行,才是越安全的。

基于手机的核心验证体系

这是关键中的关键。我们可能会设计一个安全机制,里面有一步两步三步,必须全部通过才能操作资金。然而实际使用中,如果这三步都是依赖于同一个设备,那就对安全性没有任何提升——没有人敢保证手机不会丢失吧。钱包丢失最多损失几百,手机丢失呢?

目前,整个网银系统(不止是支付宝)都越来越多的依赖于手机。在手机越来越智能的今天,其可靠性实际上正在变差。手机可能丢失,也可能被安装恶意软件(尤其是root/越狱过的手机)。我们可以列出当手机丢失,或者安装了高权限的恶意软件时,会发生的安全问题。

1.个人信息泄密,包括朋友通讯方式,备忘,生日,身份证号码,家庭地址等。其中有些就涉及安全。

2.支付宝密码和支付密码可以重设(即,泄露)。

3.宝令丢失。

4.网银验证码无意义。

5.支付宝警告无意义。

6.网银警告无意义。

实际上,这不是支付宝的问题,而是用户在选择和设计自己的安全系统时,无意中造成的问题。

解决方案

暂时还没有太好的方案。

1.首先期待支付宝将手机登录改为token,取消密码保存,隐藏用户名,用户可以删除token,以解决直观的威胁。

2.期待手机丢失时快速发现的应用/功能。如果能在5-10分钟内停机,可以有效的解决手机丢失造成的风险。(贝壳向中国移动确认了,当手机停机后,是不能收取短信的)

3.当确实发生手机丢失时,应当首先立刻停机(因为停机速度快),然后向银行挂失(凡是绑定了手机的银行都要),然后以最快速度修改所有密码。

4.涉及资金的系统要多考虑一下,设计安全结构的时候要注意,如果有多于一个的方法进入系统,安全性决定于最弱的那个系统。如果所有步骤的安全性都依赖于手机,那么要考虑,丢了手机的时候会发生什么。

---------------------------------------------------------------

移动的一点漏洞

发表于 2012 年 12 月 30 日

今天支付宝的那个问题,支付宝的人和我说。

猜到就是手机保存账户名可以找回密码的问题。。对于快捷用户明年会要求手机+证件找回密码,减低200以上的资损风险。所以现在我客户端使用后都删除用户名纪录,为了安全。那个token的想法挺好的!

我就考虑,是否可以通过手机获得身份证呢?

首先,利用手里的手机,得到自己的手机号。然后查询所在地,在对应的移动网站上(例如上海移动)找回密码,然后登录移动网站。进入个人信息管理,需要手机验证码。输入验证码,可以看到部分身份证。包括头4位和尾4位。普通身份证是18位的,分组方式6+8+4。隐藏掉的10位中有8位是生日,一般手机里都能找到,并不困难。

因此,实际需要得到的就是2位。而这两位又不是任意的,和个人出生地有关。具体到我的身份证上,有了前四位后,两位只有17种可能。我看了其他一些人的情况,运气差的情况下,这两位只有一两种可能,例如1405,山西省晋城市,只有00/01/02。全试一遍就可以了。

更新:同事反应,联通的网站更二,直接就显示了完整身份证。。。

更新2:同样漏洞,在招商银行的手机应用上也爆了出来。。。

---------------------------------------------------------------

支付宝体系的问题

发表于 2012 年 12 月 31 日

今天和几位朋友讨论了一下支付宝的问题,又查了一下case,发现支付宝的问题不仅是那么简单而已。先不吐槽支付宝的问题了,赶快出验证和方案。

在被人恶意补卡的情况下是否安全

关于恶意补卡,这里有个例子。简单来说,就是知道你的身份证和手机号,去异地营业厅用假身份证补手机卡。然后用手机卡获得支付宝系统,再套现。

贝壳分析了自己的系统,如果恶意补卡的话,对于200以上的消费转账,会要求输入宝令。宝令是绑定在手机而非卡上的,所以攻击者会无法消费。而要取消宝令就必须输入宝令,通过手机卡无法取消。因此攻击者即使补贝壳的卡,也无法进行200以上的消费。

但是如果你用的是U盾,那问题就没那么简单。在支付宝的设计中,手机是可以解除U盾绑定的。所以U盾不能对抗恶意补卡。

结论:如果仅仅是200而已,我可以认为这个系统是安全的。

在手机丢失的情况下是否安全

如果手机丢失,问题就更加严重。支付宝密码,支付密码均会被找回,宝令本身就在手机里,因此支付宝的支付系统全面沦陷。支付宝内资金肯定不保。问题是卡上资金。

贝壳绑定了两张卡,浦发和招商,先从快捷支付检查起。检查浦发的卡发现,对支付宝默认开了20000的签约支付额度,当场汗就下来。对于快捷支付来说,这太高了。速度改成300。对于超过300的,依然可以通过网银验证来支付,比较安全。

招行的快捷支付我从头到脚就没看到签约这回事,貌似必须进行网银支付。那就需要我的卡号有效期密码什么的。我觉得这个不大可能出问题。

再检查浦发的普通支付,这需要登录浦发的网上银行。浦发网银是通过手机加密码验证的,基本可以保证转账汇款的安全。

结论:目前调整的结果,一次损失300左右。

网银的一点隐忧

目前网银的密码都太弱了。浦发只有6位数字,招行也只有8位数字字母。难道就不能设定强一些的密码么?

浦发可能是要和卡本身的密码兼容,将手机作为补强。可是手机也会掉啊。一旦手机掉了,整个安全性就由6位数字密码保护。这和掉银行卡一样严重。

建议

1.移动和联通关闭身份证显示,尤其是最后四位!

2.无论哪种级别,使用支付宝一定要打开宝令。目前只有宝令可以有效对抗补卡攻击。

3.在智能机上又绑定网银的,就不要乱装软件,更不要root/越狱。

4.中国移动的补卡修改流程。如果当前卡处于激活中,先持续警告旧卡24小时后再激活新卡。

5.移动至少应当允许客户自行选择“这个手机号码极端重要,不得实行异地补卡,不得显示个人信息,复机/补卡间隔需要在24小时以上”的增强选项。

6.理论上说,移动应当可以推进二代身份证验证能力。使得补卡业务实行时,必须凭借二代身份证验证身份后进行。杜绝假身份证。

7.支付宝的密码找回功能降速。从开始找回,发短信和邮件通知,到完成找回密码至少要一小时,最好要24小时才能找回密码。或者允许可以设定“我自愿将找回密码时限改为24小时”以增强安全性。