如何关闭命名管道安全性?

时间:2016-01-18 16:20:49

标签: security winapi named-pipes dacl

我试图在两个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会话中的测试环境中运行,则完全相同的行将成功。

逻辑解决方案是在用于SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS的{​​{1}}中将DACL设置为SECURITY_ATTRIBUTES(S-1-1-0)。这并没有解决问题。

唯一的安全降级来自"每个人都可以做任何事情"将是"没有任何安全"。我需要在CreateNamedPipeA中执行哪些操作才能使CreateNamedPipe 从不因拒绝访问而失败?

安全性与此无关。 CreateFileAPIPE_TYPE_MESSAGE已经意味着服务器可以安全地防止恶意客户端的缓冲区溢出。

1 个答案:

答案 0 :(得分:2)

当我希望任何人都可以访问管道时(例如,它在服务中托管,我无法预测需要它的帐户),我添加了一个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的参数。当然,这是吹嘘门户的领域,但如果你想让任何人能够访问它,你就没有多少选择。