V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Agromania
V2EX  ›  问与答

请问 oauth 的 app secret 为啥要保密?

  •  
  •   Agromania · 2015-02-10 16:44:42 +08:00 · 4695 次点击
    这是一个创建于 3559 天前的主题,其中的信息可能已经有所发展或是发生改变。

    oauth应用都有个key,还有个secret,为啥要保密?被别人知道了他能拿来做什么坏事呢?

    20 条回复    2015-02-18 17:50:55 +08:00
    wormcy
        1
    wormcy  
       2015-02-10 17:04:05 +08:00 via Android   ❤️ 1
    v2ex用户都有个用户名,还有个密码,为啥要保密?被别人知道了他能拿来做什么坏事呢?
    zts1993
        2
    zts1993  
       2015-02-10 17:13:55 +08:00   ❤️ 1
    伪造请求啊。。。。。
    Agromania
        3
    Agromania  
    OP
       2015-02-10 17:15:39 +08:00
    @wormcy 登录了以后可以获得个人信息,发的帖子,从帖子信息有可能可以分析出性格爱好,购物历史,工作,住址,键盘型号……
    可以狂点“感谢回复者”……
    可以发小广告使自己受益 并导致这个账号被封……
    Agromania
        5
    Agromania  
    OP
       2015-02-10 17:19:52 +08:00
    @zts1993 我就是想不明白,伪造了请求,然后呢。

    现实一点的场景,有个应用A,他用了QQ的OAuth。
    我用A的app id和app secret和我自己的QQ号授权拿到了我自己的access_token,发了一条腾讯微博,除了微博来源显示来自A,以及我消耗了A的api调用次数,究竟我还能做点什么坏事呢?
    zts1993
        6
    zts1993  
       2015-02-10 17:22:04 +08:00   ❤️ 1
    @Agromania 别人的权限可能比你大, 你可以获取更多的敏感信息,或者做一下管理操作。。。一些你觉得无所谓的坏事,其实已经造成很严重的影响了。。。
    Agromania
        7
    Agromania  
    OP
       2015-02-10 17:31:30 +08:00
    @halfcrazy CSRF跟这个场景完全不一样吧,攻击方式和利用信任也不一样,受害者也不一样
    CSRF的受害者是在不知情的情况下在B站上提交了指向A站的Form的用户
    Agromania
        8
    Agromania  
    OP
       2015-02-10 17:49:02 +08:00   ❤️ 1
    @zts1993 我可能理解的不对,但是我理解的是这样,

    OAuth服务提供者X OAuth应用A 最终用户John

    攻击者Bob自己的OAuth应用B
    攻击者Bob自己的应用C(没有申请X的app)

    攻击者Bob


    首先最终用户要有X上的受信账号
    1. 用户John向应用A申请通过X授权,把自己在的X上的用户id告诉A,
    2. A通过自己的app id - secret和John的用户id, 把John的意愿告诉X(引导John到X的登录授权页面)
    3. X向用户John告知A请求你授权,授权后,A可以访问你的a, b, c数据
    4. 用户John登录X
    5. X告诉A, John已经授权你了(回调地址, access_token)
    6. A通过access_token可以访问John的a,b,c数据

    现在攻击者Bob来了,他通过某种方式盗取了A的app id 和secret,Bob做了一个应用C,使用了A的app id和secret,但是John不知道应用C也不使用应用C,

    现在Bob他能干嘛呢?
    Agromania
        9
    Agromania  
    OP
       2015-02-10 17:55:04 +08:00   ❤️ 1
    所以是不是Bob还必须要用钓鱼的方式,在John访问应用A的时候劫持到自己的仿冒应用C,引导John授权,拿到access_token,然后Bob就可以访问和操作John的a,b,c数据了?

    再假设如果应用A的权限只是一般应用的权限,Bob自己也申请了一个应用B,也可以访问X上用户的a,b,c数据,那上面这么复杂的攻击还有其他的意义和利益吗?



    我知道这个secret应该是非常重要的东西,但是我实在是想不出来严重的场景……
    nopy
        10
    nopy  
       2015-02-10 18:06:04 +08:00
    这个key能保证是你请求的内容,如果被别人盗用发点什么东西,让警察叔叔来抓你吗?
    loading
        11
    loading  
       2015-02-10 18:09:58 +08:00
    例如QQ,我能向你妈要钱!
    Agromania
        12
    Agromania  
    OP
       2015-02-10 18:12:03 +08:00
    @nopy 但是oauth的授权机制要求最终用户来授权才行啊,比如你通过qq号登录京东商城,(京东在这里是app,qq是oauth service provider)
    我做了个小黑站,我偷了京东的腾讯开放平台app id 和 key,然后呢?你又不来我的小黑站授权,我把我的小黑站授权地址(其实和京东的授权地址一模一样)发给你其实回调地址还是跳转的京东,我好像也做不了啥能让警察叔叔抓你,或者抓刘强东的事情啊……我实在是想不明白。
    Agromania
        13
    Agromania  
    OP
       2015-02-10 18:12:22 +08:00
    @loading 求解。HOW
    nopy
        14
    nopy  
       2015-02-10 18:24:26 +08:00
    @Agromania 这个东西是可以授权的,如果你拿到了一个应用的secret key,那么曾经授权过这个应用的所有账号 都可以让你来“使用”。

    比如在新浪微博实现定时微博这个功能以前,都是第三方通过API来实现的,用户授权定时微博应用,然后到指定的时间这个应用 通过这个授权来发微博。
    jeansfish
        15
    jeansfish  
       2015-02-10 18:25:52 +08:00   ❤️ 1
    https://github.com/jeansfish/RFC6749.zh-cn/blob/master/Section10/10.2.md

    在不能保证secret key的安全的情况下,redirect uri可以提供更进一步的验证。
    Agromania
        16
    Agromania  
    OP
       2015-02-10 18:30:29 +08:00   ❤️ 1
    好吧,还是伟大的StackOverflow靠谱,
    搜到了这个问题:
    http://stackoverflow.com/questions/7121966/should-i-obfuscate-oauth-consumer-secret-stored-by-android-app

    回答和我想的差不多,仅仅能做的一种攻击场景是:
    应用A和应用B都是用户很多的app,都可以通过QQ授权登录。B用了A的app id和key。B的用户通过QQ登录了B,B拿到了自己的用户的QQ信息,B拿这些信息干了坏事,QQ发现有第三方应用在干坏事,一查,是A的id和secret,就把A封了。

    然后这篇文章的第三段和第四段
    http://arstechnica.com/security/2010/09/twitter-a-case-study-on-how-to-do-oauth-wrong/
    说app的secret只能是和user agent一样,以一种比较不可信的方式告诉oauth是哪个应用在请求用户的数据,不能也不应该作为安全相关的使用和可信的判断标准,因为app secret很难保护,尤其是客户端app。

    果然。我说我想不出这个东西有啥严重的,跟密码不是一个级别的吧
    jeansfish
        17
    jeansfish  
       2015-02-10 18:46:40 +08:00   ❤️ 1
    https://github.com/jeansfish/RFC6749.zh-cn/blob/master/Section10/10.1.md

    app和js应用是不能使用secret 在本地做客户端验证的。

    严格按照协议来做的话,还是能避免一些风险的,毕竟制定协议的时候肯定经过了很多考虑
    GhostFlying
        18
    GhostFlying  
       2015-02-10 18:53:28 +08:00   ❤️ 1
    @Agromania 理论上客户端是应该使用implicit_grant,这样就不用secret了,反正也没意义
    llbbzh
        19
    llbbzh  
       2015-02-10 20:23:18 +08:00 via iPhone   ❤️ 1
    说实话,weico之类的第三方微博客户端、twitter客户端都要把app_secret保存在apk里面的,这就足以说明app_secret也不是什么见不得人的东西
    nopy
        20
    nopy  
       2015-02-18 17:50:55 +08:00
    @Agromania 想起来前几天 微信屏蔽了支付宝的接口,腾讯也屏蔽了网易云音乐的分享接口……嗯 还有这个效果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2733 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:37 · PVG 20:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.