Песочница для онлайн-судей

Я разработал приложение для Linux, которое запускает недоверенный код, полученный от пользователей (участников). В частности, приложение представляет собой онлайн-судью, которое похоже на UVa OJ, SPOJ и Codeforces, но в основном похоже на BOCA Online Contest Administrator. Мой OJ поддерживает C, C++, Java и Python.

В настоящее время мой OJ очень небезопасен, потому что при выполнении ненадежного кода нет песочницы. Поэтому я ищу лучший способ сделать это. Основное требование к решению: пользователь (который настраивает конкурс, а не участник) должен потратить как можно меньше усилий для настройки моего приложения. я думаю что git clone repo, make, sudo make install,
pjudge install <contest_dir>, cd <contest_dir>изменить некоторые .txt файлы, поместите секретные тесты внутри problems/ а также pjudge start <port> это уже слишком много.

Прежде всего, я бы предпочел, чтобы мое программное обеспечение было небезопасным, чем заставлять пользователя настраивать корневой каталог, рассматривая решение с chroot(2)/chroot(8), Это решение более болезненно для меня, как разработчика и пользователя, чем я готов пострадать с этим личным проектом.

Я также рассмотрел решение с ptrace(2), чтобы убить процесс, если он делает запрещенные системные вызовы. Я попробовал какой-то простой код, чтобы увидеть, работает ли он, но, похоже, он не работает правильно для некоторых системных вызовов. Кроме того, я думаю, что мне придется отфильтровать множество системных вызовов... И я не знаю, какие системные вызовы нужны JVM/ среде исполнения Python... Я не уверен, что это решение может работать. Если кто-то знает, как правильно использовать это решение, пожалуйста, помогите мне!

И я также нашел seccomp(2), Это позволяет процессу вызывать только read(2), write(2), _exit(2) а также sigreturn(2), Это решение кажется отличным. Это было бы легко реализовать в моем приложении, и оно должно работать именно так, как мне нужно... Но только для C и C++. Java и Python снова являются проблемой. Я не знаю, как это решение может работать для двух последних языков, учитывая, что я использую fork(2)+exec(2)/system(3) в моем исходном коде (который находится в C++, кстати).

Любая помощь могла бы быть полезна. Может быть, какой-то правильный / эффективный способ использования ptrace(2)/seccomp(2)или какое-то другое решение, которое мне не хватает. Но, пожалуйста, то, что соответствует моему единственному требованию! Это должно быть очень легко, просто и быстро для пользователя, чтобы настроить мое приложение.

Заранее спасибо!

0 ответов

Разработка собственного механизма песочницы сложна и приведет к неочевидным недостаткам безопасности. И вам определенно не следует использовать chroot и ptrace в качестве инструментов безопасности.

Вместо этого используйте зрелые инструменты. Я рекомендую начать с bubblewrap - потому что он очень прост в использовании, легок и не требует прав root. Это будет заниматься Linux namespaces(7) для безопасной изоляции представлений от корневой файловой системы, сети и списка процессов.

Следующее, о чем вы должны позаботиться, это ограниченность ресурсов. Это может быть сделано в Linux cgroups(7) особенность. Пытаться systemd-nspawn инструмент с systemd.resource-control(5) атрибуты установлены. Для запуска требуются права суперпользователя, поэтому будьте осторожны.

Окончательно укрепите вызовы syscall, используя платформо-зависимые (native, python, java) seccomp-bpf фильтр.

Другие вопросы по тегам