2009-06-25 2 views
0

Я задал несколько вопросов о создании онлайн-судьи когда-то в stackoverflow, и я нашел немало хороших ответов на это. Я начал работать над разработкой одного, и я, похоже, столкнулся с серьезным недостатком своего кода.Процесс по Linux игнорирует ограничения ресурсов

Представленный пользователем источник будет скомпилирован на сервере. Это выполняется exec() ing gcc в раздвоенном процессе. Теперь я установил ограничение ресурса на процессорное время и, превысив это, сигнал 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

Я бы не хотел проверять, что такое портативный машинный код из внешних источников ... Удачи! –

+0

Для других советов по песочнице см .: http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o

ответ

1

В Linux , в частности, пользователь мог делать то, что вы говорите. Но linux отправит sigkill в процесс, если будет достигнут жесткий предел (в отличие от установленного вами мягкого ограничения), и это завершит процесс.

(Помните, хотя, вы действительно должны запустить свой материал в изолированной среде)

+0

Думаю, у меня есть идея. Я буду chroot в каталог моего кода, а затем установить жесткий предел. Поправьте меня если я ошибаюсь. Я думаю, что это повлияет на включенные пути. – user108127

+0

Будет. Вы должны реплицировать минималистическую среду, содержащую только то, что требуется для компиляции/запуска материала, который вы хотите в среде chrooted (вроде мини-мини-установки Linux, содержащей только компилятор/заголовки и другие мелкие фрагменты в своем собственном каталоге) – nos

1

Wow. Подумав об этом сложном начинании на все около 7 минут, я заранее извиняюсь за что-то глупое, что я собираюсь сказать.

Это будет что-то вроде UVA Judge?

Если цель состоит в том, чтобы позволить относительно простым программам запускать, не позволяя злоумышленникам уничтожать вашу систему, вам кажется, что вам нужно быть более активными, чем это, или вы будете исправлять дыры до конца времени.

Как минимум, я думаю, вам нужно будет вырезать файлы заголовков пользователей и заменить один из своих, который содержит минимальную функциональность. Запретить сборщик. Используйте модифицированный stdlib и/или ядро, которое не работает или убивает процесс при любых попытках syscall() и т. Д.

Здесь очень многое предстоит рассмотреть.

+0

Да совершенно аналогичный судье UVA. Спасибо за предложения. Я попытаюсь их реализовать – user108127

Смежные вопросы