2016-09-11 5 views
1

Мой вопрос похож на этот question, но я не получил ответа.Изменение разрешения программы в Linux

Я пытаюсь создать судью.

Пользователи системы онлайн-судей отправляют исходный код, затем серверная программа компилирует и запускает его. Поэтому серверная программа должна поддерживать безопасность сервера.

И есть много вещей, которые пользователь может использовать для внесения изменений на сервер.

Как я могу изменить разрешение программы? Так что скомпилированный код не сможет ничего сделать, кроме как распечатать что-нибудь!

P.S: поиск слов suspicioius - не очень хорошая идея. Например, пользователь может использовать следующую команду вместо слова system в C++:

#define glue(a,b) a ## b 
glue(sys,tem) ("rm *"); //DO NOT RUN THIS CODE 

Так на самом деле пользователь использовал следующий код без использования слова system:

system ("rm *"); //DO NOT RUN THIS CODE 
+2

запустить их на виртуальных машинах или контейнерах, созданных на лету. –

ответ

1

Вы можете запустить их в chroot тюрьма, с идентификатором пользователя, установленным никем или некоей учетной записью nonce, если никто действительно не может сделать что-то существенное. (Для этого вы можете использовать su или sudo.) Или даже в собственной VM. Выполните вывод в файл и прочитайте его из своей программы.

2

Это два варианта для вас: тот, который вы сейчас изучаете, - пытаясь сделать ваш компилятор, а также серверный процесс, который запускает предоставленный пользователем исходный код, обнаруживает «эксплойты». И это может быть hard. Если вы разрешаете пользователям отправлять вам исходный код C++, есть много вещей, которые становятся возможными. Я думаю, вам понадобятся некоторые реальные гуру C++, чтобы получить это решение даже «наполовину безопасным».

Итак, вариант второй: вы должны запустить этот пользовательский ввод в виде песочницы. Примерами могут быть:

  1. Контейнер Docker (но точно: непривилегированное контейнера, управляет пользователь, а не корень)
  2. Виртуальная машина

Если вы серьезно о том, что вы делаете, вы, вероятно, сначала сосредоточились на варианте 2 (потому что это дает вам большую пользу при средних затратах); но вы определенно хотите заглянуть в вариант 1 тоже (потому что можно было узнать из этого много).