黑客究竟用什么姿势偷走了你的钱?
分享嘉宾:宋宇昊,毕业于上海交通大学信息安全学院,碁震(KEEN)的联合创始人,现担任技术总监、高级研究员,曾任职于微软(中国)安全响应中心,并于2010年获得微软中国突出贡献奖。目前关注Android相关和智能设备领域的安全研究,同时致力于打造 GeekPwn 平台,向广大白帽子们征集智能设备漏洞,提交给厂商,并把危害展现给大众。
【KEEN 联合创始人 宋宇昊】
这世上的骗局,到底谁买单?
随着移动支付的普及,我们的生活变得越来越便利。我们甚至已经可以不带钱包、现金、银行卡出门,只用手机就能完成吃饭、娱乐、交通、购物的支付。
平时我们一讲到支付安全,大家最容易想到的就是钓鱼、诈骗、木马。确实,钓鱼、诈骗和木马是支付领域最常见犯罪手段,它的犯罪成本低、易于实施。他们其实属于社会工程攻击的范畴,犯罪者一般先通过各种方式获取受害者的信息,比如联系方式、甚至可能是受害者的个人隐私信息,然后犯罪者利用受害者心理弱点进行欺诈,诱使他们做一些操作。例如洗钱调查开安全账户、家人生病、来看看我们的照片等等都是常见的欺诈手段。
所有欺诈手段的共同点是,犯罪者都要诱使受害者犯错,只有受害者执行了错误的操作才能够让犯罪者得逞。那么是不是只要用户保持清醒的头脑不受骗上当就安全了呢?
答案是否定的。除了用户有犯错的机会,产品厂商的设计者、开发者也会犯错,他们犯的错误也可能导致用户财产受到犯罪者的侵害,当然也可能导致厂商自己受侵害。大家都知道开发者写代码出错,那叫Bug。而如果正好有某个Bug不巧,能够被攻击者利用,在没有被授权的情况下访问或者破坏系统,那这个Bug就叫做漏洞。
有些人会把这类攻击者叫做黑客,但我这儿为了避免混淆不这么称呼,因为在不同场合下黑客有不同含义。有时候,黑客被认为是利用技术研究成果实施计算机犯罪的人,这类人也被叫做黑帽黑客;有时候,黑客是指那些把研究成果用于帮助厂商改进产品,帮助保护用户安全的人,这类叫做白帽黑客。
白帽子们会在各种渠道,例如 GeekPwn 这样的平台上分享并展示出自己的研究成果,然后我们将这些成果提供给厂商,以帮助他们提升产品安全。正因如此,这些案例中的漏洞并没有被用于犯罪行为中,而是被厂商及时地修复了。今天我们就来看看我们能从中吸取到些什么经验和教训。
消费型App存在哪些问题?
所谓消费型APP是指所有能在其中进行充值、购物、购买服务等等消费行为的APP。在这个案例中,是一个O2O提供线下服务的APP,用户可以在APP中充值余额。然而一个恶意的用户可以做到在APP中充值任意多的钱,实际却只支付1分钱或其他任意金额。这个场景中的受害者是这个APP服务的提供商。
那么这个任意占厂商便宜的漏洞是怎么产生的呢?在分析原因前,我们先看一下攻击的流程。
这个场景中有手机APP、支付平台、APP服务端三方。根据厂商的设想,他们预期的是这样的支付流程,我们看下图的左侧:
1、手机APP首先生成了一个100元的充值订单发送给APP服务端;
2、用户获得一个支付链接,依据链接向支付平台支付100元;
3、支付平台会向APP服务端发送消息,说某个订单成功支付了100元;
4、APP服务端收到消息,检查是否支付成功,如成功就往账户余额中增加100元。
这个流程问题在哪儿呢?我们看刚才那幅图的右侧:
如果这个APP用户并不是一个老实的用户,他并没有按照订单返回的支付信息支付100元,而是把它修改为支付0.01元,并且完成支付。在这个情况下,APP服务端同样会收到支付平台发来的消息,说某个订单成功支付了0.01元。然而APP服务端却并不管实际支付了多少钱,只关心这个订单支付成功了,并且按照订单金额给账户中充值了100元。这样用户就成功地坑了APP厂商99.99元。
导致这个问题的原因是什么呢?是一个APP服务端的漏洞,APP服务端没有遵循支付平台的API文档标准,对支付平台回调的支付结果信息做充分的校验。
二维码支付存在哪些问题?
我相信大多数朋友都用过二维码支付,在实体店铺中展示二维码,扫一下就能完成支付,非常方便。我们这就来看一下二维码扫码支付的漏洞案例。在这个案例中,攻击者到任意实体店铺进行消费,以二维码方式支付,但却从受害者的账户中扣费。这里的受害者可以是任何一个在这个支付平台上注册过的用户。在分析原因前,我们先来看一下攻击流程。
这个场景中有用户、实体店铺和支付平台三方。根据支付厂商的设想,预期这样的支付流程:
用户Alice点开扫码支付,这时候支付客户端会向支付平台服务端请求一个二维码,假设这里请求的AccountNo叫Alice,这样支付平台服务端就会返回一个二维码,这个二维码对应于Alice的账户,并且只能用一次,这就相当于一个支付令牌。
店铺的二维码扫描枪扫了一下这个二维码,店铺就获得了这个支付令牌,它就可以从Alice的账号中扣款了。然而有个叫Chuck的恶意用户,它在向服务端请求支付二维码的时候,在AccountNo当中填入了Bob,而不是他自己的账户Chuck,这时候店铺虽然扫描了Chuck手机上的二维码,但实际上会从Bob账户中扣款。