Google App Engine - 修改密钥的祖先部分以绕过授权

时间:2014-07-28 07:41:10

标签: security google-app-engine

我的问题是关于一个漏洞,恶意用户可能会修改包含严重祖先的部分密钥,以便执行未经授权的操作。

假设我有三种类型的元素MyParentEntity,MyChildEntity和MyGrandchildEnity

特定实体组的授权用户列表存储在MyParentEntity上。因此,如果我按键获取MyGrandchildEnitty,我的资源将从MyGrandchildEnitty键中提取相应MyParentEntity的键。然后使用所述提取的密钥加载MyParentyEntity,并查看当前用户是否在授权用户列表中。

很简单,但考虑一下。

恶意用户希望将MyGrandchildEnity添加为未经授权的MyChildEntity的子级。他们尝试以下方法。

在他们提交MyGrandchildEnity之前,他们将其引用MyParentEntity的父键的一部分更改为授权他们的MyParentEntity的键。这样,当资源从MyGrandchildEnity的父键中提取MyParentEntity键时,它会加载一个授权通过的MyParentyEntity,然后继续插入他们提交的MyGrandchildEnity。

现在考虑他们插入的MyGrandchildEnity的父键。包含MyParentyEnity密钥的密钥部分是他们具有授权的实体的部分,但包含MyChildEnity密钥的密钥部分是他们没有权限的实体的部分。

这只是初步的,但如果你授权数据只在最根的实体上,那么可能有办法调整一部分密钥以获得未经授权的访问。

问题一:此次攻击是否有效?

问题二:如果是这样,你会如何防守这样的事情?

- 更新: -

当您使用父密钥保存实体时,数据存储区是否验证父级是否存在,如同具有该密钥的实体一样?这可以消除这个漏洞。

看完之后看起来没有这样的检查。

1 个答案:

答案 0 :(得分:0)

有一件事是不向客户端发送密钥。而是使用ID(或键名),并在服务器上构造密钥。其次,是验证任何传入的请求。您知道用户是谁,您知道他们要保存的实体以及实体组。因此,您应该有足够的数据来验证用户是否有权执行放置。