应用安全开发注意事项
新浪安全部门一直致力于推动开放平台上的产品安全,使微博应用拥有更好的用户体验和具备更安全的功能。从目前的情况来看,我们发现部分应用存在下面几种常见的安全漏洞或缺陷,这些安全漏洞除了对应用本身带来影响外,也会给用户带来损失。
app secret泄露
app_secret是应用请求开放平台生成access_token的唯一认证,使用app_secret目的是确保应用是开发者本人在使用。
不同的应用在开放平台拥有不同的接口调用资源和API权限。如果该应用的接口资源被盗用,进行发布垃圾信息和加关注等恶意操作,开放平台会对应用的资源和权限进行限制,这样会直接影响到该应用的正常API的调用。因此,对于开发者来说,有必要保护自身应用安全,相应的安全资源不被非法使用,从而保障应用的正常运行。
建议把app secret保存在应用服务端,为了更好的保护你的应用安全,建议在管理中心/安全设置中绑定应用的服务器ip。
如果发现应用的app secret被泄露,请立即到应用管理中心进行重置
http://open.weibo.com/apps/
app secret泄露的常见原因:
1、app secret出现在页面源代码或者url中,导致直接查看源代码即获得。
2、app_secret保存在客户端本身程序中,所有的本机应用程序(如iOS,Android或Windows桌面应用程序),都可以反编译的代码获得。
3、未使用HTTPS安全传输协议,攻击者通过网络嗅探获得。
access_token泄露
access_token是用户通过应用访问开放平台的会话标识,应用程序要做好保护工作,防止被第三方窃取。
常见的access_token泄露途径:
1、access_token保存在cookie或者页面代码中,攻击者通过xss漏洞窃取用户token。
2、应用服务器存在sql注入漏洞,导致用户token泄露。
绑定微博用户CSRF漏洞
如果你的应用有自己的帐户体系,并且有绑定微博用户登陆这个功能,请检查绑定接口是否有防止CSRF攻击的功能。授权接口state参数的可以用来防止授权过程CSRF攻击,具体详细的使用方法,可以参考最新版SDK代码,https://github.com/ElmerZhang/WeiboSDK。
加关注发微博CSRF漏洞
关于CSRF漏洞的更多介绍可以参考这里。http://baike.baidu.com/view/1609487.htm
微博应用的CSRF漏洞常见于加关注和发微博等写入接口处,用户看到的现象是微博多了一些莫名的关注,或者转发了一些营销微博。
开发者可以通过检查referer是否合法或者在表单中加入csrf_token方式来防御CSRF攻击。
用户身份伪造
完成OAuth 2.0授权认证后,应用方可获得象征用户身份的access_token,一般直接用于接口调用。但部分应用需要获得用户的uid,作为同自身账号体系做关联的认证凭据,以提供更多应用自身的服务内容。典型情况如使用了微博sso sdk的手机应用、网络存储服务型应用。
在此场景下,常见的漏洞有:
1、 客户端直接以授权接口返回的uid或提取access_token中的uid,回传应用自身服务器作为认证凭据。该传输过程可被非法拦截,通过篡改uid伪造用户身份。
2、 客户端将access_token回传自身服务器,服务器提取其中的uid作为认证凭据,但并未校验该access_token的合法性。此时,通过骗取A用户授权X应用,获取access_token后传入Y应用服务器,便可拿到Y应用的A用户凭证,访问Y应用中该用户的服务内容。
修复建议:
1、 不要直接使用没有授权信息的uid来换取自身服务的认证凭据,只能使用access_token进行。
2、 服务器端提取access_token中的uid,需调用开放平台的OAuth2/get_token_info接口。使用该接口时,需一并查证该access_token所属的appkey是否为自己的客户端应用appkey。Appkey来源相符的才允许换取自身服务的认证凭据。
3、 对所有已存入的绑定access_token进行核查,发现access_token中的新浪uid和绑定新浪uid不一致、非自身客户端应用appkey授权的access_token、过期access_token等异常情况均需要全部撤消,要求这些异常用户重新授权登录。
点击劫持漏洞
恶意站点通过iframe的方式嵌套微博应用站点,利用HTML透明覆层等技术,劫持用户的点击操作。从而达到诱导用户执行恶意加关注目的。
修复建议:
1、不需要被iframe的应用,可选用下面之一的方法。
- a、header头声明 header( "X-FRAME-OPTIONS:DENY");
- b、JS判断当前页面是否被iframe,示例代码: if(top.location!=location){top.location=locaiton;}
2、需要被iframe的产品。
- a、判断父窗口是否是允许的页面;
- b、弹出加关注确认,并给出被关注者的昵称。
应用安全涉及的范围比较广,开发者除了要注意避免掉上面常见的安全问题外,也应该关注最新安全趋势,了解自身产品的安全缺陷,更重要的提升产品和开发人员的安全意识,只有这样,才尽可能的减少安全问题产生。如果出现安全漏洞,可以及时联系我们,我们会第一时间提供解决方案。