Windows 命名管道访问控制

标签 windows ipc named-pipes nonblocking

我的进程(服务器)通过 CreateProcess 创建一个子进程(客户端)我正在这些进程之间进行 IPC。我从匿名管道开始,但很快我发现它不支持重叠操作,如 here 所述。 .

所以,命名管道是我的第二选择。我的困惑是:如果我创建了一个命名管道,是否可以将此管道的访问权限限制为我之前调用 CreateProcess 创建的子进程? ?因此,即使另一个进程获得了管道的名称,它仍然无法读取或写入管道。

我的 IPC 使用仅限于本地机器和单一平台 (Windows)。

顺便说一句,我可以更改这些进程的两个代码。

最佳答案

您可以使用 lpSecurityAttributes 将 ACL 显式分配给新管道。范围。这将允许您确保,如果另一个用户登录,他们无法连接到管道。

但是,如果您在父进程中创建管道的两端,则渎职的范围很小,因此通常不需要显式设置 ACL。一旦你打开了管道的客户端,任何其他进程都不能连接到管道(如果你希望他们这样做,你必须创建第二个实例)所以只有一个非常短暂的时间间隔,在此期间另一个进程可以干扰;即使发生这种情况,您也无法连接客户端,因此您会知道出了点问题。

换句话说,攻击的范围仅限于拒绝服务,并且由于攻击进程需要在同一台机器上运行,因此只需占用 CPU 就可以实现更有效的拒绝服务。

注意:

  • 您应该使用 FILE_FLAG_FIRST_PIPE_INSTANCE创建管道时标记,以确保您知道是否存在名称冲突。
  • 您还应该使用 PIPE_REJECT_REMOTE_CLIENTS出于显而易见的原因。
  • 命名管道上的默认权限不允许其他非管理用户创建新实例,因此在这种情况下,中间人攻击不存在风险。
  • 以同一用户或管理用户身份运行的恶意进程可能会在您的连接中间进行人为干预(无论您是否设置了 ACL),但因为任何此类恶意进程也可能将恶意代码直接注入(inject) parent 和/或 child 不必担心。攻击者已经在 the air-tight hatchway 的错误一边;锁 window 对你没有任何好处。
  • 如果您的进程以提升的权限运行,您可能应该在管道上设置 ACL。默认 ACL 可能会允许作为相同用户上下文运行的非提升进程来管理连接。您可以通过设置仅向管理员授予完全访问权限的 ACL 来解决此问题。风险仍然很小,但在这种特殊情况下,深度防御措施可能是合适的。
  • An anonymous pipe is implemented as a named pipe with a unique name ,因此您实际上并没有通过使用命名管道丢失任何东西。原则上,攻击者可以像中间人一样轻松地在匿名管道中使用命名管道。 (编辑:根据 RbMm,这不再是真的。)
  • 关于Windows 命名管道访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40844884/

    相关文章:

    windows - Windows 应用程序中嵌入的零部署 CouchDB?

    c - msgget() 和 ftok() 出错

    c++ - 有没有更好的方法来命名管道 `cv::mat` 变量

    windows - window server 中机器名的限制是什么?

    c# - 将数字 11 格式化为 00000011

    c# - .NET 应用程序如何重定向其自己的标准输入流?

    Android Couchdb - libcouch 和 IPC Aidl 服务

    windows - 是否可以在 Windows 中发现命名管道?

    Bash重定向: named pipes and EOF

    c - 在某些情况下,尝试从服务内修改注册表会失败?