2011-01-26 148 views
2

因此,我正在製作一個在線應用程序,用戶可以提交代碼並將輸出顯示給用戶。我已將安全設置爲重中之重,並已採取以下步驟確保代碼安全運行:在虛擬機中安全運行C++

  • 在虛擬機上運行代碼,在僅使用的VPS上運行這些虛擬機。這些虛擬機不允許任何網絡或文件訪問通過工作目錄。
  • 使用下面的G ++標誌:

    -O -std=c++98 -pedantic-errors -Wfatal-errors -Werror -Wall -Wextra -Wno-missing-field-initializers -Wwrite-strings -Wno-deprecated -Wno-unused -Wno-non-virtual-dtor -Wno-variadic-macros -fmessage-length=0 -ftemplate-depth-128 -fno-merge-constants -fno-nonansi-builtins -fno-gnu-keywords -fno-elide-constructors -fstrict-aliasing -fstack-protector-all -Winvalid-pch 
    

我的問題我想是真的我怎樣才能使這個任何更安全?你個人看到這種方法有什麼問題嗎?

+1

防止C++ 03真的沒有意義。 C++ 0x *也許*因爲它的標準庫包含線程,但C++ 03沒有任何問題。 – Puppy 2011-01-26 22:25:21

回答

9

編譯器標誌並不重要。帶有這些標誌的C++程序可以執行與使用任何其他標誌集編譯的C++程序相同的功能。特別是,有很多方法可以解決未定義的行爲,並且可能會利用操作系統中可能存在的任何安全漏洞。

您正在執行不可信的代碼,故事結束。您可以希望操作系統不會受到影響,代碼將無法獲得新的權限,甚至無法以root身份運行,否則會導致系統混亂。

你可以希望如果發生這種情況,它仍然會被包含在虛擬機中,並且不會影響主機。

但它仍然是不可信的代碼,它可以做任何不受信任的代碼可能做的事情。您可以做的最好的事情是確保它以最低的權限運行,並且操作系統和虛擬化軟件都是100%修補的。

當然,有了你提到的限制,我的第一個問題是,「有沒有什麼能阻止我用垃圾填充硬盤?」好的,所以我不能在工作目錄之外寫入,但我仍然可以使磁盤空間不足。還是有一個磁盤配額或任何強制執行?限制我使用的CPU時間量如何?我能否使用機器上的所有資源,使其無響應?

+0

+1爲好建議。 – 2011-01-26 22:32:03

+0

唯一正確的答案。令人驚訝的是,這個概念似乎在大量報告安全問題的人身上丟失。 [你可以運行代碼並不奇怪](http://blogs.msdn。com/b/oldnewthing/archive/2010/12/08/10101773.aspx);) – 2011-01-26 22:32:23

0

如果您正在使用Linux來運行代碼,你可以通過重新定義一些具有潛在危險的功能,如提高你的虛擬機的安全性:open(...)fopen(...)socket(...),等使用LD_PRELOAD

0

An您可以使用用戶級安全性。您正在運行本機代碼,這意味着您的代碼可能會執行用戶可能執行的任何操作。因此,限制用戶可以做的事情。用戶的限制也添加了「無網絡,無工作目錄外的文件訪問」限制。當然,你仍然會遵守虛擬機規則,但是你更願意儘早趕上這些事情。

既然你提到GNU,我會假設一個linux系統。你會想要一個SELinux虛擬機。你添加到虛擬機中的任何東西都可能被破壞,所以請跳過它。可能不需要安裝X服務器,等等。