【问题标题】:How to lower integrity of WCF named pipe如何降低 WCF 命名管道的完整性
【发布时间】:2010-10-31 19:07:41
【问题描述】:

我有一个用 C# 编写的 Internet Explorer 加载项,它通过 WCF 命名管道与 .NET 桌面应用程序通信。桌面应用程序为 netNamedPipeBinding 创建 ServiceHost,并且 IE 加载项的每个实例都创建一个 ChannelFactory 来与应用程序通信。在 Windows XP 下一切正常,但在 Windows 7 中 IE 的保护模式下会抛出异常。

System.ServiceModel.CommunicationException:无法连接到端点“net.pipe://localhost/MyApp.MyID”。 ---> System.IO.PipeException:'\.\pipe...guid...' 存在管道端点,但连接失败:访问被拒绝。 (5, 0x5)

在保护模式下运行插件是我必须支持的方案。我的理解是,如果我降低命名管道的完整性级别,那么我的 IE 插件将被允许通过它进行对话。我的问题是如何做到这一点。我有使用 WCF 的设置,并且希望保持这种状态。我可以让 WCF 创建具有较低完整性级别的命名管道吗?我要编写什么代码来实现这一点?

【问题讨论】:

    标签: c# wcf named-pipes bho protected-mode


    【解决方案1】:

    我认为这是不可能的。

    问题是必须在创建命名管道时提供的安全描述符中指定完整性标签。在标准 NetNamedPipeBinding 中,对 CreateNamedPipe 的调用发生在内部 WCF 类 System.ServiceModel.Channels.PipeConnectionListener 的私有 CreatePipe() 方法内。我看不到改变它如何为管道指定初始安全描述符的方法。

    请参阅this question and answer,了解我们需要实现的目标。

    从头开始编写自定义命名管道传输绑定元素似乎是目前解决此问题的唯一方法,如果失败,我们将不得不等待 Microsoft 在未来版本的 WCF 中添加一些启用功能。如果您有权访问 Microsoft Connect,您可以add your voice to the others requesting this feature

    编辑: 我太悲观了。我现在找到了一种方法。

    关键是事实证明,当创建管道时,您不必在安全描述符中指定完整性标签 - 但您必须在打开侦听器时使用 CreateNamedPipe 返回的句柄修改 SACL - 即管道的第一个服务器端句柄。使用任何其他句柄,添加完整性标签的尝试总是失败,因为CreateNamedPipedwOpenMode 标志参数重载了位之一的使用以表示FILE_FLAG_FIRST_PIPE_INSTANCEWRITE_OWNER。我们需要后者的访问权限才能添加完整性标签,但前者的存在会导致调用在除第一个管道实例之外的任何实例上失败。

    掌握第一个管道句柄并非易事。 WCF 将其存储在System.ServiceModel.Channels.PipeConnectionListener.PendingAccept 类型的实例中,存储在由管道连接侦听器维护的列表中。连接侦听器与通道侦听器不同(可以通过覆盖绑定元素的BuildChannelListener<> 方法直接获取),而且更难理解。它涉及使用反射来定位端点的 TransportManager,它保存对端点连接侦听器的引用,然后沿着连接侦听器链(根据跟踪等的配置而变化)工作,直到找到管道连接侦听器.如果幸运的话,第一个管道句柄可以在侦听器的待处理接受列表中找到(尽管这里存在竞争条件 - 如果客户端在我们获得句柄之前连接,它将永远消失)。

    一旦句柄可用,降低完整性以允许低完整性客户端与服务通信只需在句柄上调用SetSecurityInfo 以添加完整性标签。

    我计划很快在my blog 上介绍一些细节。

    【讨论】:

    • 博客链接对我来说已经失效了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多