新浪微博Android客户端SSO授权认证缺陷

标签: 新浪微博 android 客户端 | 发表时间:2013-09-08 20:32 | 作者:zh.weir
出处:http://www.blogjava.net/

新浪微博Android客户端SSO授权认证缺陷

从最近几年开始,做平台的公司都流行起Open API。这是一个非常好的理念,也受到广大开发者的欢迎。如今,开发一款软件,你可以很容易地集成微博、微信、人人网等流行社交媒介的分享功能,做一个社交应用变得越来越简单。
 
主流社交媒介要集成到第三方应用中,最重要的入口就是安全便捷的授权认证系统。让用户在享受一键分享和各种社交乐趣的同时,又不用担心帐号安全和隐私泄露等问题。而对于一些有特殊目的的组织或个人来说,攻占这个授权认证系统意味着自己获取了信息传播的入口和渠道,数量庞大地社交入口往往能带来巨大的社会效应。所以,这个入口就成了软件安全攻防双方的必争之地。
 
而本文所要讲的就是当前最为流行的新浪微博Android客户端SSO授权认证入口的一个安全缺陷。此缺陷使得第三方APK在一定条件下可以不通过授权,在不需要人为操作的情况下就可以操作Android手机用户的微博。包括关注、评论、发微博等OpenAPI中提供的功能。
 
一、新浪微博授权认证方式的演变:

首先让我们简单回顾一下新浪微博OpenAPI这几年授权认证方式的演变历程,并了解一下各自的安全性问题。
 
1、最开始是Basic认证。
 
即是通过http协议的authorization头来传递认证信息。认证信息包括用户名和密码,仅通过base64对用户名密码做加密。基本相当于明文传输。所以出于账户安全考虑,经过一段时间后就被废弃不用了。
 
2、然后切换为XAuth认证。
 
XAuth认证其实就是OAuth认证的简化版。OAuth的原理不做详细说明。大致流程是:
 
A、第三方应用到授权服务器请求一个授权令牌(request token&secret)
B、引导用户到授权服务器请求授权
C、用访问令牌到授权服务器换取访问令牌(access token&secret)
D、用访问令牌去访问得到授权的资源
 
它的安全保障是,所有http请求都采用非对称加密算法对请求进行了加密。所以网络上传输的数据理论上是安全的。
 
但XAuth认证是OAuth认证的简化版,它允许第三方应用从用户的输入中获取到用户的帐号和密码,而无法保证第三方应用对用户的帐号和密码进行了足够安全地保护。特别还有一些流氓软件本身就会记录用户的信息。所以微博帐号的安全还是存在较大的风险。
 
3、采取了更安全更便捷的OAuth2.0认证。
 
OAuth2.0比OAuth1.0更安全更便捷主要是两个方面。
 
更便捷。OAuth2.0的认证流程比OAuth1.0更简单。只需要三步:
 
A、引导用户到授权服务器,请求用户授权,用户授权后返回 授权码(Authorization Code)
B、客户端由授权码到授权服务器换取访问令牌(access token)
C、用访问令牌去访问得到授权的资源
 
更安全。token不再需要secret,并且也不再需要对token进行加密。但OAuth2.0采用了https安全协议,在安全保障更胜一筹。
并且OAuth2.0第三方应用不再接触到用户的帐号和密码,用户直接跳转到新浪微博的认证界面进行登录。第三方应用仅获取登录成功之后的结果。从而保障了用户帐号的安全。
 
但是OAuth2.0认证在移动终端的应用上也存在一定问题。主要倒不是安全上的,而是用户体验上的。跳转到授权页面在移动终端上体验不好,授权流程相对复杂,导致授权的转化率受到影响。因此,新浪微博结合新浪微博客户端一起推出了它的第四代授权认证:SSO认证。
 
4、通过微博客户端的SSO认证。
 
SSO的全称是Single Sign On,中文名是单点登录。当第三方应用与新浪微博客户端为互相信任的应用系统时,仅需要一次授权登录就可以在一定期限内,不再重复登录授权而不受限制地调用新浪微博Open API提供的各种服务。
 
这种授权方式与新浪微博客户端紧密结合,当用户有登录新浪微博客户端时,只需要一键授权就能完成授权流程,非常便捷。另外第三方应用通过微博客户端进行授权认证,不会直接接触到用户的账号密码,账户安全也能得到保障。
 
SSO是一种非常好的移动终端认证方式,并且利于本身客户端的推广。安全性和便捷性都不错。但由于SSO的基础是客户端和第三方应用需要互相信任,而这个信任关系本身的安全性存在缺陷。因此就会出现其他非信任应用能够冒充信任应用获得授权认证,从而对用户的微博进行操作的情况。这就是我们本文中将做进一步阐述的内容。
 
