Security 谷歌应用程序引擎-修改密钥的祖先部分以规避授权

Security 谷歌应用程序引擎-修改密钥的祖先部分以规避授权,security,google-app-engine,Security,Google App Engine,我的问题是关于一个漏洞,恶意用户可能会修改包含大量祖先的密钥的一部分,以便执行未经授权的操作 假设我有三种类型的元素MyParentEntity、MyChildEntity和My孙子 特定实体组上的授权用户列表存储在MyParentEntity上。因此,如果我在何处通过密钥获取my孙子女身份,我的资源将从my孙子女身份密钥中提取相应MyParentEntity的密钥。然后用提取的密钥加载MyParentyEntity,查看当前用户是否在授权用户列表中 简单,但考虑一下。 恶意用户希望将MyGra

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

假设我有三种类型的元素MyParentEntity、MyChildEntity和My孙子

特定实体组上的授权用户列表存储在MyParentEntity上。因此,如果我在何处通过密钥获取my孙子女身份,我的资源将从my孙子女身份密钥中提取相应MyParentEntity的密钥。然后用提取的密钥加载MyParentyEntity,查看当前用户是否在授权用户列表中

简单,但考虑一下。

恶意用户希望将MyGrandenity添加为其未经授权的MyChildEntity的子级。他们试图做到以下几点

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

现在考虑他们插入的巨大童心的父密钥。该密钥中包含MyParentyEntity密钥的部分是他们有权访问的实体的密钥,但包含MyChildEnity密钥的部分是他们没有权限访问的实体的密钥

这只是初步的,但如果授权数据仅在最根实体上,那么似乎有办法调整密钥的某些部分以获得未经授权的访问

问题一:这种攻击有效吗

问题二:如果是这样,你会如何为这样的事情辩护

-更新:-

当您使用父项保存实体时,数据存储是否验证父项是否存在,就像在使用该项的实体中一样?这将消除此漏洞


在玩游戏之后,似乎没有这样的检查。

一件事是不要向客户端发送密钥。相反,使用id或keyname,并在服务器上构造密钥。第二,验证任何传入请求。您知道用户是谁,您知道他们试图保存的实体,以及在哪个实体组中。因此,您应该有足够的数据来验证用户是否有权执行put。

发送密钥确实很难避免。如果您有一个包含一系列4个祖先的实体组,那么在GAE中,您需要实体上方每个祖先的ID。在这种情况下,总共5个ID!在这种情况下,我也在验证或授权。如果您可以关注我的攻击,那么问题是关于一个特定漏洞,该漏洞具有通用检索和匹配用户数据类型授权,具有2个或更多祖先,其中授权数据仅存储在最根实体上。是的,很难避免使用密钥,但我的第二点仍然有效。在服务器端,您知道经过身份验证的用户是谁,您知道他们试图访问或放置什么数据,或者其他什么。因此,您应该能够验证这是一个有效的请求?我能够执行一个看似良好的授权。我的问题是,我提议他们的攻击是否可以绕过这个问题。你通读了我的逻辑吗。我对TLDR有了一种感觉。