【发布时间】: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 会话中从测试环境运行的,则完全相同的行将成功。
合理的解决方案是将用于CreateNamedPipeA 的SECURITY_ATTRIBUTES 中的DACL 设置为SECURITY_WORLD_SID_AUTHORITY, KEY_ALL_ACCESS (S-1-1-0)。这并没有解决问题。
“每个人都可以做任何事情”剩下的唯一安全降级是“没有任何安全性”。我必须在CreateNamedPipe 中做什么才能使CreateFileA 永远 失败并显示拒绝访问?
这里的安全性是无关紧要的。 PIPE_TYPE_MESSAGE 和 pipeChunkSize 已经意味着服务器可以安全地防止流氓客户端的缓冲区溢出。
【问题讨论】:
标签: security winapi named-pipes dacl