二、如何冒充信任应用,获取客户端的授权:

在Android应用中使用过新浪微博SSO认证的朋友们都知道,针对新浪微博的授权,官方提供了较详细的文档和封装得足够简单的SDK供大家使用。由于本文内容与这些技术细节关系不大,所以在此就不做细述,不了解的朋友可以去新浪微博开放平台的官网上了解相关内容。
 
事实上,新浪微博对于信任应用的认证环节相当地弱。具体来说只需要两个关键信息:CONSUMER_KEY和REDIRECT_URL。
 
CONSUMER_KEY即第三方应用在新浪微博开发平台网站后台申请到的APP KEY。
REDIRECT_URL即第三方应用在后台填写的OAuth2.0的授权回调页网址。
 
当这两个信息匹配时,新浪微博就会认为是对应的第三方应用发起了合法的请求。授权流程就会正常进行。如果这个第三方应用已经在之前做过了授权,那么它就可以直接获取access_token,然后就可以操作用户的微博了!
 
现在我们假设:
1、用户的Android手机已经安装了新浪微博客户端并已经登录。(应该95%以上的手机满足此假设吧)
2、用户曾授权过一些主流第三方应用进行微博分享操作。例如camera360、美图秀秀、网易新闻等。(此假设应该也有90%以上的用户满足吧)
3、用户的新浪微博端只登录了单用户帐号。多用户帐号在SSO授权时需要用户手动选择帐号,所以需要人为干预。(此假设也应该有90%左右用户满足吧)
 
在满足前面三个条件的情况下,只需要我们再获取到用户曾经授权过的第三方应用的CONSUMER_KEY和REDIRECT_URL就可以通过官方的SDK调用,在不需要人为操作的情况下操作Android手机用户的微博了!
 
于是我们的问题集中在了如何获取第三方应用的CONSUMER_KEY和REDIRECT_URL上。
 
很多朋友也许会认为,CONSUMER_KEY和REDIRECT_URL对于SSO授权认证系统的地位就相当于非对称加密算法的私钥,属于非常隐私的、应该被保密起来的信息,我们如何可以获取到呢?
 
这里需要注意的是,私钥之所以安全,是因为它是物理隔离的。私钥的信息理论上只存在于软件发布商的单机上,任何发布到公众的信息中都不包含私钥信息。因此,除非特殊途径(例如拿到软件发布商的电脑把私钥拷贝出来,或者软件发布商头脑发晕,把私钥给发了出去),我们认为私钥信息是绝对安全的。
 
而CONSUMER_KEY和REDIRECT_URL是授权过程中需要的信息,因此把必须在软件的运行时出现,因此这个信息从理论上来讲是发布到公众的信息。通过一系列逆向、静态、动态分析,我们可以获取到这些信息。因此它是不安全的。
 
正巧,几个月前闲暇之时,曾对一些如今比较流行的Android应用做过这方面的技术分析。自己通过逆向获取到了这些应用的相关信息,如下图:
 
 
注:没列出来的应用并不证明没有此安全问题。
 
这些应用都是现在最为流行的一些应用。为了不引起公众影响,我对其中的关键信息进行了适度的隐藏。
 
因此只要你曾经授权这些第三应用(以及其他第三方应用),那么从理论上来说,软件安全的攻方,就可以通过逆向获取这些应用的CONSUMER_KEY和REDIRECT_URL,通过官方提供的SDK,在你不知情的情况下,操作你的新浪微博帐号了。
 
三、新浪微博的下一代授权认证方式:

针对目前SSO授权认证安全缺陷的情况,新浪微博推出了下一代SSO认证,即SSO2.0。
 
事实上SSO授权认证从去年推出以来,这个问题很快就被发现,如果不是现在推出了SSO2.0,我可能还会继续憋着不说。毕竟破解不是关键,关键是推动软件安全不断进步。
 
在理解了现在的SSO授权认证机制及其缺陷后,SSO2.0很好理解。SSO2.0主要就是为了防止非信任的第三方应用冒用信任的第三方应用的身份。既然CONSUMER_KEY和REDIRECT_URL本身的信息安全都无法保障了,那该如何防止?
 
这又回到了很早以前我曾讨论过的如何防止应用被破解的问题上,应用的身份如何防止被冒名顶替?最简便且理论安全的方法就是通过签名对比认证。而这正是新浪微博SSO2.0所采用的方式。
 
在新浪微博开放平台网站后台,对第三方应用绑定包名和签名。这样当非信任应用采用信任应用的CONSUMER_KEY和REDIRECT_URL进行认证请求时,由于包名和签名对应不上,服务器和微博客户端就会拒绝认证通过,从而补上了SSO1.0的安全缺陷问题。
 
