2014-01-17 97 views
2

我正在尋找一種可能性,在Windows平臺上創建共享內存塊,對除創建共享內存塊的進程之外的所有進程進行寫保護。窗口 - 受保護的共享內存

詳細我需要:

方法(1)具有創建共享存儲器塊和應能夠修改緩衝區。 進程(2)應該能夠打開並讀取創建的共享內存塊,但不能修改內容。由於安全/安全原因,這很重要。

目前我有一個解決方案創建使用的CreateFileMapping(共享存儲器塊)連同MapViewOfFile(),然後已經讀取和寫入過程的許可(1)和(2),如:

HANDLE handle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, highSize, lowSize, L"uniquename"); 
void* sharedMemory = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
// now we can modify sharedMemory... 

這兩個可以在兩個進程中應用代碼行,因爲第一個進程創建共享內存塊,第二個進程只是打開共享內存。 但是,由於在創建內存塊期間提供的訪問值(PAGE_READWRITE和FILE_MAP_ALL_ACCESS),顯然第二個進程將具有寫權限。

我需要通過使用訪問值PAGE_READONLY和FILE_MAP_READ來創建進程(1)中的共享內存塊,但顯然比我不允許在進程(1)中初始化/設置/修改內存塊比一個無用的內存緩衝區。

據我所知,安全屬性的定義不能解決問題,因爲我的問題不依賴於用戶或組。 (1)依靠在創建共享內存塊之前已知的內存內容(並且在進程(1)中將不會修改該共享內存塊),我甚至會對創建共享內存塊的靈感感到滿意。之後)。

非常感謝您的任何提示或意見。

回答

2

您相信流程#2使用FILE_MAP_READ?這將防止意外覆蓋從例如破壞共享內存的野指針。

如果您試圖防範惡意覆蓋,那麼您需要使用操作系統提供的安全主體並在具有較低憑據的不同會話中運行進程#2。如果進程#2在與進程#1相同的安全憑證下運行,則它可以執行#1可執行的任何操作進程(例如,通過將代碼注入進程#1)。在Windows中,用戶是安全主體,進程不是用戶,例如,用戶不是唯一級別的限制,例如,Vista中的用戶訪問控制和後來創建的對應於具有和不具有管理員組成員資格的管理用戶的令牌)

由於您說進程#1不需要連續寫訪問,所以只能有一次,您可以創建映射,映射它進行寫操作,然後使用SetSecurityInfo調整ACL,以便將來的訪問無法寫入。

另一種可能性是改爲映射磁盤文件,並用第一個進程的FILE_SHARE_READ(但不是FILE_SHARE_WRITE)訪問來打開它。

但是,這些都不能阻止進程#2強制進程#1爲其進行更改。只有使用單獨的標記可以防止強制。

+1

以上基於SetSecurityInfo()的解決方案並未完全解決問題 - 此調用和部分/映射創建之間存在爭用條件 – Bukes

+0

@Bukes:SetSecurityInfo()解決方案無法解決問題* at所有*,作爲進程#2可以使用'WriteProcessMemory(PROCESS1_HANDLE,...)'來訪問共享部分。這些方法只能防止事故。對於強制性安全性,必須使用操作系統支持的主體(用戶和組成員資格)。 –

+0

@Ben我也想過使用磁盤文件的可能性,但我想找到一個避免訪問磁盤的解決方案... – user3208346

1

你不解釋爲什麼你不能在每種情況下提供不同的參數,所以我打算假設你不知道哪個進程是創建者,直到你打開文件。在這種情況下,你可能會想嘗試:

HANDLE h = OpenFileMapping(FILE_MAP_READ, /*args*/); 
if (h) { 
    v = MapViewOfFile(h, FILE_MAP_READ, 0, 0, 0); 
} else { 
    h = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, highSize, lowSize, L"uniquename"); 
    if (!h) 
     FirePhotonTorpedoes(); 
    v = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
} 
+0

我可以提供不同的參數,因爲我知道我是否是流程#1或流程#2。 但是我想確保沒有其他壞人可以通過進程#3破解我的實現,這個進程只是用'PAGE_READWRITE'打開我創建的共享內存塊,並修改共享內存塊的內容。 – user3208346

+0

@ user3208346:作爲計算機的所有者,我想確保沒有進程可以拒絕我寫入自己的內存的能力。我爲此付出了代價,苟延殘喘!該解決方案取決於用戶憑證。不要讓流程#3以您擁有的相同權限運行。 –

+0

@Ben謝謝你的回覆。你是絕對正確的 - 但我認爲這是一個獨特的解決方案,它本身與Windows API(因爲我認爲我的問題應該是一個非常普遍的問題)本來會更好;) - 如果使用我的應用程序的人不能,我會很高興發現利用我的代碼的可能性......(這些人以相同的權利運行我的應用程序和他們的應用程序) – user3208346

0

CreateFileMapping功能允許您設置的文件映射對象的ACL。如果您創建一個只允許只讀訪問的ACL,則其他進程應該無法打開具有讀寫訪問權限的文件映射對象。

通常,創建對象時,您分配的權限不適用於您在創建過程中獲得的句柄。不過,我並沒有特別用CreateFileMapping進行測試。

這隻能提供弱保護。惡意進程可能會更改文件映射對象的權限,或者將代碼注入創建該對象的進程中。