百度安全实验室:支付安全不能说的那些事儿
小编按:本文作者丁羽、黎桐辛、韦韬,文章来自微信公众号“百度安全实验室”,小编()获授权发布。 引言 电子商务已经成为当今互联网中重要的组成部分。同时“钱包”类服务成为了电子商务的关键组件。越来越多的电商服务通过“钱包”服务来进行支付。“钱包”提供的接口简单易用,任何一个开发者都可以快速的将“钱包”服务供应商提供的SDK整合进自己的App中,提供App内的快速支付手段。目前国内最大的“钱包”类服务包括:支付宝钱包、微信钱包、百度钱包等,各有长处。 因此,支付过程的安全问题也成为了关键。如果钱包服务出现了安全漏洞,那么很可能会影响到成千上万的商家,数十亿的现金流,后果往往非常严重。对于支付平台的安全研究自从其诞生之日起就开始了。经过数次血的教训,几大支付平台均修正了数个大大小小的漏洞,反复改进设计和实现。现今的支付平台已经相当安全可靠。 本文对借助支付平台进行的支付流程进行分析,对支付平台的安全进行讨论。同时我们展示了商户端和支付平台出现过的几个严重安全漏洞。攻击者通过这几个安全漏洞可以达到修改金额、任意购买等效果,使得支付平台和商户的利益收到巨大损失。本文中涉及的安全漏洞均已得到修正。 一、支付流程概述 目前市场上的大大小小的第三方支付平台有许多家,规模有大有小但是从整个支付流程上看这些支付平台的同质化程度很高。只有少数很大的支付平台做出了比较大的改动,进一步增强了安全性。这一节我们对支付平台普遍采用的支付协议做下介绍。 在支付流程中主要包括四个实体:商户前端、商家服务器、钱包模块、以及钱包服务器。商户前端是用户直接交互的部分,用户通过操作商户前端来购买商品等。这里商户前端不仅限于移动设备上安装的App,也可以是商家提供的网站。商家服务器是商户的后端,提供相应的服务。钱包模块是进行支付的“中介”,如支付宝、微信钱包、百度钱包等都有对应的支付模块。 通常支付模块可以是用户App中的一个SDK,与商户App一起安装在用户的手机上。支付模块也可以以web的形式提供服务。钱包服务器负责处理支付请求,并通知商家服务器支付结果。钱包服务需要与钱包模块交互以获得订单信息,同时需要与相关的机构(例如银行)进行扣款处理,最后与商家服务和钱包模块进行通讯以通知支付结果。因此整个支付过程是一个"四方通讯"的过程。一笔成功交易的后面通常包含四方之间数十次的复杂交互,任何一个环节的安全隐患都会扩大整个支付过程的攻击面。多个安全隐患的叠加可能使得攻击者可以进行订单篡改等攻击,使用户、商户、钱包服务的利益收到损失。 一个完整的经由支付平台的支付过程通常可以划分为以下几步: 1.商户前端对钱包初始化 2.商户前端与商户服务交互,创建订单 3.商户前端经由钱包,对订单进行支付 4.钱包与钱包服务器通讯,钱包服务器进行扣款,通知钱包和商户服务器支付结果。 5.商户前端从钱包的支付返回中获取结果,并和商户服务器进行确认。 6.支付完成,商户获得对应款项。 下面我们来介绍支付的四方通讯的详细过程。 图1 支付过程的四方通讯
在整个支付过程中,各个消息的完整性是最为关键的。如果消息完整性保护存在漏洞,攻击者即可发起修改金额、修改订单号、构造虚假订单等攻击。作为消息完整性保护的关键——签名机制,是支付协议的核心之一。目前应用在第三方支付平台中的签名机制可以分成两种:基于非对称密码体制的签名,和基于散列函数的签名。基于非对称密码的签名机制只在极少数支付平台上得到实现。而基于散列函数的签名则基本被所有平台应用或曾经应用过。 在基于非对称密码体制的签名机制中,每个商户和支付平台都生成自己的一套公钥-私钥对,并互相告知对方自己的公钥。在进行支付时,发送消息方使用自己的私钥对消息(或消息的散列值)进行签名,接受消息方使用对方(发送消息方)的公钥进行验签。这个方法的安全性来自于非对称密码体制的安全性,例如RSA的大质数分解难度,或计算椭圆曲线离散对数的难度。在这个机制中,最关键的是支付平台的私钥。攻击者一旦获得支付平台私钥,就可以对任意消息进行签名,从而欺骗商户。其次是商户的私钥。攻击者获得商户私钥后,结合商户App的其他漏洞,就可以进行各类攻击。 (编辑:ASP站长网) |