私は、いつか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上で大きなトラブル
私は本質的に移植可能なマシンコードを外部ソースから検証することは望ましくありません。幸いです! –
他のサンドボックスのヒントについては、http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o