GUID 对于长期访问令牌是否安全?

信息安全 api uuid
2021-08-18 20:38:47

我在工作中使用的软件有几个组件,我们称它们为服务器和代理。

服务器通过 https 运行一个 api,代理使用该 API 与之通信。

服务器可以是云托管或本地托管的。

通过在请求的标头中提供给定代理的 guid,无需任何身份验证过程即可访问整个 api。该 api 也可供非代理使用(尽管可用的已发布功能与相同的 api 略有不同,没有特殊限制来识别它是代理还是来自任何人的随机 http 请求)

这些 guid 在服务器应用程序的 Web 前端中不可见,在代理应用程序的 gui 中也不可见。并且代理不会在用户机器上运行——更像是 IT 人员只访问虚拟机。

该 API 允许提取密码和其他加密存储在数据库中的数据。根据您对该软件的信任程度,您可能会在其中存储一些非常强大的凭据。

guid 似乎是使用版本 4 生成的 .net 我认为它被称为(对不起,我的安全知识有限),因为第三组的第一个字符在 MS 格式中是 4,​​我看不到任何代码用于创建 guid 的 db 及其托管 api 的 asp.net Web 应用程序。

对 api 的调用似乎没有速率限制,即使对于多个未经授权的请求,似乎也没有进行子网或 IP 地址过滤 - 显然甚至在云实例上也没有(尽管我再次不是安全人员,也许我现在在观察名单上,我发送给他们的所有东西都会受到不同的对待)

这些 guid 未加密地存储在服务器应用程序数据库中。

我向供应商提出了这个作为一张票,他们基本上说它是按照设计的,值得称赞的是,他们对此进行了非常快的调查(考虑到公司的明显规模)。

我疯狂地认为这很糟糕吗?

似乎现在任何拥有数据库访问、代理访问或网络硬件访问的人现在都能够获得他们想要的任何东西。由于某种原因(例如,您使用云实例并且在很短的时间内有人设法在中间人),以及由于某些原因导致 https 流量暂时失败,并且在您删除这些代理之前,您都是敞开的。甚至没有记录访问以提取凭据?- 至少从我作为客户的角度来看,我没有看到它(除非我去查看本地实例上的 IIS 日志,我猜是这样)。

显然无法预测 guid(因为我无法向云实例注册一堆代理并预测下一个客户 guid 将是什么)但如果我使用 api 进行身份验证,我得到的一次性访问令牌是很多的,这似乎很奇怪比 guid 复杂几倍,但只对那个会话有效,而 guid 基本上永远持续下去。

您可以在逻辑上划分代理以限制他们可以访问的数据,现在我已经发现了这个潜在的漏洞,这突然变得非常重要,所以也许我只是让企业意识到这一点等等?

对于这种类型的应用程序,也许没有办法解决这个问题,我从来没有写过这样的东西。但至少我希望有人尝试收紧这一限制

  • 将此密钥的使用限制为已知的 IP 地址(或至少在 IP 地址更改或使其成为选项时生成警告)
  • 仅在初始握手中使用密钥,然后从那里使用令牌,因此并非所有流量都容易受到攻击
  • 每次代理成功连接到服务器时,可能会创建一个新的这些密钥

我不知道,正如我所说我从未编写过服务器代理类型的应用程序,也许我只是天真?

1个回答

当想知道某种安全措施是否足够时,问题是:它应该保护什么威胁?或者,从攻击者的角度来看:它不能防止什么?

版本 4 GUID 是大约 120 位的随机性。假设他们的代码使用 CSPRNG 来生成这些 GUID,这是完全不可预测的。在没有任何其他知识的情况下,攻击者永远无法猜到这个令牌。您必须找到其他一些漏洞(从而获得对现有令牌的访问权限)才能冒充某人。

这是否意味着这是完全安全的?这是最好的系统吗?不,事实并非如此。

正如您所提到的,令牌是长期存在的。如果令牌在任何时间点被攻击者获得,则攻击者将拥有无限的访问权限,直到检测到攻击者并撤销令牌(从有效令牌的数据库中删除)。这已经比 JWT 之类的系统要好,后者的令牌不能被撤销,并且必须使用一些短期访问令牌和长期刷新令牌的混合系统。但是在这里也使用寿命较短的令牌呢?这些很好,但你必须考虑:一旦旧令牌过期,合法用户如何获得新令牌?不管答案是什么:攻击者可以做同样的事情吗?您将不得不要求一些攻击者无法做到的额外确认。典型示例是电子邮件确认或仅在用户浏览器中设置的 cookie。相似地,

为了防止对有效令牌表具有只读访问权限的任何人将其权限提升到有效用户的权限,可以使用散列。由于 GUID 本身(假设是)很强大,这可以像应用单轮 SHA-256 一样简单(不需要盐或胡椒)。如果攻击者现在对有效令牌表具有只读访问权限,则他们必须先破解 ~120 位令牌,然后才能获得可用于发出请求的 GUID。在可预见的未来,破解 120 位令牌是不可能的。

针对 TLS 失败,基本上是在现有 TLS 之上实现 TLS 的变体:如果 TLS 失败,但您仍然想要 TLS 的所有保证(不可重放性、完整性、机密性),那么您基本上是在重新发明 TLS。鉴于该系统的敏感性(您提到“API 允许提取密码”),深度防御可能是有道理的,但它确实感觉有点矫枉过正,有可能成为加密汤(可能会引入其他漏洞并给人一种错误的感觉)安全性)。

总之,我认为该系统不会立即出现问题。可以应用一些强化(对数据库中的令牌进行哈希处理,两因素身份验证),但这听起来对我来说本质上并不容易受到攻击。API 访问的秘密令牌是常见的做法。要获得对经过身份验证的 API 调用的未经授权的访问,似乎必须首先找到并利用其他漏洞。