CloudKit中共享表的安全性如何?

时间:2015-07-12 15:38:30

标签: security cloudkit

想象一下,我们正在使用以下表格构建共享书签应用程序:

  • 公司(companyID)
  • 用户(userID,companyID)
  • 书签(bookmarkID,content,companyID)

用户应该只能访问与其companyID匹配的书签。

传统上,您不会通过不让客户端直接访问数据库来确保这种安全性。相反,您将拥有一个可以对用户进行身份验证的服务器,并且客户端会向服务器发送一个唯一令牌以及对书签的请求。一旦服务器收到此令牌,它就会确切地知道允许用户访问的书签表中的哪些记录。

那很棒,但是如果你没有服务器,并且你想完全依赖CloudKit呢?

由于您没有服务器,因此您似乎必须允许每个用户完全访问“书签”表。然后,客户端代码将负责阻止访问不受限制的记录。 (例如,当您发送检索书签请求时,您将使用谓词,例如companyID == 3。)

问题是这样的系统有多安全,它允许客户端完全访问,但仅仅基于客户端代码限制它?

(注意:对于这个问题,假设攻击者越狱他们的手机,并使用任何必要的手段来访问他们不允许看到的数据。在我们使用服务器的情况下,我们不会这样做。如果他们越狱他们的手机,请小心,因为所有请求仍然需要通过我们的服务器。他们能够访问他们无法看到的数据的唯一方法是他们是否发现分配给另一个用户的秘密令牌但是,当攻击者可以访问另一个用户的手机时,我假设所有的赌注都已关闭:攻击者将能够找出其他客户端正在使用的秘密令牌,然后访问该用户&# 39;私人数据。因此,我提出的原始问题可以忽略攻击者可以访问另一个人的电话的情况,因为即使在更安全的版本(使用服务器)中,所有投注也都是关闭的。换句话说,假设攻击者只能通过以下问题访问自己的手机。)

我想知道的事情的例子:

  • 攻击者可以找出客户端用于CloudKit的凭据,然后针对CloudKit运行自定义查询吗?
  • 假设我使用@"companyID == %@"之类的谓词并用变量内容替换%@,攻击者是否可以在发送查询之前更改此变量的值?
  • 假设我使用@"companyID == 3"形式的谓词,攻击者是否可以将字符串更改为@"true || companyID == 3"以便获取所有记录?
  • 攻击者是否可以监控网络流量并查看正在发送给CloudKit的请求,然后使用中间人技术修改这些请求?
  • 假设我想在创建公司之前阻止创建重复的companyID,我运行查询来获取该companyID。一旦我将公司存储在本地变量中,我就会在创建公司之前运行if companyID != nil { return }之类的代码。攻击者可以修改他们的客户端,以便它不会执行这行代码吗?如果不使用companyID != nil,我会使用布尔值companyExists。会有什么不同吗?
  • 在我将新书签发送到CloudKit进行保存之前,我运行bookmark[@"companyID"] = 3等代码来设置正确的公司ID。例如,如果攻击者将此值更改为4,则会违反安全规则。他们可以做这种性质的事吗?
  • 客户是否重要?我主要关注iOS,但如果我制作了Android或JavaScript客户端怎么办?这会让它变得更安全吗?
  • 操作系统版本是否重要?我是否应该只有用户才能运行应用程序,如果他们使用最新的操作系统以获得最大的安全性,或者这无关紧要?
  • 您是否还有其他可以想到的事情会使该系统的安全性低于基于服务器的模型? (我至少可以想到一个:例如,如果你在应用程序的旧版本中有一个错误,它打印了一个表的全部内容,那么就没有简单的方法可以解决这个问题。用户可能故意避免升级他们的应用程序的目的是永远窃取人们的私人数据。解决这个问题的唯一方法是将所有数据迁移到旧客户不知道的新表中。我确定这会是一种痛苦。)

0 个答案:

没有答案