Песочница для онлайн-судей
Я разработал приложение для 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
фильтр.