Я пишу онлайн-судью (поддержка C / C ++ 、 GoLang). Я хочу реализовать песочницу самостоятельно. моя идея:
пространство имен и группы
- статически компилировать исходный код пользователя
- запустить исполняемый файл в совершенно новом пространстве имен (
CLONE_NEWUSER
, CLONE_NEWNET
, CLONE_NEWPID
, CLONE_NEWIPC
, CLONE_NEWUTS
, CLONE_NEWNS
)
- используйте PivotRoot для установки нового корня (ничего в корне, кроме исполняемого файла)
- использовать cgroups для управления ресурсом (память / процессор / pid)
- установить время ожидания (используйте
time.AfterFunc
от GoLang)
- из-за ограничения ресурсов и заполнения нового пространства имен я не буду фильтровать системные вызовы
Seccomp
- использовать seccomp для фильтрации неправильных системных вызовов
- установить тайм-аут и ограничить память
онлайн-судья пишет для моей школы. нет секретных данных о том, где работает моя песочница.
какой из них лучше или безопаснее? или любая другая хорошая идея?