2010-12-17 36 views
2

我有一个使用共享内存,并与信号具有相同程序的其他实例通信保护它的程序与其他程序发生冲突。我担心我的共享内存和信号量的安全性。怎样避免使用共享内存和信号灯

  1. 我该如何确保我使用的信号量和shm不会被其他程序打开,否则会将其搞乱?有一种方法可以在单独的用户下使用自己的用户组来运行该程序,并且保护共享对象并将其限制为只能由该用户和组访问。这是我的问题的答案,还是有一些陷阱,可能在Windows上?

  2. 如果我必须在同一用户下运行所有​​程序,或者某些程序以root身份运行(总是存在这样的程序,是不是他们),有什么方法可以保护它们吗?

  3. 我开始为所有希望一起通信的实例设置shm &信号量的默认“密钥”。但可能有不同的计划已经采取了'关键'。有没有一些技术来解决这个问题?我正在考虑选择一系列“键”(例如,键将是1000到2000范围内的整数),如果程序无法获取默认值的键,它会尝试从范围中获取其他键。

我发现相关的问题here,但它并没有说我的问题2和3,除了这个问题,我无法找到与SHM和信号冲突,保护什么东西,好像是不在编写程序时要特别考虑。

我的情况是我有一个程序想要与同一程序的其他实例进行通信。同一个程序的实例有多个“集合”,一个“集合”的程序一起通信,另一个集合的程序一起通信。他们通过信号量保护的共享内存进行通信。程序在各种* nix平台和Windows上运行。他们应该24/7全天候运行并且应该是可靠和安全的,这就是我关心冲突的原因。

回答

1

的信号灯“保护”只有当所有的程序使用它的合作,共享内存。即它允许想玩的程序不会破坏共享对象。

但是,这并不能保证恶意程序能够跳入并破坏共享结构,如果它想的话。我不知道C++标准中的任何安全相关功能,因此我会建议采用特定于操作系统的方式。

这意味着你可能需要在Linux,Windows,Mac等上有不同的代码(无论你的目标平台是哪个),甚至可能在不同的操作系统版本上有不同的代码。

+0

是的,因为使用共享内存和信号量的函数调用不同,因此我需要针对不同平台使用特定于操作系统的代码部分,因为它是必需的。 问题是 - 有什么技巧来保护内存/信号量不被意外访问的其他程序? – MiroJanosik 2010-12-17 10:06:39

+0

在Windows上,您应该查看[SECURITY_ATTRIBUTES](http://msdn.microsoft.com/zh-cn/library/aa379560%28VS.85%29.aspx)。此结构用于[CreateSemaphore](http://msdn.microsoft.com/en-us/library/ms682438%28VS.85%29.aspx)和[CreateFileMapping](http://msdn.microsoft.com/ en-us/library/aa366537%28VS.85%29.aspx)(用于[共享内存](http://msdn.microsoft.com/en-us/library/aa366551%28VS.85%29.aspx) ) – Vlad 2010-12-17 10:13:46

0

如果您主要关注的是有关冲突的,怎么样使用GUID的名字吗?没有人(在我们的生活中)会偶然想出这个{897917A3-D44E-4f0d-A458-1318152CCCDA}

至于反恶意软件保护,我会利用在操作系统的安全机制。要求服务在某个用户的范围内运行,然后将对外部对象(如信号灯和共享内存)的访问限制为仅限该用户。只要该用户的安全性没有被破坏,那么你的系统应该是安全的。

在Windows上,当你创建信号灯和文件映射,并mode_t(与creat/open/chmod /等)在Unix上你通常使用SECURITY_ATTRIBUTES结构。

不要使用安全方法,通过使名称“难以猜测”,并相信他们是秘密的。它只会有助于不干扰同一系统上的其他应用程序。它不会阻止恶意用户/代码,因为对象的名称可能不是秘密。

+0

谢谢。不幸的是,我不能使用GUID字符串作为* nix因为一些限制,我不得不使用shmget()和semget(),并且它们接受key_t(它是int)作为参数。 – MiroJanosik 2010-12-17 14:09:56

+0

啊......我忘记了Unix中的信号量。自2000年以来,我还没有和Unix一起工作过。为什么不让一个进程随机选择一个免费的信号量密钥,并将其存储在共享内存中。然后其他进程可以通过共享内存获取信号句柄。当然,在阅读信号量密钥时,你必须使用一些锁定机制来保护其他进程免受竞争条件的影响。 – 2010-12-17 19:25:25