2012-04-03 6 views
5

В настоящее время я работаю над базовым компонентом системы программирования общественного программирования ACM. В такой системе любой пользователь может представить источник кода, который будет скомпилирован и запущен автоматически (что означает, что предварительная модерация не выполняется), пытаясь решить некоторую вычислительную проблему.Как запретить системные вызовы, GNU/Linux

Back-end - специализированный компьютер GNU/Linux, в котором пользователь будет создан для каждого участника, причем все такие пользователи являются частью группы пользователей. Источники, отправленные любым конкретным пользователем, будут храниться в домашнем каталоге пользователя, а затем скомпилированы и выполнены для проверки на различные тестовые примеры.

Я хочу запретить использование системных вызовов Linux для источников. Это связано с тем, что для решения проблем требуются независимые от платформы решения, в то время как включение системных вызовов для небезопасного источника является потенциальным нарушением безопасности. Такие источники могут быть успешно помещены в FS, даже скомпилированы, но никогда не запускаются. Я также хочу получать уведомления, когда был отправлен источник, содержащий системные вызовы.

К настоящему времени, я вижу следующие места, где такие проверки могут быть размещены: анализ

  • Фронтальный/предварительной компиляции - источник уже проверил в системе, но еще не составлен. Простой текстовый контроль против имен системных вызовов. Независимое от платформы, независимое от компилятора, зависящее от языка решение.
  • Компилятор patch - сбоя GCC (или любой другой компилятор, включенный в цепочку инструментов), когда встречается системный вызов. Зависящее от платформы, зависящее от компилятора, независимое от языка решение (если мы поместим шашку «достаточно далеко»). Совместимость также может быть потеряна. На самом деле мне больше не нравится эта альтернатива.
  • Проверка времени выполнения - при вызове системного вызова из процесса прекратите этот процесс и сообщите об этом. Это решение является компилятором и независимым от языка, но зависит от платформы - я в порядке с этим, так как я буду развертывать back-end на аналогичных платформах в короткие и средние сроки.

Итак, вопрос в том, делает ли GNU/Linux администратором возможность запретить использование системных вызовов для пользовательской группы, пользователя или конкретного процесса? Это может быть политика безопасности или легкая утилита GNU.

Я пробовал Google, но Google не любил меня сегодня.

+0

_Front-end/pre-compilation analysis_ ← Трюки препроцессора могут легко уклониться от этого. Существует 'seccomp', который является режимом, в котором процесс может только читать/записывать в предварительно открытый канал. Он активируется с помощью вызова 'prctl()'. Здесь есть похожие вопросы: http://www.google.com/search?q=seccomp+site%3Astackoverflow.com&btnG=Buscar&oe=utf-8 – ninjalj

+0

@ninjalj пытался, но не нашел. Хотите поделиться ссылкой? – iehrlich

+0

Просто добавил ссылку на мой предыдущий комментарий. – ninjalj

ответ

7

режим 1 seccomp позволяет процессу ограничивать себя ровно четыре системных вызовов: read, write, sigreturn и _exit. Это можно использовать для строгого кода песочницы, как это делает seccomp-nurse.

mode 2 seccomp (на момент написания статьи, найденный в Ubuntu 12.04 или исправление собственного ядра) обеспечивает большую гибкость при фильтрации системных вызовов.Вы можете, например, сначала настроить фильтры, затем exec тестируемой программы. Соответствующее использование chroot или unshare может быть использовано для предотвращения повторного использования чего-либо еще «интересного».

+1

@suddnely_me Я просто подумал о другой альтернативе, если seccomp не отключается: песочница [NaCL] (https://developers.google.com/native-client/), такая как [ZeroVM] (http://zerovm.org/). – ephemient

3

Я думаю, вам нужно лучше определить системный вызов. Я имею в виду, что

cat <<EOF > hello.c 
#include <stdio.h> 
int main(int argc,char** argv) { 
    fprintf(stdout,"Hello world!\n"); 
    return 0; 
} 
EOF 
gcc hello.c 
strace -q ./a.out 

показывает, что даже кажущаяся тривиальная программа составляет ~ 27 системных вызовов. Вы (я предполагаю) хотят разрешить вызовы в «стандартную библиотеку C», но те, которые в свою очередь будут реализованы с точки зрения системных вызовов. Я предполагаю, что я пытаюсь сказать, что проверка времени выполнения менее осуществима, чем вы думаете (используя strace или аналогичный в любом случае).