Проблемы безопасности с онлайн-судьей

Я участвую в создании онлайн-программиста-судьи, поддерживающего C/С++, такого как SPOJ, UVA и т.д. на Linux-машине (Ubuntu). Сам код находится на С++. Я должен предотвратить сервер от вредоносного кода.
Я планирую реализовать безопасность в 2 этапа.
1. Заключая (песочницу) исполняемый код с системным вызовом chroot в папке с ограниченной средой. Я наткнулся на утилиту Jailkit, но я думаю, что системный вызов будет достаточным для моей работы, так как я не должен помещать в тюрьму пользователей, а только исполняемый код. Для создания среды выполнения в папке я скопировал следующие файлы вместе с файлами для создания ограниченной оболочки (разрешены только встроенные оболочки)

$ ldd ./a.out
linux-gate.so.1 => (0x00f4c000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x007a5000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00b80000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00e0c000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x00f7c000)

где a.out - исполняемый файл С++.

Проблемы:
i) Я пробовал несколько программ, которые отлично работают в тюрьме. Но кто-нибудь может подтвердить, что этот файл будет достаточным для всех алгоритмически-интенсивных кодов. Не нужно явно обращаться с каким-либо системным вызовом.
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(), будет выполнять эту работу, потому что для каждой программы есть ограничение по времени (едвa > 10 секунд). После этого он будет автоматически убит, и нет другого способа создать другой процесс, кроме fork(), vfork(). Но поскольку мои мысли ограничены моим воображением, будет здорово, если кто-нибудь получит другие мнения, чтобы согнуть это здесь.


Так что в основном я беспокоюсь о i) и ii) указывает на "возникшие проблемы", и если кто-то может подумать о способе взлома после ограничений, указанных во 2-й точке.

Ответ 1

Самая большая угроза безопасности для запуска чего-то подобного - это возможность сделать исходящие сетевые подключения на порту 25. Кто-то найдет ваш сервис, произведет тысячи долларов спама, и вы будете заблокированы вашим хостом. Кроме того, вы сделаете все остальное на своем хостинг-провайдере/isp ненавидящим вас за то, что вы получите весь блок ip, занесенный в черный список, в каждых чрезмерно массивных баронных базах-барах-спамах.

К счастью, iptables может блокировать локально исходящие пакеты на основе uid процесса, который их создал. Это, вероятно, наименее навязчивый способ защитить себя от помощи спамерам, но вы можете просто использовать более ограничительный брандмауэр, если ящик не должен делать законные исходящие соединения.

Также обратите внимание, что в наши дни исходящие HTTP и https-соединения могут быть столь же полезны для рассылки спама (доски объявлений, скомпрометированные учетные записи Twitter и FB и т.д.) в виде smtp, поэтому вы можете действительно захотеть сделать более тяжелую блокировку или просто полностью заблокировать доступ к сети.

Ответ 3

Почему вы хотите вызвать компилятор в тюрьме? Он может вызывать внешние программы, такие как cc1. Вызов проверенной программы только в порядке. Вы можете просмотреть патч который соответствует той же цели, что и вы.

Интенсивный для вычислений код может многое сделать, прежде чем программа обнаруживает с помощью fork() и запрещает его, например, создать вилку.