←返回上一頁

itouSandBox

從零實作的 Linux 判題沙箱

專案介紹

itouSandBox/sandbox-runner 是為 itouOJ 開發的 Linux 判題沙箱,核心以 C 實作,負責在受限制的環境中編譯、執行使用者提交的程式。正式站的 C、C++、Python 與 JavaScript 提交及測試執行都由它處理,取代原先依賴的 Piston 評測服務。

三層隔離與限制

  • Linux namespace:隔離程序可見的檔案系統、程序與其他系統資源。
  • cgroup v2:限制記憶體與程序數,逾時或停止時可清理整個工作群組。
  • seccomp-bpf:依語言使用不同的系統呼叫白名單,控制執行時能做的操作。

隔離、降權、移除 capabilities 和套用白名單都有固定的初始化順序。C/C++ 的編譯也在獨立沙箱裡進行,執行每筆測資時再建立新的 jail。

判題服務與互動執行

HTTP 服務沿用 Piston 執行介面的主要欄位,方便 OJ 接入。C/C++ 支援以 compiled handle 重用編譯結果,讓同一份原始碼的多筆測資不必反覆編譯;標準輸入、輸出與錯誤輸出則以多工方式處理,避免管線互相等待。

桌機 Terminal 由另一個互動服務呼叫同一個 jail,保留持續運作的程式,支援逐行輸入、EOF、停止與斷線清理。Java 已停止接受新提交,歷史紀錄仍保留在 OJ。

驗證與實作取捨

白名單會依實際程式與系統呼叫追蹤調整,並用歷史提交重放、隔離檢查、資源限制與互動服務測試驗證。Python 的大量輸入、Node.js 的執行緒需求,都和單純的 Hello World 有很大差異。

例如 Node.js 需要允許執行緒相關呼叫,因此不能只靠 seccomp 限制程序建立,還要由 cgroup 的程序數上限一起約束。這個專案的重點,就是把不同語言的需求放進同一套可理解、可測試的執行邊界。