Блог пользователя alex_tolstov

Автор alex_tolstov, 15 лет назад, По-русски
Йохоу, всем привет.

Пишу порт проверяющей системы с Windows на FreeBSD. Все вроде бы даже и работает, но возникает вполне закономерный вопрос - а как сделать так, чтобы пользователь не послал на проверку какую-нибудь чушь, которая убьет сервер, или же, например, не занялся читерством по типу доступа к ресурсам, к которым он не должен иметь этот самый доступ.

Поскольку с такими задачами я ранее не сталкивался, то и решения данной проблемы у меня нет.


В голову приходят лишь некоторые идеи:



1) Запуск решений под пользователем, не имеющим доступа к файловой системе, помимо чтения/записи инпута/аутпута.
2) Некий "анализатор" решений на различных языках, запускаемый после процесса компиляции с целью отстранить от тестирования решения, которые, например, вызывают определенные функции, неугодные нам. Возникает ощущение что это как-то не тру, из-за того что "за всем не углядишь" и "лениво для каждого языка писать свое".
3) Каким-то образом отрубить библиотеки, которые, опять же, нам не нужны. В результате у нас не должно скомпилироваться.
4) По горячим следам найдена тема безопасности на Яве, заключающаяся в применении менеджера безопасности и настроек политики.
5) Проводить операции, касающиеся безопасности, не над исходником, а над непосредственно бинарником. Сюда может входить подмена адресов вызываемых функций или чего-то похожего.


Было бы интересно узнать о стандартных подходах в такой ситуации среди Гуру. =) Уверен, что многие из сидящих на этом сайте имели/имеют отношение к написанию проверяющих систем :)

Заранее спасибо!
  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Идея - запуск практически бесправного процесса, который не имеет права выполнять большинство функций работы с файловой и операционной системой.
Есть такая система ejudge.
Здесь можно прочитать о безопасном тестировании (защищённом исполнении программ) и скачать патч к ядру.
15 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Я хотел написать на эту тему длинную статью, но всё никак времени нет.
Ну и под FreeBSD я бы не советовал ничего портировать.
Сейчас у меня есть полунаписанная песочница под линукс на базе selinux + cgroups (selinuxом режем доступ, а цгруппами ограничиваем ресурсы + считаем сколько использовали).
К четвертьфиналу расчитываю доделать.
Такие дела.
  • 15 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Т.е. метод, который применяется Вами, это ограничение доступа и прав путем использования неких утилит, я правильно понимаю?

    С FreeBSD мне не переехать)

    • 15 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Нет, неправильно.

      http://en.wikipedia.org/wiki/SELinux
      http://www.mjmwired.net/kernel/Documentation/cgroups.txt

      А почему не переехать? намертво приросло?
      • 15 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Что-то типа того :)

        А что плохого в портировании именно на FreeBSD?
        • 15 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          Всё плохо.
          Linux лучше.
          Ладно, посмотрим что у тебя получится.
          Если получится хорошо - можно будет провести сравнительное тестирование. Вот и узнаем тогда, кто лучше.