这个问题是a bug report I made on parse's help forum
的一面镜子现在,我知道解析网站上的那个不是一个问题,而是一个报告,我不想离开这里只是报告的一面镜子,但只是检查我的担忧是否有充分根据,对那些可能对我有更多经验的人。
问题在于,解析似乎没有以正确的方式生成HMAC签名。
现在,我的担忧是否有充分根据?我是否在签名生成的任何部分误解了OAuth RFC? Parse的员工/用户怎么可能没有注意到这么大的错误呢?
请知道,这个问题可以产生广泛的讨论,但是由于这个问题的重要性(不仅对我而言,对所有解析用户而言)都要留出时间让某人知情留下有效响应。
修改:
我正在挖掘Parse iOS SDK,找出实际发生这种情况的原因。经过一些研究和一些静态库的逆向工程后,我发现他们正在使用一个修改过的(可能只修改了前缀为' PF'的方法的名称)库OAuthCore 。在发现这个之后,我通过查看他们的SDK的旧开源版本(发现谷歌搜索修改后的库名称)得到了确认。现在,该库完成了它的工作并按预期工作,足够坚持RFC。问题是,显然,OAuth不会覆盖整个HTTP请求,而只是其中的一部分。我期待的是什么,以及恕我直言,当你提出更新字段的请求(或购买?登录?发送敏感数据?)时,肮脏的'字段应作为请求的参数发送,以便它们包含在通过OAuth协议完成的签名/验证过程中。而是将更新请求(特别是通过调用指向https://api.parse.com/2/update的POST请求)进行更新请求,将POST请求的主体设置为表示实际更新的json字符串。说实话,在所有这一切之前,这一点很清楚,因为通过查看请求,我应该意识到json文本是作为请求的原始主体而不是x-www-form-urlencoded主体发送的(因此具有查询参数urlencoded和& -concatenated在请求的主体中)。
虽然现在是"正确"行为我觉得这不应该是成千上万人使用的生产环境。我现在要做的是尝试在不破坏功能的情况下对其进行修补,如果我能够做到这一点,我将分享补丁。
仍然希望直接得到Parse的回复。
编辑2 :Parse已经将我的问题作为一个无问题而是错误报告关闭了。对其实施所暗示的主要安全漏洞没有任何评论。
报告错误的副本
我正在使用Parse iOS SDK,我发现了一个主要的错误 严重威胁使用解析开发的应用程序的安全性 作为后端。
现在,如果我没有使用错误问题报告工具,我很抱歉,但我确实如此 没有自己的Facebook帐户,我不愿意。
前提:Parse API似乎符合OAuth协议1.0a (RFC 5849)。涉及此错误的RFC的相关部分是 第18页,签名。
在oauth中,根据上面提到的RFC,每个请求都应该 有一个认证标题组成如:
OAuth realm="Example", oauth_consumer_key="0685bd9184jfhq22", oauth_token="ad180jjd733klru7", oauth_signature_method="HMAC-SHA1", oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D", oauth_timestamp="137131200", oauth_nonce="4572616e48616d6d65724c61686176", oauth_version="1.0"
这不仅可以确保请求获得授权,还可以确保 请求完整性,因为HMAC签名将强制执行此操作。作为一个 事实上,签名应该用a来计算 规范化的字符串由请求参数组成并用 客户端共享连接到令牌共享密钥(请参阅部分 3.3.2,RFC第25页)。通过这种方式,恶意用户在到达服务器之前不应该能够修改请求。该 服务器实际应该检查签名是否匹配整体 如果没有请求,请拒绝。
可悲的是,Parse看起来并不完全符合上述要求。通过使用 一个简单的代理,我能够完全修改请求,从改变 执行请求的用户ID,更改参数中的值 请求,添加一个字段和一个在请求中不包含的值 在所有。
现在很容易想象所有这些的缺点 导致。特别是我正在向移动开发人员思考 在他们的应用中启用应用内购买,依赖该解析是安全的 对他们来说足够了,他们的用户将无法“欺骗”#34; 失去收入并使他们为自己的应用所做的努力无效。
现在,虽然我可以在其他SDK上测试它,但我很确定 同样的错误也可以在那里重现,或者问题更严重 服务器根本没有检查签名。
等待Parse员工对此错误的回复。
问候,安东尼奥
答案 0 :(得分:0)
令人印象深刻的是,您已经深入了解框架以检查安全问题。我不是oauth的专家。但我只想评论您对应用内购买的担忧。担心应用程序内购买并不是必需的,因为这完全由App Store处理。任何购买都将由iOS'处理。 StoreKit.framework。 Parse与应用内购买无关。如果你想检查一个人是否买了什么,你只需要使用StoreKit.framework带来的功能,而不是Parse。