在创建新的 WCF 服务端点以提高我们的 Web 服务安全性时,我开始研究如何防止重放攻击。乍一看,这很容易,WCF 有一个“DetectReplays”标志,您可以打开它,一切都已排序。然而,即使是对所使用的机制(在内存中的 nonce 缓存和重复拒绝中)的简要了解,也表明这不是一个真实世界的实现。坦率地说,他们完全实施它是令人困惑的。任何在此级别上对安全性有足够困扰的人都将在他们的网络农场中运行多个服务器,因此这种机制将允许 N 次攻击,其中 N 是您拥有的服务器数量。因此,您必须应对流量激增并可能使服务器不堪重负的任何扩展都无效。更不用说重复创建调用会导致的混乱。
我们可以打开粘性会话......但我们不要这样做,因为这是一组完全不同的问题。
进一步调查表明,微软自己承认这个问题: https ://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/preventing-replay-attacks-when-a-wcf-service-is- Hosted-in-a-web-farm 即使按照微软的标准,这也很简洁,而且相当无用。他们承认问题,指出存在解决方案,然后仅提供有关如何实施它的最基本提示。
谷歌搜索显示,没有人写过任何关于如何使用它的文章。搜索他们的源代码表明,他们在内部使用这种机制和内存实现来提供默认功能。它在 SecurityProtocolFactory 中使用它,如果没有提供任何内容,则将 NonceCache 设置为内存版本。但是如何在 WCF 中设置和使用 SecurityProtocolFactory?
我知道很多人会有这样的反应,我不应该担心重放攻击,因为传输安全会处理这个问题。然而,这不再是事实。令人惊讶的是,1.3 版本的 TLS 的一些优化似乎已经悄悄地删除了这个功能。请参阅https://blog.cloudflare.com/introducing-0-rtt/
所以问题是:
- 我是不是想多了,真的有问题吗?
- 有没有人真正让微软实施工作?如果是这样,怎么办!?
- 其他人都在做什么?是不是每个人都忽略了这个问题,不知道 TLS 1.3 的问题?
我尝试在 localclientsecurity 设置上设置 NonceCache 变量,但没有影响。
var sbe = (SymmetricSecurityBindingElement) bec.Find<SecurityBindingElement>();
if (sbe != null)
{
// Get the LocalSecuritySettings from the binding element.
LocalClientSecuritySettings lc = sbe.LocalClientSettings;
lc.DetectReplays = true;
lc.NonceCache = new MyNonceCache();
}