2009-06-25 4 views
0

私は、いつかstackoverflowでオンラインジャッジを開発することに関するいくつかの質問をしてきました。私は開発に取り掛かりました。私は自分のコードで大きな欠陥に遭遇したようです。Linuxのリソース制限を無視したプロセス

ユーザーが送信したソースは、サーバー上でコンパイルされます。これはgccをforkしたプロセスでexec()することによって行われます。今度は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; 
} 

のようなものが含まれている場合...これはLinux上で大きなトラブル

+0

私は本質的に移植可能なマシンコードを外部ソースから検証することは望ましくありません。幸いです! –

+0

他のサンドボックスのヒントについては、http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o

答えて

1

です具体的には、ユーザーがあなたの言うことをすることができます。 しかし、ハード制限に達していれば、linuxはsigkillをプロセスに送信します(これは設定したソフトリミットとは対照的です)。プロセスが終了します。

(あなたが本当にchrootされた環境で自分のものを実行する必要がある、しかし覚えておいてください)

+0

を参照してください。私は自分のコードのディレクトリにchrootし、ハード制限を設定します。私が間違っているなら私を訂正してください。 これはインクルードパスに何らかの影響を与えると思います。 – user108127

+0

です。 chroot環境で必要なものをコンパイル/実行するために必要なものだけを含む、最小限の環境を複製する必要があります(ミニディレクトリ、コンパイラ/ヘッダーと他の小さな部分だけを含むmini Linuxインストールの一種) – nos

1

うわー。私は約7分間、この厄介な取り組みを考えて、私は愚かなことを前もってお詫びします。

これはUVA Judgeのようなものでしょうか?

悪意のあるユーザーがシステムを破壊することを許可せずに比較的簡単なプログラムを実行できるようにする場合は、これよりも積極的にする必要があるか、時間が終了するまで穴を開ける必要があります。

少なくとも、ユーザーヘッダーファイルを削除し、最小限の機能を含む独自のものに置き換える必要があると思います。アセンブラを禁止する。変更されたstdlibやカーネルを使用して、試行されたsyscall()などのプロセスでno-opsまたはkillを実行してください。

ここで考慮すべきことはたくさんあります。

+0

はいUVA判事に非常によく似ています。提案していただきありがとうございます。私はそれらを実装しようとします – user108127

関連する問題