【问题标题】:How to turn off Named Pipe security?如何关闭命名管道安全性?
【发布时间】:2016-01-18 16:20:48
【问题描述】:

我正在尝试在两个 Windows 进程之间创建命名管道。服务器进程在 UI 会话中以普通帐户运行。客户端进程在未知的安全上下文中运行,显然是相当受限的。

一开始我打了电话

pipe = CreateNamedPipeA(MY_PIPE_NAME, PIPE_ACCESS_DUPLEX,
        PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE, maxClients,
                     pipeChunkSize, pipeChunkSize, 0, nullptr); 

即留下通行证号SECURITY_ATTRIBUTES。通常,这是可行的——没有安全意味着没有安全。显然,命名点不再是这种情况。调用者尝试了

CreateFileA(MY_PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

并返回GetLastError=5,访问被拒绝。测试表明这是由于安全故障造成的;如果客户端可执行文件是在与服务器相同的 UI 会话中从测试环境运行的,则完全相同的行将成功。

合理的解决方案是将用于CreateNamedPipeASECURITY_ATTRIBUTES 中的DACL 设置为SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS (S-1-1-0)。这并没有解决问题。

“每个人都可以做任何事情”剩下的唯一安全降级是“没有任何安全性”。我必须在CreateNamedPipe 中做什么才能使CreateFileA 永远 失败并显示拒绝访问?

这里的安全性是无关紧要的。 PIPE_TYPE_MESSAGEpipeChunkSize 已经意味着服务器可以安全地防止流氓客户端的缓冲区溢出。

【问题讨论】:

    标签: security winapi named-pipes dacl


    【解决方案1】:

    当我希望任何人都可以访问管道时(例如,它托管在服务中并且我无法预测哪个帐户需要它),我添加了一个 NULL-DACL SD:

    static SECURITY_ATTRIBUTES g_sa = {0};
    
    g_sa.nLength = sizeof(g_sa);
    g_hsa = GlobalAlloc (GHND,SECURITY_DESCRIPTOR_MIN_LENGTH);
    g_sa.lpSecurityDescriptor = GlobalLock(g_hsa);
    g_sa.bInheritHandle = TRUE;
    
    if (InitializeSecurityDescriptor (g_sa.lpSecurityDescriptor, 1))
    {
       if (SetSecurityDescriptorDacl (g_sa.lpSecurityDescriptor, TRUE,NULL,FALSE))
       {
          DebugMessage ("security descriptor DACL set OK\n");
    

    其中 &g_sa 作为 CreateNamedPipe 的参数添加。诚然,这是一个让人大开眼界的领域,但如果您希望 任何人 都能够访问它,那么您别无选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多