【说明】英文原文发表时间:2015.1.29,原文链接:点击这里
Parse(解析)是一个很不错的BaaS(后端即服务),它有助于为你的移动应用尽可能快地建立后端基础设施。也许正是因为它的简洁性,很多开发者忘记了许多新的安全问题和其中存在的漏洞。
Cloud Core中所有的数据都存储在所谓的定制类(普通数据库表)中。
从移动应用连接Parse账户需要两个密钥:应用ID和客户端密钥。为了修改Cloud Core上的数据,我首先找到了这些字符串。接着,我们使用idb来解密应用程序的二进制文件,idb是一款非常不错的iOS渗透测试工具。在解密进行过程中,我们可以检查一下NSUserDefaults,因为这是存储这类数据(针对不注重安全的开发者)的一个常用位置。
正如你所看到的,没有任何犯罪迹象被发现-没有机密数据的迹象。现在我们回到解密的应用二进制文件,然后将它们输入到Hopper中,Hopper是一款著名的反汇编软件,专门用来进行Objective-C应用程序的逆向工程。我们首先从应用中App Delegate的didFinishLaunchingWithOptions方法处开始寻找Parse密钥。Hopper中一个值得注意的特性是,它能够以伪代码的形式呈现任何程序代码,这使得逆向之后的代码理解起来不那么吃力。
下一步就是识别Parse表名称。实际上,我们可以在客户端密钥的那张截图中看到Parse表名称,并且有很多registerSubclass方法调用,这些类都是类PFObject的子类。每一个子类中都拥有一个方法parseClassName,该方法返回一个对应的Parse表名称。
https://gist.github.com/igrekde/cb8e2c12408715c9f739 file-parse-security-1
然而,光有类组织关系的知识还是不够的。我们还需要检查所有Parse类的访问权限,来确定如何影响应用程序的行为。很简单,我们要做的就是发送两个查询请求到Parse,然后分析它们的返回结果。为此,我写了一个小工具Parse Revealer,它可以简化这些操作,并能够自动确定所有已知类的访问权限。
最明显的漏洞是,攻击者可以修改任何聊天室消息的文本内容。在执行这个代码块之后,所有可以理解的语句都变成了乱七八糟的句子。
https://gist.github.com/igrekde/cb8e2c12408715c9f739 file-parse-security-2
此外,通过利用一个正确的聊天ID提供一个新的PFObject,我们也可以向任何聊天中发送新消息。然而,我们需要关注一个事实,那就是由于开发人员的偏执想法,我们并不能删除任何消息。
一个更严重的漏洞存在于不正确的数据映射算法中。当一个ChatMessage对象的发送域中没有任何内容时,Cubefree应用就会崩溃。所以,可以遍历所有的聊天室,并发送一个无效的ChatMessage,那么当其他人打开聊天界面时,该应用总是会崩溃。最终会造成App Store中的差评、用户流失以及项目的彻底失败。
在其他类中也有相同的漏洞,但是我们暂时还不考虑它们。
至于你自己的应用程序安全,一切都很透明,只需要遵循下面这些简单的规则:
- 总是为你所有的Parse类配置客户端权限。
- 确保基于用户的ACLs,这是一个强大的解析功能。
- 如果一个客户应该只能够修改类的一个属性,那么考虑将该字段封装到一个单独的类中,这样做能够绕过对象中非法修改的可能性。
- 不要依赖Parse:永远都要对返回的数据做适当的有效性检查。
- 记住,理论上来说,应用ID和客户密钥都可以被任何攻击中发现,所以你应该在此基础上构建应用程序的安全基地。
- 混淆代码中的字符串也很必要。
- 在更复杂的情况下使用云端代码。
扩展阅读
- Parse Documentation
- A small series of articles about Parse security
- Parse Revealer
- iOS Application Security Part 28 – Patching iOS Application With Hopper
- The Hopper Disassembler by Mike Ash