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

Я участвую в создании онлайн-эксперта по программированию, поддерживающего C / C ++, например SPOJ, UVA и т.д. на Linux-машине (Ubuntu). Сам код написан на C ++. Я должен защитить сервер от вредоносного кода.
Я планирую реализовать безопасность в 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 - исполняемый файл c ++.

Возникшие проблемы:
i) Я пробовал несколько программ, которые нормально работают в тюрьме. Но может ли кто-нибудь подтвердить, что этого файла будет достаточно для всех кодов, интенсивно использующих алгоритмы, т.е. нет необходимости явно обрабатывать какой-либо системный вызов.
ii) Было бы здорово, если бы кто-нибудь мог предложить какой-либо метод ограничения некоторых системных вызовов, ограничивая библиотеки времени выполнения, поставляемые в папку jail как fork (), socket () и т. д., которые не ожидаются кодом.
iii) Просто ради информации, я также скопировал файл, показанный ldd / usr / bin / gcc и / usr / bin / gcc. Но я не могу использовать gcc в тюрьме с ошибкой
bash-4.1 # / usr / bin / gcc try.c gcc: ошибка при попытке exec 'cc1': execvp: Нет такого файла или каталога
Как я могу это исправить?

2. Отслеживая системные вызовы с помощью ptrace и УБИВАЯ запущенный код, если он использует некоторые подозрительные системные вызовы. Теперь проблема в том, какие системные вызовы следует запретить? Я чувствую, что fork (), vfork () и execve () будут выполнять свою работу, потому что существует ограничение по времени (вряд ли> 10 секунд) для выполнения каждой программы. После этого он будет автоматически убит, и нет другого способа создать другой процесс, кроме fork (), vfork (). Но поскольку мои мысли ограничены моим воображением, было бы здорово, если бы у кого-нибудь появилось другое мнение, чтобы изменить ситуацию здесь.


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

11
задан animuson 5 May 2012 в 22:50
поделиться