Как ACM ICPC Online Judge предотвращает вредоносные атаки?

Я потратил больше нескольких часов на то, чтобы смириться с Архив проблемных проблем ACM ICPC, и я задался вопросом, как онлайн судья может компилировать и запускать исходный код от любого пользователя и предотвращать попадание вредоносных атак в свою систему.

Скомпилированы ли скомпилированные двоичные файлы из какой-то ограниченной песочницы? Как можно организовать такую ​​песочницу? Какую ОС вы бы использовали? Как запустить пользовательский скомпилированный исполняемый файл?

Ответ 1

Вы можете запустить его в Linux chroot jail или связать его с libc, который не реализует никаких файлов ввода/вывода.

Ответ 2

Программы выполняются в chroot тюрьме с ограниченным временем выполнения. Судьи-компьютеры распределяются по нескольким серверам, чтобы предотвратить одну точку отказа или атаки DOS.

Я являюсь администратором регионального конкурса.

Ответ 3

Легкий способ создания песочницы (при условии, что Linux как серверная ОС, которая является обычной для ACM), использует (древний) chroot или некоторые патчи ядра. В ядре теперь есть несколько более совершенных технологий песочницы, например:

  • seccomp - Linux 2.6.12+ - процесс может запрашивать ОС с помощью специального вызова prset, чтобы ограничить возможности процесса to: выходить, читать и писать уже открытые файлы. OS откажется выполнять любой другой системный вызов, эффективно изолируя программу от внешнего мира. И нет возможности вернуть эти возможности обратно. (Это решение может нарушить некоторые прогрессивные языки, такие как python, perl, ruby ​​и т.д., Которые хотят загрузить некоторые плагины во время выполнения.)

  • Изоляция пространства имен cgroups. chroot - это программа для изменения (изолировать) только пространство имен файловой системы, и есть другие пространства имен, например. сети или процесса. Используя cgroups, мы можем ограничить больше, чем возможно, используя только chroot.

Некоторые патчи ядра, написанные для онлайн-судей, например. * ejudge.ru имеет исправления до 2.6.38.8, 3.4.15, 3.7.5; а также некоторые решения для Windows. (Я думаю, что эта система может быть использована на некоторых конкурсах в России, не уверена в 1/4 ACM ICPC.

В некоторых системах судей используется ptrace() syscall - другими словами, они действуют как отладчик для тестируемой программы, и судья может контролировать все системные вызовы и может отменить любой из них, не передавая его в ядро.

И существуют судовые системы с открытым исходным кодом, например. https://openjudge.net/ (libsandbox)

Ответ 4

Я думаю, что они не запускают никакого кода. Иногда появляется такая ошибка "Ограниченная функция", например, когда вы пытаетесь прочитать или записать файл "из потока" и "ifstream" в С++