Я задал несколько вопросов о создании онлайн-судьи когда-то в 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; }
... это большая беда
Я бы не хотел проверять, что такое портативный машинный код из внешних источников ... Удачи! –
Для других советов по песочнице см .: http://stackoverflow.com/questions/1019707/sandboxing-in-linux – mark4o