我的程序使用共享内存并使用信号量保护它以与同一程序的其他实例进行通信。我担心共享内存和信号量的安全性。
如何确保我使用的信号量和shm不会被其他程序打开?有一种方法可以在具有自己的用户组的单独用户下运行程序,并保护共享对象,并限制它们只能由该用户和组访问。这是我的问题的答案,还是有一些陷阱,也许在Windows上?
如果我必须在同一个用户下运行所有程序,或者某些程序是以root身份运行(总有这样的程序,不是它们),是否有某种方法可以保护它们?
< / LI>我开始为shm&amp;设置默认的'key'所有想要一起通信的实例的信号量。但是可能有不同的程序已经采用了“关键”。有一些技术可以解决这个问题吗?我正在考虑选择一系列'键'(即键在1000 - 2000范围内是整数),如果程序无法获取默认值的键,它会尝试从该范围获取其他键。
< / LI> 醇>我找到了相关的问题here,但它没有说明我的问题2和3.除了那个问题我找不到任何与shm和信号量冲突和保护相关的内容,似乎不是在编写程序时要考虑很多。
我的情况是我有一个程序想要与同一程序的其他实例进行通信。运行同一程序的多个“集合”实例,其中一个“集合”的程序一起通信,而另一个“集合”的程序一起通信。它们通过信号量保护的共享内存进行通信。程序也可以在各种* nix平台和Windows上运行。它们应该全天候运行并运行几年,并且应该可靠和安全,这就是我担心冲突的原因。
答案 0 :(得分:1)
只有当使用它的所有程序都在协作时,信号量才会“保护”共享内存。即它允许想要很好地播放的程序不会破坏共享对象。
然而,这并不能保证恶意程序能够在需要时跳入并破坏共享结构。我不知道C ++标准中有任何与安全相关的功能,因此我建议采用特定于操作系统的方法。
这意味着您可能需要在Linux,Windows,Mac等上使用不同的代码(无论您的目标平台是哪个),甚至可能在不同的操作系统版本上使用不同的代码。
答案 1 :(得分:0)
如果您主要关心的是冲突,那么如何将GUID用作名称?没有人(在我们的一生中)会偶然提出这个{897917A3-D44E-4f0d-A458-1318152CCCDA}
。
至于防范恶意软件,我会利用操作系统中的安全机制。要求服务在某个用户的范围内运行,然后将对外部对象(如信号量和共享内存)的访问权限仅限于该用户。只要不破坏该用户的安全性,您的系统就应该是安全的。
在Windows上,您通常在创建信号量和文件映射时使用SECURITY_ATTRIBUTES
结构,而mode_t(使用creat
/ open
/ chmod
/ etc)在Unix上。
不要使用安全隐藏的方法,使名称“难以猜测”并相信它们是秘密的。它只会有助于不干扰同一系统上的其他应用程序。它不会阻止恶意用户/代码,因为对象的名称可能不是秘密。