2012-02-06 36 views
4

我有一个.NET application和一个.NET Windows Service。我如何在这两者之间建立一个安全通信通道如何安全地与我自己的Windows服务沟通

因特网上的大多数人推荐使用Named Pipes与Windows服务进行通信。但似乎这可能会在系统中造成一个巨大的安全漏洞。如果一些老兄反向工程师对我的应用程序进行反向工程,他会知道管道名称和我使用的协议,并允许他连接到我的服务并做他想做的任何事情。

示例:我的客户端安装我的应用程序,并为其提供完整的权限来安装该服务。然后他下载一些其他软件,并且不会给赋予它全部特权。但该软件找到我的服务并利用它,使用管道名称和反向工程协议。

那么如何设计一个安全的通信通道呢?该服务能否以某种方式访问​​刚刚连接到它的管道的程序(以便我可以比较它的哈希,假设服务已安装到安全位置)?或者也许使用不同的IPC?微软如何确保自己的服务免受此安全漏洞的侵害?

+0

命名管道支持安全性,我记得,因为我必须禁用它:p – leppie 2012-02-06 13:49:50

+0

为什么首先挖那个洞?如果您的应用程序需要特权,请再次询问用户!如果他不给你,请考虑回退或中止。 – ordag 2012-02-06 13:53:07

+1

@ordag:因为每次Windows启动时都需要权限。我不希望我的整个应用程序运行提升,因为这可能会导致其他安全问题。 – Paya 2012-02-06 13:56:31

回答

7

您只需要为您的命名管道设置安全描述符,以便只有您的客户端代码才能访问它。

详情请看这里:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa365600%28v=vs.85%29.aspx

+0

+1谢谢,看起来很有希望。你有没有(在任何情况下)一个你将客户端限制到某个特定过程的例子? – Paya 2012-02-06 14:01:02

+0

目前不是。自从我编写这个代码以来已经有一段时间了。 :) – jeffsix 2012-02-06 14:04:20

+0

嗯,我发现[这](http://stackoverflow.com/questions/3282365/opening-a-named-pipe-in​​-low-integrity-level-windows-7-c),但它仍然远离我所需要的。 – Paya 2012-02-07 02:24:34

0

我会看看有例如加密协议RSA加密算法。不管你使用什么传输协议(管道,TCP/IP,消息等)。他们中的任何一个都可以以某种方式“阅读”。 在你的情况下,我会使用一些网络协议(TCP/IP,UDP)在将来有免费的可扩展性功能。客户端和服务器端可以以这种方式位于不同的PC /平台上。但很多事情取决于需求。为什么你确实需要保护这些东西,应该保护哪些数据(可能是更容易的方法来检索其他人存在的),数据量,其他?