我可以为那些知道互斥锁密码的进程全局创建一个Windows互斥锁吗?

Can I create a Windows mutex globally for those processes which know the password of the mutex?

本文关键字:一个 创建 Windows 进程 那些 密码 我可以 全局      更新时间:2023-10-16

我想通过使用WinAPI, CreateMutex()OpenMutex()创建一个Windows互斥锁。但出于安全考虑,我希望互斥锁由那些知道"密码"或硬编码魔法码的进程打开。我不希望每个进程都访问互斥锁

例如,

创建名为"Globelcd689f00-0462-11e5-b939-0800200c9a66"的互斥锁。所以只有知道互斥锁名称的进程才能访问这个互斥锁。但这不是一个好的解决方案,因为您可以简单地使用Winobj.exe,您仍然有机会找到这个互斥锁。我希望这个互斥被保护的东西像ACL(访问控制列表)。问题是,我找不到为ACL创建自己的SID的方法。

以下是我所知道的和我想要的:1. 我知道我可以通过将其命名为"GlobalMyMutexName"来使互斥锁被许多进程访问。2. 我也试着理解MSDN上提到的ACL和SID。但是我仍然找不到一种方法来创建自己的SID(也许这没有意义?)3.我不想把我的进程提升到Admin.

你试图做的事情与Windows使用的安全模型不符。权限的授予总是基于运行可执行文件的人,而不是可执行文件本身。但是,根据您的场景,可能会有合适的选项。

如果所有涉及的进程都在同一个用户的上下文中,那么你可以使用IPC(例如,命名管道)来识别你的"友好"进程,并使用DuplicateHandle()来传递一个句柄给进程之间的未命名互斥锁。

如果进程必须在不同的用户上下文中,一种选择是让系统服务在特权上下文中运行以充当代理。当然,这需要以管理员权限安装系统服务,但这通常是可以接受的;这只需要做一次。

如果应用程序必须是可移植的(没有安装,或者能够在没有管理员访问的情况下安装),并且必须跨越用户边界,那么我认为您必须使用IPC来实现自己的互斥锁。当然,那将是非常低效的。

请记住,在任何这些情况下,恶意用户仍然可以访问互斥锁——您能做的最好的事情就是稍微增加一些难度。例如,如果使用实际的互斥锁,攻击者可以枚举其中一个进程的句柄,识别互斥锁,并复制该句柄。(或者简单地将恶意代码注入到所谓的"友好"进程中,以直接使用句柄。)甚至IPC也可能被监视和复制。

您应该认真考虑边际安全效益是否值得复杂度的显著增加。在我看来,不太可能。

(顺便说一下,正确的解决方案是让系统服务完成所有需要访问互斥锁的工作;用户运行的应用程序通常是一个瘦客户机,除了提供GUI之外什么都不做。

让Windows创建一个新的SID;不要试图自己创造一个。有了这个SID,您就可以构建一个ACL(访问控制列表),它授予对持有该SID的所有进程的访问权,并(隐式地)拒绝其他所有进程的访问权。然后可以将此ACL应用于互斥锁,以保护互斥锁。

现在要获得访问权限,您需要为该SID创建一个模拟令牌。如果我理解MSDN,这个过程是打开你的线程令牌,通过SetTokenInformation设置TokenUser,然后通过SetThreadToken应用修改的令牌。

这个模拟令牌现在在检查互斥锁的ACL时使用。

MSDN不完全清楚创建一个有效的用户SID的过程;在上述过程中,可能需要将"User SID"替换为"Group SID"。

相关文章: