2010-12-17 59 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