请问 oauth 的 app secret 为啥要保密? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Agromania
V2EX    问与答

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

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

    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     Solana     1015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 18:46 PVG 02:46 LAX 11:46 JFK 14:46
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86