在 Web 场环境中使用共享缓存来检测 WCF 中的重放攻击

Posted

技术标签:

【中文标题】在 Web 场环境中使用共享缓存来检测 WCF 中的重放攻击【英文标题】:Using a shared cache in a Web farm environment for detecting replay attacks in WCF 【发布时间】:2011-04-08 17:03:48 【问题描述】:

我正在尝试弄清楚如何在网络农场场景中使用 WCF 实现重放攻击检测机制。

WCF 通过使用 nonce 缓存来提供这种检测机制。如果我错了,请纠正我,但确保在消息安全和 Web 场场景中防止这种攻击的唯一方法是使用跨服务器共享的 nonce 缓存。

在 WSE3.0 中,曾经可以提供 nonce 缓存自定义实现

http://msdn.microsoft.com/en-us/library/ff647945.aspx

但是在 WCF 中似乎没有任何方法可以做到这一点(没有配置选项,除了我用 Reflector 发现 NonceCache 类被标记为密封和内部......)

有什么想法吗?

【问题讨论】:

对此感兴趣的人,我在这里得到了来自微软的人的答复social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/… 【参考方案1】:

首先,没有灵丹妙药。每个选项都有其缺点。微软推荐one of two options:

使用带有状态安全上下文令牌的消息模式安全性(启用或不启用安全对话) 将服务配置为使用传输级安全性

虽然使用传输级别的安全性保护您的服务可以免受中间人的攻击,但它不会保护您免受受损客户端的侵害。所以实际上它不是一个强大的解决方案,使用stateful security context tokens 是两者中更好的方法。这在开发和部署时确实需要考虑一些因素。

正如我在之前的回答中所说,对此没有灵丹妙药。这是另一个使用 detectReplays、maxClockSkew、replayWindow 和 replayCacheSize 设置的选项(您可能已经考虑过)。虽然我不确定它在 WebFarm 场景中的稳健性,但考虑到 WCF 的底层操作,它应该可以工作。这是一个简短的article that demonstrates it。此选项的缺点是,当您的客户端与服务器处于不同的时区时,如果您的 maxClockSkew 未设置为允许时区差异,则会出现故障。

【讨论】:

STS 令牌包含在信封中这一事实并不能阻止攻击者将消息重播到网络场中的不同服务器,是吗?【参考方案2】:

时光荏苒……10年后……

WCF 4.5 及更高版本,似乎有一个解决方案。他们增加了一个可扩展点。但几乎没有关于它的信息。官方文档在这里声明preventing-replay-attacks-when-a-wcf-service-is-hosted-in-a-web-farm

为了缓解这种情况,WCF 4.5 提供了一个扩展点,允许您通过从抽象类 NonceCache 派生一个类来实现自己的共享 NONCE 缓存

消耗这个NonceCache的类的源代码好像是here

我仍在考虑实现这一点,但由于互联网上完全没有这方面的信息,我想我会在这里做一个说明,以防我永远不会回来。

为什么这是一个未被充分利用的功能?任何认真到要在 WCF 中实施反重放攻击的人都将在负载均衡器后面拥有多个服务器。开箱即用的实现是行不通的,因为通常它会允许服务器的循环在拒绝开始之前接受 N 次重放攻击。作为副作用,这实际上会将服务器的数量泄露给攻击者。 我真的很困惑。每个人都在使用另一种防御措施吗?每个人都参加粘性会议吗[颤抖]?

【讨论】:

以上是关于在 Web 场环境中使用共享缓存来检测 WCF 中的重放攻击的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WCF 中多个环境的检测密钥配置 Application Insights?

在非共享点环境中部署 WCF 服务

使用来自 WCF 服务的数据创建自定义共享点日历​​ Web 部件

在 .net core 项目中按环境加载 WCF 服务

来自 WCF REST 服务的 Azure 缓存间歇性响应时间

在 WCF 中缓存?