从低完整性进程获取对MemoryMappedFile的访问权限

时间:2016-01-19 21:48:45

标签: c# windows security ipc

我尝试在中等完整性进程上创建MemoryMappedFile,然后在低完整性子进程上打开相同的文件,并将此共享内存用于IPC。没有真正的磁盘文件(使用MemoryMappedFile.CreateNew)。

我的问题是低完整性进程无法打开共享内存,抛出这个:" System.UnauthorizedAccessException:拒绝访问路径。"。鉴于我希望从低完整性流程进行写访问,但我是如何授予它访问权限的,我并不感到惊讶,因为这是这种情况?

这是我的代码:

中等诚信过程:

MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
var file = MemoryMappedFile.CreateNew("test", 4096, MemoryMappedFileAccess.ReadWrite, MemoryMappedFileOptions.None, security, HandleInheritability.Inheritable);

var view = file.CreateViewAccessor();
view.Write(0, true);

低完整性过程:

try
{
    MemoryMappedFile file = MemoryMappedFile.OpenExisting("test", MemoryMappedFileRights.ReadWrite);
    var view = file.CreateViewAccessor();
    var v = view.ReadBoolean(0);
    Log.Info("MAPPED: " + v);
}
catch (Exception e)
{
    Log.Info("Error: " + e);
}

如果两个进程都以中等完整性工作,则工作正常。在阅读this之后,我尝试在中等完整性过程中设置SDDL字符串,如下所示:

security.SetSecurityDescriptorSddlForm("S:(ML;;NW;;;LW)");

但是这给了我另一个例外,这次创建了内存映射文件:" System.IO.IOException:客户端不保留所需的权限。"。不管怎么说,确实这是正确的方法,我还不清楚Win32 / C ++示例如何转换为C#...

任何人都对此有更多了解吗?

1 个答案:

答案 0 :(得分:1)

好的,得到了​​一个有效的解决方案。有两个问题:

  1. 将一个空的MemoryMappedFileSecurity对象传递给MemoryMappedFile.CreateNew()使得映射的内存即使在同一进程中也无法访问。这解释了我在评论中的错误(“System.UnauthorizedAccessException:拒绝访问路径”)。

  2. 我实际上无法让security.SetSecurityDescriptorSddlForm工作(即使谷歌在此展示了其他一些尝试,但它们都没有为我工作)。相反,我使用了这个解决方案:https://stackoverflow.com/a/14424623/5105846。据我所知,它做了同样的事情,但改为使用PInvoke。所以我刚刚调用了InterProcessSecurity.SetLowIntegrityLevel(file.SafeMemoryMappedFileHandle),它使它可以从低完整性子进程访问。成功了!

  3. 不是完美的解决方案,但我现在需要的是一个有效的解决方案。谢谢Harry的帮助!