Я участвую в создании онлайн-программиста-судьи, поддерживающего 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-й точке.