我曾經問過一些關於在stackoverflow上開發一個在線裁判的問題,我發現了很多好的答案。我開始着手開發一個,我似乎遇到了我的代碼中的一個主要缺陷。Linux上的進程忽略資源限制
用戶提交的源代碼將在服務器上編譯。這由exec()在分叉進程中執行gcc完成。現在我設置了CPU時間的資源限制,並且超過了這個限制,SIGXCPU信號被髮送到進程。一切都很好,直到現在。但假設有人編寫處理SIGXCPU代碼本身的惡意代碼,然後它將繼續在服務器上運行,並可能爲某人開啓遠程控制服務器的方式。
那麼我在這裏錯過了什麼?這一定是可以預防的。
編譯模塊的基本原型是這樣的:
int main() { int pid; int rv; if (!(pid=fork())) { struct rlimit limit; getrlimit(RLIMIT_CPU, &limit); limit.rlim_cur = 1; setrlimit(RLIMIT_CPU, &limit); //execl() with gcc and source file name } else if(pid) { wait(&rv); } else printf("Error forking\n"); return 0; }
,如果源文件包含有類似
void handler(int signum) { if (signum == SIGXCPU) printf("Caught SIGXCPU signal\n"); } int main() { signal(SIGXCPU, handler); while(1); return 0; }
...這是大麻煩
我不想驗證從外部來源本質上便攜式機器代碼是什麼......祝您好運! – 2009-06-25 17:54:41
對於其他沙盒提示請參閱:http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o 2009-06-26 01:47:35