2009-06-25 52 views
0

我曾經問過一些關於在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; 
} 

...這是大麻煩

+0

我不想驗證從外部來源本質上便攜式機器代碼是什麼......祝您好運! – 2009-06-25 17:54:41

+0

對於其他沙盒提示請參閱:http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o 2009-06-26 01:47:35

回答

1

在Linux ,具體來說,用戶可以做你說的話。 但是如果達到硬限制(相對於你設置的軟限制),linux會發送sigkill到進程,並且這將終止進程。

(但請記住,你真的需要在chroot的環境中運行你的東西)

+0

我想我明白了。我將chroot到我的代碼目錄,然後設置一個硬限制。如我錯了請糾正我。 我認爲這會對包含路徑產生一些影響。 – user108127 2009-06-25 18:30:24

1

哇。考慮到這個令人望而生畏的工作大約7分鐘,我會提前道歉,因爲我將要說的任何愚蠢的事情。

這是否會像UVA Judge

如果目標是允許相對簡單的程序運行而不允許惡意用戶破壞您的系統,那麼看起來您需要比這更積極主動,否則您將修補漏洞直到時間結束。

至少我認爲你需要去掉用戶頭文件並用你自己的包含最小功能的頭文件替換掉。禁止彙編。使用修改後的stdlib和/或內核,在任何嘗試的系統調用()等設備上禁止或殺死該進程。

這裏有一個可怕的問題需要考慮。