Процесс в Linux, игнорирующий ограничения ресурсов - PullRequest
0 голосов
/ 25 июня 2009

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

Отправленный пользователем источник будет скомпилирован на сервере. Это делается с помощью exec () 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;
}

... это большая проблема

Ответы [ 2 ]

1 голос
/ 25 июня 2009

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

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

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

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

Здесь очень много нужно рассмотреть.

1 голос
/ 25 июня 2009

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

(Помните, что вам действительно нужно запускать свои вещи в изолированной среде)

...