支付宝的一项设计问题
话说最近,贝壳成批更新了一些密码。在更新到网络支付系统的时候,心血来潮做了个分析。感觉网银系统很不安全。尤其是支付宝的手机客户端。我们下面以一个实际例子说明一下支付宝系统(其实远不止支付宝)的问题。
情况说明
贝壳的支付宝系统做了手机和淘宝帐号绑定,开启了手机动态口令,无线支付,和手机宝令三项功能。由于可以从淘宝或者支付宝登录,因此设定了70bit以上的高强度密码,1年更换一次。支付密码强度略弱,是30bit级别的,一年更换一次。支付宝账户安全等级高。使用支付宝的系统包括两台电脑和一台手机,一台是linux,一台是受限windows,只安装特定软件,不浏览和安装风险网页。总体来说,这个安全结构在支付宝用户中都是有数的。 风险在于支付宝手机客户端上,贝壳在评估的时候发现,支付宝手机客户端可以记录密码。这是一个非常具有风险的事情。因此贝壳模拟评估了一下,假如你丢失了手机,会发生什么事情。
低于200的支付
首先,由于支付宝客户端保存了密码,因此你可以很容易的登录支付宝。上面有绑定快捷支付的话(这是贝壳的常态,相信也有很多人有绑定,或者账户内有余额),在200以下就可以直接支付给对方,不需要任何额外验证。贝壳绑定的浦发银行发出了提款警告,但是很可惜,由于手机在恶意者手上,这一行为没有任何用处。 当然,常识告诉我们,如果你丢了个手机只损失200,这个问题可以忽略不计。
超过200的支付
如果超过200,则需要支付密码和手机验证码。在这个例子中,手机验证码是没有用处了,主要的保护就在支付密码上。然而,支付宝客户端具有找回支付密码的功能。幸好,他是基于身份证的。贝壳的身份证不是每个人都知道,因此在超过200的时候是安全的。 是否还有可能,从支付宝中恢复原始密码呢?因为有原始密码,就可以用网页访问支付宝,使用手机来恢复支付密码。关于这点,直到撰文为止,贝壳没有确认。 然而,问题其实远比这个简单。在没有支付宝密码的情况下。你可以申请忘记密码。然后支付宝会要求你输入你的账号来恢复密码。帐号?我记得在支付宝客户端上有记录。。。果然,输入帐号后,贝壳收到了支付宝的验证码。输入验证码后,贝壳重设了支付宝密码。在这一过程中,贝壳绑定的邮箱收到了警告——不过依然很可惜,唯一能够即时提示的手机现在在恶意者手中,主人一无所觉。 然后就是很没有新意的重设支付密码过程,借助手里的手机,我们完整的得到了整个支付宝的所有权,并且可以提光绑定了快捷支付的整张信用卡。在这里的唯一阻碍就是信用卡开卡行的支付限额。超过限额后需要使用密码和手机验证码来解除(浦发),手机验证码可以无视,密码是未知的。
结论
粗算了一下,丢一台手机,在一个小时内没有察觉,大约会造成4000元-4500元的损失,这还没有算手机。如果发卡行没有设定限额,最高大约是10W元。 我们来细数一下,整个过程里面的问题。
手机客户端不应当保存用户名密码,尤其是涉及资金的问题
对于频繁登录的问题,可以允许客户绑定一个手机token来解决。token等效于密码,但是不能做所有涉密操作,不能修改安全性,找回密码等。客户需要可以通过安全手段查看当前有多少个手机绑定了token,并且可以删除。贝壳之所以认为支付宝的系统有弱点,就是因为找遍整个支付宝系统,找不到删除token的地方。不能删除的token等于没用。
丢失密码的找回需要更加慎重
单纯的手机找回密码是有风险的,当然,单纯的邮箱找回也有。一种方法是同时验证手机和邮箱可以立刻找回密码,否则需要等待一定时间(例如几个小时,等待主人发现手机丢失)。 但是这仍然有风险。一般android里都会绑定邮件接收吧,借助这个很容易收到邮件。设计一个安全的密码找回方案并不是那么容易的,看来只有多等几个小时的方案略安全一些了。 同时这里也提醒一下。如果你在银行挂失银行卡找回密码的时候,觉得业务很方便。贝壳建议你立刻更换银行。在找回密码时越麻烦的银行,才是越安全的。
基于手机的核心验证体系
这是关键中的关键。我们可能会设计一个安全机制,里面有一步两步三步,必须全部通过才能操作资金。然而实际使用中,如果这三步都是依赖于同一个设备,那就对安全性没有任何提升——没有人敢保证手机不会丢失吧。钱包丢失最多损失几百,手机丢失呢? 目前,整个网银系统(不止是支付宝)都越来越多的依赖于手机。在手机越来越智能的今天,其可靠性实际上正在变差。手机可能丢失,也可能被安装恶意软件(尤其是root/越狱过的手机)。我们可以列出当手机丢失,或者安装了高权限的恶意软件时,会发生的安全问题。
- 个人信息泄密,包括朋友通讯方式,备忘,生日,身份证号码,家庭地址等。其中有些就涉及安全。
- 支付宝密码和支付密码可以重设(即,泄露)。
- 宝令丢失。
- 网银验证码无意义。
- 支付宝警告无意义。
- 网银警告无意义。
实际上,这不是支付宝的问题,而是用户在选择和设计自己的安全系统时,无意中造成的问题。
解决方案
暂时还没有太好的方案。
- 首先期待支付宝将手机登录改为token,取消密码保存,隐藏用户名,用户可以删除token,以解决直观的威胁。
- 期待手机丢失时快速发现的应用/功能。如果能在5-10分钟内停机,可以有效的解决手机丢失造成的风险。(贝壳向中国移动确认了,当手机停机后,是不能收取短信的)
- 当确实发生手机丢失时,应当首先立刻停机(因为停机速度快),然后向银行挂失(凡是绑定了手机的银行都要),然后以最快速度修改所有密码。
- 涉及资金的系统要多考虑一下,设计安全结构的时候要注意,如果有多于一个的方法进入系统,安全性决定于最弱的那个系统。如果所有步骤的安全性都依赖于手机,那么要考虑,丢了手机的时候会发生什么。