iOS应用安全Part38:iOS中的Parse安全

【说明】英文原文发表时间:2015.1.29,原文链接:点击这里

Parse(解析)是一个很不错的BaaS(后端即服务),它有助于为你的移动应用尽可能快地建立后端基础设施。也许正是因为它的简洁性,很多开发者忘记了许多新的安全问题和其中存在的漏洞。

如果你不知道这个服务是什么,那么我就做一个简单的介绍。Parse为移动开发者提供了很多有功的功能:云数据存储、推送通知、使用统计、崩溃日志记录、代码托管、后台作业以及很多其他服务。我们比较感兴趣的是名为“Cloud Core”的云数据存储服务。
Cloud Core中所有的数据都存储在所谓的定制类(普通数据库表)中。

你可以为每一个类设置很多不同的客户端权限:GET、FIND、UPDATE、CREATE、DELETE和ADD FIELDS,这些权限默认情况下都是开放的。当然,一旦配置数据表之后,大多开发者都忘记了设置客户端访问权限。

在我做一个项目期间,我曾深入了解了Parse,并在正确配置ACLs上花费了很多时间,所以我开始对其他开发者如何维护他们的Parse账户感兴趣。恰巧的是,我刚好在parse.com/customers上发现了我感兴趣的东西,那就是Cubefree,一项用来定位蜷缩空间(cowering spaces)的服务。
从移动应用连接Parse账户需要两个密钥:应用ID和客户端密钥。为了修改Cloud Core上的数据,我首先找到了这些字符串。接着,我们使用idb来解密应用程序的二进制文件,idb是一款非常不错的iOS渗透测试工具。在解密进行过程中,我们可以检查一下NSUserDefaults,因为这是存储这类数据(针对不注重安全的开发者)的一个常用位置。


正如你所看到的,没有任何犯罪迹象被发现-没有机密数据的迹象。现在我们回到解密的应用二进制文件,然后将它们输入到Hopper中,Hopper是一款著名的反汇编软件,专门用来进行Objective-C应用程序的逆向工程。我们首先从应用中App Delegate的didFinishLaunchingWithOptions方法处开始寻找Parse密钥。Hopper中一个值得注意的特性是,它能够以伪代码的形式呈现任何程序代码,这使得逆向之后的代码理解起来不那么吃力。

正如所料的,与Parse的连接在这里进行了初始化。现在我们分析一下Parse数据的结构以及客户端权限。
下一步就是识别Parse表名称。实际上,我们可以在客户端密钥的那张截图中看到Parse表名称,并且有很多registerSubclass方法调用,这些类都是类PFObject的子类。每一个子类中都拥有一个方法parseClassName,该方法返回一个对应的Parse表名称。

然后,让我们检查一下这些表的结构:
https://gist.github.com/igrekde/cb8e2c12408715c9f739 file-parse-security-1 
然而,光有类组织关系的知识还是不够的。我们还需要检查所有Parse类的访问权限,来确定如何影响应用程序的行为。很简单,我们要做的就是发送两个查询请求到Parse,然后分析它们的返回结果。为此,我写了一个小工具Parse Revealer,它可以简化这些操作,并能够自动确定所有已知类的访问权限。

我们可以使用所有派生的数据创建一个表:

从上面的权限列表中我们可以看到,开发人员试图实现一个安全策略,但这还不够。下面我们就展示一下通过修改ChatMessage类,我们能够获得什么信息。
最明显的漏洞是,攻击者可以修改任何聊天室消息的文本内容。在执行这个代码块之后,所有可以理解的语句都变成了乱七八糟的句子。
https://gist.github.com/igrekde/cb8e2c12408715c9f739 file-parse-security-2 

此外,通过利用一个正确的聊天ID提供一个新的PFObject,我们也可以向任何聊天中发送新消息。然而,我们需要关注一个事实,那就是由于开发人员的偏执想法,我们并不能删除任何消息。
一个更严重的漏洞存在于不正确的数据映射算法中。当一个ChatMessage对象的发送域中没有任何内容时,Cubefree应用就会崩溃。所以,可以遍历所有的聊天室,并发送一个无效的ChatMessage,那么当其他人打开聊天界面时,该应用总是会崩溃。最终会造成App Store中的差评、用户流失以及项目的彻底失败。
在其他类中也有相同的漏洞,但是我们暂时还不考虑它们。
至于你自己的应用程序安全,一切都很透明,只需要遵循下面这些简单的规则:

  • 总是为你所有的Parse类配置客户端权限。
  • 确保基于用户的ACLs,这是一个强大的解析功能。
  • 如果一个客户应该只能够修改类的一个属性,那么考虑将该字段封装到一个单独的类中,这样做能够绕过对象中非法修改的可能性。
  • 不要依赖Parse:永远都要对返回的数据做适当的有效性检查。
  • 记住,理论上来说,应用ID和客户密钥都可以被任何攻击中发现,所以你应该在此基础上构建应用程序的安全基地。
  • 混淆代码中的字符串也很必要。
  • 在更复杂的情况下使用云端代码。
如果在该研究中,你发现了你的应用程序,不要责怪Parse,它是一项神奇的服务,它能够最小化后端开发成本。这些漏洞的存在,都依赖于开发人员的安全意识。
扩展阅读

  1. Parse Documentation
  2. A small series of articles about Parse security
  3. Parse Revealer
  4. iOS Application Security Part 28 – Patching iOS Application With Hopper
  5. The Hopper Disassembler by Mike Ash


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值