簡體   English   中英

codepad.org和ideone.com等網站如何沙盒你的程序?

[英]How do sites like codepad.org and ideone.com sandbox your program?

我需要在我的網站上編譯和運行用戶提交的腳本,類似於鍵盤ideone所做的。 我如何沙箱這些程序,以便惡意用戶不會取下我的服務器?

具體來說,我想將它們鎖定在一個空目錄中,防止它們在其外的任何地方讀取或寫入,避免消耗太多內存或CPU,或者做任何其他惡意操作。

我需要通過沙箱外部的管道(通過stdin / stdout)與這些程序進行通信。

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上你也可以使用ionicecpulimit - 我不確定其他系統上存在哪些等價物。

    • 磁盤配額。

    • 每用戶連接篩選。

    您可能希望將編譯器作為稍微特權的用戶運行; 更多內存和CPU時間,訪問編譯器工具和頭文件等

  • 2級 - 高級操作系統限制:

    在Linux上,我認為使用Linux安全模塊(如AppArmorSELinux)來限制對特定文件和/或系統調用的訪問。 一些Linux發行版提供了一些沙盒安全配置文件,但要讓這樣的東西正常工作仍然是一個漫長而痛苦的過程。

  • 3級 - 用戶空間沙盒解決方案:

    我已經成功地使用了Systrace ,如我今年的老答案中所提到的那樣。 還有其他幾種適用於Linux的沙盒解決方案,例如libsandbox 與基於LSM的備選方案相比,此類解決方案可以對可以使用的系統調用提供更細粒度的控制,但是可以對性能產生可測量的影響。

  • 等級4 - 先發制人打擊:

    由於您將自己編譯代碼,而不是執行現有的二進制文件,因此您手中還有一些其他工具:

    • 基於代碼指標的限制; 例如,一個簡單的“Hello World”程序永遠不應該超過20-30行代碼。

    • 對系統庫和頭文件的選擇性訪問; 如果您不希望用戶調用connect() ,則可能只限制對socket.h訪問。

    • 靜態代碼分析; 禁止匯編代碼,“怪異”字符串文字(即shell代碼)和使用受限制的系統函數。

    一個稱職的程序員可能能夠繞過這些措施,但隨着成本效益比的增加,他們不太可能堅持下去。

  • 0-5級 - 監測和記錄:

    您應該監視系統的性能並記錄所有失敗的嘗試。 您不僅更有可能在系統級別中斷正在進行的攻擊,而且您可以使用管理方法來保護您的系統,例如:

    • 要求任何安全官員負責這些問題。

    • 找到那些持久的小黑客並為他們提供工作。

您需要的保護程度以及您願意花費的資源來設置它取決於您。

我是@thkala提到的libsandbox的開發者,我建議你在項目中使用它。

關於@thkala答案的一些補充意見,

  1. libsandbox歸類為用戶登陸工具是公平的,但libsandbox確實集成了標准的操作系統級安全機制(即chroot,setuid和資源配額);
  2. 限制對C / C ++頭文件的訪問或對用戶代碼的靜態分析不會阻止調用connect()類的系統函數。 這是因為用戶代碼可以(1)自己聲明函數原型而不包括系統頭,或者(2)在不觸及libc包裝函數的情況下調用底層的kernel-land系統調用;
  3. 編譯時保護也值得關注,因為惡意C / C ++代碼可以通過無限模板遞歸或預處理宏擴展來耗盡CPU;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM