Я участвую в создании эксперта по онлайн-программированию, поддерживающего C / C ++, такого как SPOJ, UVA и т. Д. На Linux-машине (Ubuntu). Сам код находится на C ++. Я должен предотвратить сервер от вредоносного кода.
Я планирую внедрить безопасность в 2 этапа.
1. Заключив в тюрьму (изолированную среду) исполняемый код с системным вызовом chroot в папке с ограниченной средой. Я наткнулся на утилиту Jailkit , но я думаю, что одного системного вызова будет достаточно для моей работы, поскольку мне не нужно сажать в тюрьму пользователей, только выполнение кода. Для создания среды выполнения в папке я скопировал следующие файлы вместе с файлами для создания ограниченной оболочки (разрешены только встроенные оболочки)
$ ldd ./a.out<br>
linux-gate.so.1 => (0x00f4c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x007a5000)<br>
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00b80000)<br>
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00e0c000)<br>
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)<br>
/lib/ld-linux.so.2 (0x00f7c000)
где a.out - исполняемый файл c ++.
Возникли проблемы:
я) Я пробовал несколько программ, которые работают нормально в тюрьме. Но может ли кто-нибудь подтвердить, что этот файл будет достаточен для всех алгоритмических кодов, т. Е. Нет необходимости явно обрабатывать какие-либо системные вызовы.
ii) Было бы замечательно, если бы кто-нибудь мог предложить какой-либо метод для ограничения некоторых системных вызовов, ограничивая библиотеки времени выполнения, предоставляемые в папку jail как fork (), socket () и т. д., которые не ожидаются кодом.
iii) Просто для сведения, я также скопировал файл, показанный ldd /usr/bin/gcc
и / usr / bin / gcc. Но я не могу использовать GCC в тюрьме с ошибкой
bash-4.1# /usr/bin/gcc try.c
gcc: error trying to exec 'cc1': execvp: No such file or directory
Как я могу это исправить?
2. Отслеживая системные вызовы с помощью ptrace и уничтожая работающий код, если он использует подозрительные системные вызовы. Теперь проблема в том, какие системные вызовы должны быть запрещены? Что я чувствую, так это ограничение fork (), vfork () и execve () выполнят эту работу, потому что для каждой программы существует ограничение времени (едва ли> 10 секунд). После этого он будет автоматически убит, и нет другого способа создать другой процесс, кроме fork (), vfork (). Но так как мои мысли ограничены моим воображением, было бы замечательно, если бы у кого-то было другое мнение, чтобы изменить все здесь.
Так что, в основном, я беспокоюсь о том, что i) и ii) указывают на «возникшие проблемы», и если кто-то может придумать способ взлома после ограничений, указанных во 2-м пункте.