Проблемы безопасности с онлайн-судьей - PullRequest
11 голосов
/ 16 марта 2011

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

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

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

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

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

4 голосов
/ 12 декабря 2011

Вы можете захотеть взглянуть на этот проект: библиотека песочниц, ориентированная на онлайн-судейство. http://sourceforge.net/projects/libsandbox/

1 голос
/ 16 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...