特权提升 导致授予攻击者授权权限,超出最初授予的权限。 例如,具有“只读”权限集的攻击者以某种方式将集提升为包含“读取和写入”的权限集。
受信任的 STS 应该为 SAML 令牌声明签名
安全断言标记语言(SAML)令牌是一种通用的 XML 令牌,是颁发令牌的默认类型。 SAML 令牌可由最终 Web 服务在典型交换中信任的安全令牌服务(STS)构造。 SAML 令牌包含语句中的声明。 攻击者可能从有效的令牌复制声明,创建新的 SAML 令牌,并使用其他颁发者对其进行签名。 目的是确定服务器是否正在验证发行者的身份,如果不是,则利用漏洞以便构造 SAML 令牌,使其允许的特权超出了受信任 STS 设定的权限。
SamlAssertion 类验证 SAML 令牌中包含的数字签名,默认 SamlSecurityTokenAuthenticator 要求由 CertificateValidationMode 类的 IssuedTokenServiceCredential 设置为 ChainTrust 时有效的 X.509 证书为 SAML 令牌签名。
ChainTrust
仅模式就不足以确定 SAML 令牌的颁发者是否受信任。 需要更精细信任模型的服务可以通过使用授权和执行策略来检查由已发行令牌认证产生的声明集的颁发者,或使用IssuedTokenServiceCredential上的X.509验证设置来限制允许的签名证书集。 有关详细信息,请参阅使用标识模型管理声明和授权和联合令牌与颁发的令牌。
在没有安全上下文的情况下切换标识
以下内容仅适用于 WinFX。
在客户端和服务器之间建立连接时,客户端的标识不会更改,除非在以下一种情况下:打开 WCF 客户端后,如果以下所有条件均为 true:
停止建立安全性上下文(使用传输安全会话或消息安全会话)的过程(如果在传输安全性情况下使用无法建立安全会话的消息安全或传输,则将 EstablishSecurityContext 属性设置为
false
。HTTPS 就是此类传输的一个示例)。你正在使用 Windows 身份验证。
未显式设置凭据。
正在模拟安全上下文下调用服务。
如果这些条件为真,那么在打开 WCF 客户端后,用于向服务对客户端进行身份验证的标识可能会发生变化(即可能由模拟标识变为进程标识)。 之所以发生这种情况,是因为用于对客户端进行身份验证的 Windows 凭据随每条消息一起传输,并且用于身份验证的凭据是从当前线程的 Windows 标识获取的。 如果当前线程的 Windows 标识发生更改(例如,通过模拟其他调用方),附加到消息并用于向服务验证客户端的凭据也可能会更改。
如果要在将 Windows 身份验证与用户冒充结合使用时获得确定行为,则需要明确设置 Windows 凭据,或者需要与服务建立安全上下文。 为此,请使用消息安全会话或传输安全会话。 例如,net.tcp 传输可以提供传输安全会话。 此外,调用服务时,必须仅使用客户端操作的同步版本。 如果建立消息安全上下文,则与服务的连接的打开时间不应长于所配置的会话续订期限,因为在会话续订过程中标识也可能更改。
凭据捕获
以下内容适用于 .NET Framework 3.5 和后续版本。
客户端或服务使用的凭据基于当前上下文线程。 客户端或服务的Open
方法(或BeginOpen
,用于异步调用)被调用时,会获取凭据。 对于ServiceHost类和ClientBase<TChannel>类,Open
和BeginOpen
方法继承自Open类的BeginOpen和CommunicationObject方法。
注释
使用 BeginOpen
该方法时,无法保证捕获的凭据是调用该方法的进程凭据。
令牌缓存允许使用过时数据的重放
WCF 使用本地安全机构 (LSA) LogonUser
函数通过用户名和密码对用户进行身份验证。 由于登录函数是一项代价高昂的作,因此 WCF 允许缓存表示经过身份验证的用户的令牌以提高性能。 缓存机制将LogonUser
的结果保存,以供后续使用。 默认情况下禁用此机制;若要启用它,请将CacheLogonTokens属性true
设置为 ,或使用 cacheLogonTokens
userNameAuthentication< 的属性>。
可以通过将 CachedLogonTokenLifetime 属性设置为元素 TimeSpan的属性来设置缓存令牌的生存时间(TTL),或使用 cachedLogonTokenLifetime
元素的属性 userNameAuthentication
;默认值为 15 分钟。 请注意,缓存令牌时,提供相同用户名和密码的任何客户端都可以使用该令牌,即使用户帐户从 Windows 中删除,或者其密码已更改也是如此。 在 TTL 过期并且令牌从缓存中删除之前,WCF 允许(可能恶意)用户进行身份验证。
若要缓解此问题:通过将 cachedLogonTokenLifetime
的值设置为用户所需的最短时间范围来减少攻击窗口。
已颁发令牌的授权:将到期时间重置为较大的值
在某些情况下,ExpirationTime 的 AuthorizationContext 属性可能会设置为意外地更大的值(即 MaxValue 字段值减去一天,或者是9999年12月20日)。
使用将已颁发的令牌作为客户端凭据类型的 WSFederationHttpBinding 和系统提供的任一绑定时,会出现此情况。
使用下列方法之一创建自定义绑定时也会发生这种情况:
若要缓解此问题,授权策略必须检查每个授权策略的操作和到期时间。
服务使用与客户端预期的证书不同的证书
在某些情况下,客户端可以使用 X.509 证书对消息进行数字签名,并让服务检索与预期证书不同的证书。
这种情况可能发生在以下情况下:
客户端使用 X.509 证书对消息进行数字签名,并且不会将 X.509 证书附加到消息,而只是使用其使用者密钥标识符引用证书。
该服务的计算机包含两个或多个具有相同公钥的证书,但它们包含不同的信息。
该服务检索与使用者密钥标识符匹配的证书,但它不是客户端打算使用的证书。 当 WCF 收到消息并验证签名时,WCF 会将出乎预料的 X.509 证书中的信息映射到一组声明,这些声明与客户端预期的不同,并可能具有更高的权限。
若要缓解此问题,请以另一种方式引用 X.509 证书,例如使用 IssuerSerial。