[英]How do sites like codepad.org and ideone.com sandbox your program?
codepad.org具有基於什么鷹眼 ,它運行在chroot與資源限制的一切(即僅限於文件系統的一個子樹),並使用ptrace的API限制不信任程序的使用系統調用。 見http://codepad.org/about 。
我之前使用過Systrace ,這是另一個用於限制系統調用的實用程序。
如果策略設置正確,則可以防止不受信任的程序破壞沙箱中的任何內容或訪問它不應該訪問的任何內容,因此可能不需要將程序放在單獨的chroot中並為每次運行創建和刪除它們。 雖然這會提供另一層保護,這可能不會受到傷害。
前段時間我正在尋找一個沙盒解決方案,用於CS學生的自動分配評估系統。 與其他一切非常相似,各種屬性之間存在權衡:
我最終決定采用基於Linux的多層架構:
0級 - 虛擬化:
通過在特定時間范圍內為所有分配使用一個或多個虛擬機快照,可以獲得以下幾個優勢:
明確區分敏感數據和非敏感數據。
在該期間結束時(例如,每天一次或每次會話之后),VM將從快照關閉並重新啟動,從而刪除任何惡意或惡意代碼的殘余。
第一級計算機資源隔離:每個VM具有有限的磁盤,CPU和內存資源,並且無法直接訪問主機。
直接網絡過濾:通過在內部接口上安裝VM,主機上的防火牆可以選擇性地過濾網絡連接。
例如,用於測試入門編程課程學生的VM可能會阻止所有傳入和傳出連接,因為該級別的學生不會進行網絡編程分配。 在較高級別,相應的VM可以例如阻止所有傳出連接並且僅允許來自教師內部的傳入連接。
為基於Web的提交系統提供一個單獨的VM也是有意義的 - 一個可以將文件上傳到評估虛擬機的虛擬機,但除此之外幾乎沒有。
1級 - 基本的cperating-system約束:
在包含傳統訪問和資源控制機制的Unix操作系統上:
每個沙盒程序可以作為單獨的用戶執行,也許在一個單獨的chroot
監獄中執行。
嚴格的用戶權限,可能使用ACL。
ulimit
資源限制處理器時間和內存使用。
在nice
下執行以降低對更關鍵進程的優先級。 在Linux上你也可以使用ionice
和cpulimit
- 我不確定其他系統上存在哪些等價物。
磁盤配額。
每用戶連接篩選。
您可能希望將編譯器作為稍微特權的用戶運行; 更多內存和CPU時間,訪問編譯器工具和頭文件等
2級 - 高級操作系統限制:
在Linux上,我認為使用Linux安全模塊(如AppArmor或SELinux)來限制對特定文件和/或系統調用的訪問。 一些Linux發行版提供了一些沙盒安全配置文件,但要讓這樣的東西正常工作仍然是一個漫長而痛苦的過程。
3級 - 用戶空間沙盒解決方案:
我已經成功地使用了Systrace ,如我今年的老答案中所提到的那樣。 還有其他幾種適用於Linux的沙盒解決方案,例如libsandbox 。 與基於LSM的備選方案相比,此類解決方案可以對可以使用的系統調用提供更細粒度的控制,但是可以對性能產生可測量的影響。
等級4 - 先發制人打擊:
由於您將自己編譯代碼,而不是執行現有的二進制文件,因此您手中還有一些其他工具:
基於代碼指標的限制; 例如,一個簡單的“Hello World”程序永遠不應該超過20-30行代碼。
對系統庫和頭文件的選擇性訪問; 如果您不希望用戶調用connect()
,則可能只限制對socket.h
訪問。
靜態代碼分析; 禁止匯編代碼,“怪異”字符串文字(即shell代碼)和使用受限制的系統函數。
一個稱職的程序員可能能夠繞過這些措施,但隨着成本效益比的增加,他們不太可能堅持下去。
0-5級 - 監測和記錄:
您應該監視系統的性能並記錄所有失敗的嘗試。 您不僅更有可能在系統級別中斷正在進行的攻擊,而且您可以使用管理方法來保護您的系統,例如:
要求任何安全官員負責這些問題。
找到那些持久的小黑客並為他們提供工作。
您需要的保護程度以及您願意花費的資源來設置它取決於您。
我是@thkala提到的libsandbox的開發者,我建議你在項目中使用它。
關於@thkala答案的一些補充意見,
connect()
類的系統函數。 這是因為用戶代碼可以(1)自己聲明函數原型而不包括系統頭,或者(2)在不觸及libc
包裝函數的情況下調用底層的kernel-land系統調用;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.