Доброе время суток! У меня есть проект на Python3.5, а именно система автоматического тестирования для локальной сети(тестер для олимпиадных задач по программированию). Допустим кто-то сдает решение. А именно:
#include<bits/stdc++.h>
using namespace std;
int main(){
system("rm -rf /*")
return 0;
}
или
#include<bits/stdc++.h>
using namespace std;
int main(){
system("shutdown -a now")
return 0;
}
Первый случай пофиксить я знаю как. Просто запускать программу от другого пользователя(файлы принадлежат admin, а запускать от пользователя tester)
А вот с вторым возникают затруднения. Возможно можно решить проблему еще на стадии компиляции. Для компиляции используется g++.
Делаем небольшую программу на C:
#include <stdio.h>
#include <unistd.h>
const char newroot[]="/path/to/test/dir";
int main(int c, char **v, char **e) {
int rc; const char *m;
if ( (m="chdir" ,rc=chdir(newroot)) == 0
&& (m="chroot",rc=chroot(newroot)) == 0
&& (m="setuid",rc=setuid(getuid())) == 0 )
m="execve", execve(v[1],v+2,e);
perror(m);
return 1;
}
Компилируем ее, называем например chrooter
sudo chown root.root chrootersudo chmod 4755 chrooter.-static что бы она не требовала для работы никаких библиотек (либо придется выяснять какие библиотеки она использует и все их класть в /path/to/test/dir/lib.chrooter ./a.out параметры программыПрограмма при этом может использовать любые функции, включая system, exec и т.п. так же она может сама удалять файлы (для теста работоспособности я сделал программу выполняющую unlink("abc"); unlink("../abc"); создал файлы abc в каталоге тестирования и на уровень выше с правами пользователя под которым запускал). НО программа находится в chroot, это означает что корнем файловой системы для данной программы является указанный нами каталог (/path/to/test/dir) и за его пределы она выйти не может. Таким образом тестовая программа удалит файл abc в тестовом каталоге, но никакого более верхнего каталога ../ для нее не существует. Так же программа фактически не сможет запустить с помощью system ни одну стандартную программу просто по тому, что для нее не существует каталогов /bin, /usr/bin где лежат эти самые команды. Если требуется что бы она что то могла запускать надо в ее каталоге создать /bin и положить туда нужные программы (не забыв положить в /lib требуемые им библиотеки)
P.S. в принципе конечно можно было бы не делать специальную программу пускатель, а воспользоватся стандартной командой chroot /path/to/new/root program, но команда chroot может выполнятся только рутом, а разрешать питоновскому пользователю использовать sudo для запуска chroot я не считаю надежным, вдруг в ней будут какие нибудь ошибки и пользователь извне сможет подменить выполняемую команду, например.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости