2015-02-05 44 views
1

我知道這個問題可能看起來有些模糊,但我會盡可能清楚地解釋。動態鏈接〜限制DLL的系統訪問

在C++中有一種將代碼動態鏈接到已經運行的程序的方法。我正在考慮創建我自己的插件系統(用於學習/研究目的),但我想將插件限制爲特定的系統訪問權限以用於安全目的。

我想給插件有限的訪問權限,例如磁盤寫入,以便它只能從API調用函數我從我的應用程序傳遞(並通過我的預定義接口寫入)是否有強制執行此類行爲的方法從應用程序方面?

如果不是:是否有支持安全動態鏈接模塊的其他語言?

+0

如果你的目標操作系統是linux,這個線程可能是有趣的:http://stackoverflow.com/questions/4414605/how-can-linux-ptrace-be-unsafe-or-contain-a-race-condition – 2015-02-10 21:58:34

回答

0

要阻止某些呼叫,第一個想法可能是掛鉤禁止的系統調用和其他您不需要的API調用。您還可以掛鉤動態鏈接調用,以防止您的插件加載另一個DLL。鉤磁盤讀/寫API來阻止讀/寫。

看看this,它可能會讓你知道如何禁止函數調用。

您還可以嘗試對沙箱進行沙箱,嘗試查看一些開源沙箱並瞭解它們的工作方式。它應該幫助你。

3

您應該考慮編寫插件容器(或沙盒),然後通過容器協調所有內容,並確保在運行插件之前刪除容器過程中不需要的特權。在流程中運行意味着,您可以將容器作爲唯一用戶運行,而不是啓動流程的用戶,之後您可以限制用戶並自動限制流程。擁有一個進程的專用用戶是最常見和最簡單的方式,它也是限制進程的唯一跨平臺方式,即使在Windows上,您也可以使用此方法來限制進程。

限制對操作系統提供的共享資源(如磁盤,RAM或CPU)的訪問很大程度上取決於操作系統,並且您沒有指定操作系統。儘管在大多數操作系統上都可行,但Linux是首要選擇,因爲它考慮了多席位和服務器使用案例。例如,在Linux中,您可以使用cgroupshere來輕鬆限制每個進程的CPU或RAM,然後您只需將其應用於您的插件容器進程。有blkio來控制磁盤訪問,但是您仍然可以在Linux中使用傳統的quote機制來限制每個進程或每個用戶共享磁盤空間。

支持插件是一個涉及的過程,最好的開始方式是閱讀代碼,其中有一些是我可以推薦的,Chromium sand-boxing是最好的地方,它寫得很乾淨,並且有很好的文檔。幸運的是code不是很大。

如果您不願意參與實際的cgroup,那麼更容易限制資源的機制,docker是相當新的,但是抽象出低級別的OS構造以輕鬆包含應用程序,而無需在虛擬機中運行它們。

0

在這種情況下,你真的必須沙箱環境中的DLL運行。建造這樣一個沙箱並不容易,而且這是你可能根本不想做的事情。系統調用可以隱藏在字符串中,或​​者在執行時通過元編程生成,所以很難通過分析二進制來檢測。幸運的是人們已經建立了解決方案。例如谷歌的項目native client,目標是通常允許C++代碼在瀏覽器中安全運行。並且,當瀏覽器足夠安全時,它可能對您而言足夠安全,並且可能工作outside of the browser