淘宝HTML5版私钥泄漏

漏洞概要关注数(8) 关注此漏洞

缺陷编号: WooYun-2015-143310

漏洞标题: 淘宝HTML5版私钥泄漏

相关厂商: 淘宝网

漏洞作者: 路人甲

提交时间: 2015-09-26 16:25

公开时间: 2015-11-12 13:46

漏洞类型: 敏感信息泄露

危害等级: 中

自评Rank: 6

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:敏感信息泄露

1人收藏 收藏
分享漏洞:
0

漏洞详情

披露状态:

2015-09-26: 细节已通知厂商并且等待厂商处理中
2015-09-28: 厂商已经确认,细节仅向厂商公开
2015-10-08: 细节向核心白帽子及相关领域专家公开
2015-10-18: 细节向普通白帽子公开
2015-10-28: 细节向实习白帽子公开
2015-11-12: 细节向公众公开

简要描述:

淘宝H5版私钥(淘宝无线称之为app secret)可被逆向分析javascript代码得到,得到私钥后,攻击者可以自行计算能通过服务端验证的md5签名,使签名验证失去意义,无法保证用户提交的业务参数在传输过程中未被篡改

详细说明:

私钥,也叫app secret, secret key,是API提供者(如淘宝、支付宝、微信)与客户端开发者(如微信、淘宝iOS版,淘宝H5版)约定的一个字串。打个通俗的比方,私钥就是谍战片里的密码本。这东西泄漏了,就不安全了,得换个新的。淘宝的问题是,密码本藏得不够好,就算你每小时换一次,敌人一分钟就拿到新密码本了。



客户端每次发起API请求时,都先将业务参数按顺序成一个串(如nick=codingdog&password=hahahaha),再将私钥拼接在头部(或者尾部,或者头尾都有)形成一个新串,然后对新串做不可逆的消息摘要(如md5, sha1,为描述方便,后面都说成是md5值)。md5值也会一起发送给服务端。



服务端收到请求后,使用完全一样的算法,和同样的私钥,计算一个md5值出来,然后和客户端传来的md5对比,如果相等,则检验通过,继续执行后面的业务逻辑。



由于md5, sha1等消息摘要算法的冲撞概率极低,若在传输过程中,第三方篡改了某个业务参数,则服务端收到api请求后,计算出来的签名与客户端传递的签名不相等,服务端便认为这是一个非法的api请求,不执行后面的业务逻辑。



通常开放平台都会有多个客户端,用不同的appkey(成客户端的唯一id)来区分,每个appkey对应的私钥都不相同。



综上所述,签名是一个用于保证业务参数在传输过程中未被篡改的安全机制。国内外大公司的开放平台均采用此机制,如国内的淘宝、淘宝无线、支付宝、微信,国外的yahoo, facebook, github, amazon。



淘宝h5版是淘宝官方的移动版网站,买家可以在其上搜索、浏览、购买商品,以及确认收货、评价交易,功能虽不如iOS和Android客户端丰富,但也涉及了交易这样的核心业务。





若黑产从业者获得了私钥,可非常方便展开中间人攻击,例如说:买家A通过H5版网页给卖家B一个好评,黑产从业者通过网络截取API请求,将好评改为差评,并重新计算一个签名,淘宝服务端无法得知有人篡改了买家A的真实意图,会请这个差评写入数据库。



好在支付宝风控体系比较完善,不会仅仅依靠签名一个因素来保证资金安全,还会有历史行为、可信账户、黑名单、短信校验、意外保险多种手段保障客户利益,黑产从业者即使获得了私钥,也不太可能直接转走用户的钱。但黑产从业者只需通过网络嗅探获取用户的session id,即可在用户不知情的情况下做非资金类操作——只要有对应的API,如收藏店铺、评价、下单但不付款,并由这些操作衍生出一些经济利益。淘宝的API是跑在HTTP上的,没有SSL,只有登录页面是HTTPS的(这只能防止用户密码被人通过网络监听窃取,不能保护收藏、下单等API)





淘宝的native客户端的私钥保护做得较好,此次出现漏洞的是H5版,其JS代码只使用了压缩、函数和变量重命名、匿名函数来降低js代码的可读性,以便让攻击者找不到私钥,但经过上述处理的js代码并非完全不可读,我花了一些功夫,仍然成功将私钥提取出来了。



它的appkey是12574478,secret是6dbf98274**********d583ae54





----

另外,开放平台这个东西,对中小企业来说都是高科技,除了BAT级别的巨头,很少有公司有像样的开放平台产品(网关是开放平台的核心),甚至一些估值10亿美元的独角兽公司也没有专业的开放平台。



一些小企业的安全状况更加糟糕,连个签名验证机制都没有,还有一些公司则是把私钥明文放在JS或者客户端配置文件里。





利益相关:我开发了一个开放平台产品,可以让客户不必写代码就拥有amazon, facebook, 淘宝这样的开放平台,功能全面程度肯定是不如巨头,某些细节有胜出,为免广告嫌疑,不提产品名和公司名。近几天正好研究怎么保护js中的私钥,做完之后想看看大厂是怎么做的,结果碰巧发现淘宝H5版的保护力度比较低。



漏洞证明:

以下是获取私钥的截图:











修复方案:

1. 更换app secret,因为已经泄漏了。而且更换app secret就是一条数据订正,和一次js发布,可以迅速上线。



2. 强化JS端信息保护,使用更加强力的代码混淆算法



3. 全面启用HTTPS

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:低

漏洞Rank:5

确认时间:2015-09-28 13:45

厂商回复:

您好,经确认当前手淘h5应用架构下,在页面中不会出现私钥,您在前端获取到的只是一个普通的token,作用类似csrf token。感谢您对我们的关注和支持!

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

你可能感兴趣的:(淘宝)