当然,SSO2.0也不是绝对安全的,它也存在自身的薄弱环节。不过,这就不是本文的讨论范围了。
 
注:本文仅作技术研究与交流,严禁用于任何商业目的!


转载请注明出处:  http://www.blogjava.net/zh-weir/archive/2013/09/08/403829.html
   


zh.weir 2013-09-08 20:32 发表评论

相关 [新浪微博 android 客户端] 推荐:

新浪微博Android客户端SSO授权认证缺陷

- - BlogJava-首页技术区
转载请注明出处:  http://www.blogjava.net/zh-weir/archive/2013/09/08/403829.html. 新浪微博Android客户端SSO授权认证缺陷. 从最近几年开始,做平台的公司都流行起Open API. 这是一个非常好的理念,也受到广大开发者的欢迎.

新浪微博 Linux 客户端 Weico 正式发布

- openboy - Wow! Ubuntu
Weico 是由国内知名设计团队 eico Design 开发的新浪微博客户端 ,之前一直流行于 iPhone 平台,现在他们正式发布了桌面客户端,采用 Adobe AIR 技术构建,跨平台,支持 MacOSX ,Win 及 Linux 系统. Weico 采用了迷你风格,大小仅比输入法提示条大一点点,可以悬浮在屏幕的角落,同时具备很好的 UI 体验.

新浪微博 WP 客户端开发经验分享

- - 微博之博
新浪微博也是国内比较早的登录 Windows Phone 平台的应用,以下是新浪 Windows Phone 平台 微博产品负责人 彭姗对 Windows Phone 开发经验的分享,以及对新浪微博 WP 客户端融入 Metro UI 所做的一系列创新式改变和在 Marketplace 通过审核经验的介绍.

[来自iPc.me] Wing 新浪微博漂亮的桌面客户端软件 (AIR跨平台)

- Andy - iPc.me
新浪微博是现在国内比较红火的微博客了,今天为大家送上一个漂亮的新浪微博桌面客户端软件Wing,它是基于Adobe AIR开发的,可以跨平台使用,使用比网页更方便快捷,很不错的……. [ 请大家更新订阅地址 http://feed.ipc.me ]. iPc.me 猜你可能还会喜欢:百度Hi 抢先图文试用感受.

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

- - CSDN博客推荐文章
前一篇文章" [python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID、用户名、微博数、粉丝数、关注数等. 微博信息:包括转发或原创、点赞数、转发数、评论数、发布时间、微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩:.

优秀的Android Twitter客户端

- 馒头 - Solidot
Irene Janes 写道 "无论用任何标准衡量,社交网络正日益成为生活的一部分. Twitter是最流行的社交网络服务之一. 12个月前,它每天约发送6500万条消息;今天,这一数字已经上升到每天超过2亿条,相当于2亿注册用户每人每天发送一条. Twitter从根本上改变了许多人的交流方式.

谈Android手机客户端的适配测试

- - Taobao QA Team
一、           Android 客户端为什么要进行适配测试. 在正式开始android客户端的适配测试点整理之前,先给大家看几个数据. 下面是随机抽取某个android客户端在2月份的用户使用情况. 【Android不同系统版本下的分布情况】. 【客户端在不同手机分辨率下被使用的分布情况】.

Android客户端代码保护技术-完整性校验

- - 移动开发 - ITeye博客
  由于Android系统固有的缺陷、Android应用分发渠道管理机制等问题,导致Android客户端程序很容易被反编译篡改/二次打包,经任意签名后可在各个渠道或论坛中发布,这不仅损害了开发者的知识产权,更可能威胁到用户的敏感信息及财产安全,因此客户端程序自身的安全性尤为重要,本文以客户端完整校验为主题,提供几种Android客户端完整性校验的实现思路,供广大开发者参考.

围攻新浪微博

- Jos - 望月的博客
在国内的门户微博中,新浪微博无疑是目前用户数量最多、媒体属性最强的,但是,最近,却连续看到一些互联网的知名人士高调宣布退出或者关闭新浪微博的博文,使用和不使用某个产品本就是个人的自由,但如此高调的宣布,并进行口诛笔伐,就值得关注了. 本文试图通过分析谷奥事件,宋石男和贾葭两位老师离开新浪微博的事件分析新浪微博的是与非.

新浪微博连接 2.3

- leeking001 - 我爱水煮鱼
新浪微博连接是我使用新浪微博 API 接口开发的一个 WordPress 插件,它的主要功能是能让用户使用新浪微博账号登陆 WordPress 博客,并且可以直接使用新浪微博的头像,同步博客日志到 WordPress 博客. 经过几天的测试,新浪微博连接插件升级到 2.3,主要修正:同步博客到新浪微博的问题,并且同步内容更为丰富,规则改为:【日志标题】+ 日志内容摘要 + 日志链接.