如何关闭命名管道安全?
How to turn off Named Pipe security?
我正在尝试在两个 Windows 进程之间创建命名管道。服务器进程 运行s 在普通帐户下,在 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 会话中的测试环境,则完全相同的行会成功。
合乎逻辑的解决方案是在用于 CreateNamedPipeA
的 SECURITY_ATTRIBUTES
中将 DACL 设置为 SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS
(S-1-1-0)。这并没有解决问题。
"everybody can do everything" 留下的唯一安全降级是 "no security whatsoever"。我必须在 CreateNamedPipe
中做什么才能使 CreateFileA
永远不会 因访问被拒绝而失败?
安全性在这里无关紧要。 PIPE_TYPE_MESSAGE
和 pipeChunkSize
已经意味着服务器可以安全地防止流氓客户端的缓冲区溢出。
当我希望任何人都可以访问管道时(例如,它托管在服务中,我无法预测哪个帐户需要它),我会添加一个 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 的参数。当然,这是 blowing-the-bloody-doors-off 领域,但如果您希望 任何人 能够访问它,您没有太多选择。
我正在尝试在两个 Windows 进程之间创建命名管道。服务器进程 运行s 在普通帐户下,在 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 会话中的测试环境,则完全相同的行会成功。
合乎逻辑的解决方案是在用于 CreateNamedPipeA
的 SECURITY_ATTRIBUTES
中将 DACL 设置为 SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS
(S-1-1-0)。这并没有解决问题。
"everybody can do everything" 留下的唯一安全降级是 "no security whatsoever"。我必须在 CreateNamedPipe
中做什么才能使 CreateFileA
永远不会 因访问被拒绝而失败?
安全性在这里无关紧要。 PIPE_TYPE_MESSAGE
和 pipeChunkSize
已经意味着服务器可以安全地防止流氓客户端的缓冲区溢出。
当我希望任何人都可以访问管道时(例如,它托管在服务中,我无法预测哪个帐户需要它),我会添加一个 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 的参数。当然,这是 blowing-the-bloody-doors-off 领域,但如果您希望 任何人 能够访问它,您没有太多选择。