9

只要 SAML 联合软件在允许的 SAML 令牌生命周期内,它是否应该接受相同的 SAML 响应?

简单来说: IDP(标识提供者)发出 SAML 响应,然后 SP(服务提供者)接受/处理它。是否可以在第一次使用后立即重新使用相同的未修改 SAML 响应?鉴于 SAML 发布时间戳在允许的范围内。

在安全方面,将 SAML 令牌(响应)限制为仅一次使用是有意义的,这样即使它被“中间人”窃取 - 它也不能被重用。但为了实现这一点,软件需要在某处存储一些关于 SAML 响应的信息:序列号,整个事物的哈希?

请提供一些链接,其中包含可能的解释和/或实施示例。

谢谢!亚历克斯。

4

2 回答 2

10

SAML 2.0 规范提供了另一种方法来防止重放攻击,这种攻击并不意味着在数据库中存储断言的 ID。

  • SP 发送一个 ID="X" 的请求并将这个 ID 存储在会话中。
  • IDP 对用户进行身份验证并返回一个带有 ID="Y" 和 InResponseTo="X" 的响应(通常也出现在 SubjectConfirmationData 的断言中)。
  • SP 获取响应并检查所有 InResponseTo 值是否与会话中的值匹配。如果不是,SP 拒绝响应。
  • SP 清除会话中的 ID,因此无法重播 Response。在理想情况下,SP 应在收到响应后立即清除会话中的 ID。

此检查确实使重放攻击复杂化,因为攻击者还需要拥有 SP 的会话 cookie(即使在这种情况下,无论如何它已经结束了......)。签署整个回复也是一个好习惯。

显然这种方法只在 SP 发起的场景中有效。

于 2014-03-26T20:06:35.283 回答
6

安全方面有意义吗?当然。事实上,您可以使用断言的“xs:ID”部分来帮助您(我公司的软件可以)。

核心的第 9 页:

xs:ID 简单类型用于声明断言、请求和响应的 SAML 标识符。在本规范中声明为 xs:ID 类型的值除了 xs:ID 类型本身的定义强加的属性外,还必须满足以下属性:

• 分配标识符的任何一方必须确保该方或任何其他方意外地将相同标识符分配给不同数据对象的可能性可以忽略不计。

• 当一个数据对象声明它有一个特定的标识符时,必须有一个这样的声明。

我们从断言中获取该 ID,并将其放入具有 not-after 时间的数组中,然后在该时间到期后将其丢弃。这样就不能重播相同的断言。

在其他软件(尤其是本土软件)中,这完全由观众限制的 Not-Before 和 Not-On-Or-After 部分管理。由于某些软件仅依靠这些值,因此建议的方法是将此时间段设置为尽可能短。在完美的世界中,每个人都在使用时间服务器,他们的时钟偏差不会超过几秒钟。发布前一分钟和发布后一分钟应该绰绰有余。虽然这里没有那么多“安全性”,但可以“管理”它。

于 2014-03-15T12:47:36.693 回答