Как такие сайты, как codepad.org и ideone.com, помещают вашу программу в песочницу? - PullRequest
37 голосов
/ 12 сентября 2010

Мне нужно скомпилировать и запустить пользовательские сценарии на моем сайте, аналогично тому, что делают codepad и ideone .Как я могу изолировать эти программы, чтобы злонамеренные пользователи не отключили мой сервер?

В частности, я хочу заблокировать их в пустом каталоге и запретить им читать или писать где-либо за их пределами, а также потреблятьмного памяти или ЦП, или от чего-либо еще злонамеренного.

Мне нужно будет общаться с этими программами через каналы (через stdin / stdout) вне песочницы.

Ответы [ 3 ]

24 голосов
/ 30 ноября 2010

codepad.org имеет что-то, основанное на geordi , которое выполняет все в chroot (то есть ограничено поддеревом файловой системы) с ограничениями ресурсов и использует API-интерфейс ptrace для ограничения использования ненадежной программой системные вызовы. См http://codepad.org/about.

Ранее я использовал Systrace , еще одну утилиту для ограничения системных вызовов.

Если политика настроена правильно, недоверенная программа не сможет что-либо сломать в песочнице или получить доступ к чему-либо, к чему она не должна обращаться, поэтому может не потребоваться помещать программы в отдельные chroot и создавать и удалять их при каждом запуске. , Хотя это обеспечит еще один уровень защиты, который, вероятно, не повредит.

17 голосов
/ 12 августа 2012

Некоторое время назад я искал решение для песочницы для использования в автоматизированной системе оценки заданий для студентов CS. Как и все остальное, между различными свойствами существует компромисс:

  • Детализация изоляции и контроля доступа
  • Производительность и простота установки / настройки

В конце концов я выбрал многоуровневую архитектуру на основе Linux:

  • Уровень 0 - Виртуализация:

    Используя один или несколько снимков виртуальной машины для всех назначений в течение определенного промежутка времени, можно было получить несколько преимуществ:

    • Четкое разделение конфиденциальных и не конфиденциальных данных.

    • В конце периода (например, один раз в день или после каждого сеанса) виртуальная машина выключается и перезапускается со снимка, таким образом удаляя все остатки вредоносного или мошеннического кода.

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

    • Прямая фильтрация сети: имея виртуальную машину на внутреннем интерфейсе, межсетевой экран на хосте может выборочно фильтровать сетевые подключения.

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

    Было бы также целесообразно иметь отдельную виртуальную машину для веб-системы отправки - такую, которая могла бы загружать файлы на оценочные виртуальные машины, но мало что могло бы сделать.

  • Уровень 1 - Основные ограничения по работе с системами:

    В ОС Unix, которая будет содержать традиционные механизмы доступа и управления ресурсами:

    • Каждая песочница может выполняться как отдельный пользователь, возможно, в отдельной chroot тюрьме.

    • Строгие пользовательские разрешения, возможно с ACL.

    • ulimit ограничения ресурсов на процессорное время и использование памяти.

    • Выполнение в nice для уменьшения приоритета над более важными процессами. В Linux вы также можете использовать ionice и cpulimit - я не уверен, какие эквиваленты существуют в других системах.

    • Дисковые квоты.

    • Фильтрация подключений для каждого пользователя.

    Возможно, вы захотите запустить компилятор как пользователь с более привилегированными правами; больше памяти и процессорного времени, доступ к инструментам компилятора и заголовочным файлам e.t.c.

  • Уровень 2 - Расширенные ограничения операционной системы:

    В Linux я считаю, что это использование модуля безопасности Linux, такого как AppArmor или SELinux , для ограничения доступа к определенным файлам и / или системным вызовам. Некоторые дистрибутивы Linux предлагают некоторые профили безопасности для песочницы, но все еще может быть долгим и болезненным процесс, чтобы заставить что-то подобное работать правильно.

  • Уровень 3 - Решения для песочницы в пространстве пользователя:

    Я успешно использовал Systrace в небольшом масштабе, как упоминалось в этом моем более старом ответе . Существует несколько других решений для песочницы для Linux, таких как libsandbox . Такие решения могут обеспечить более детальный контроль над системными вызовами, которые могут использоваться, чем альтернативы на основе LSM, но могут оказать ощутимое влияние на производительность.

  • Уровень 4 - Упреждающие удары:

    Поскольку вы будете компилировать код самостоятельно, а не выполнять существующие двоичные файлы, у вас есть несколько дополнительных инструментов:

    • Ограничения на основе метрик кода;Например, простая программа «Hello World» никогда не должна превышать 20-30 строк кода.

    • Выборочный доступ к системным библиотекам и заголовочным файлам;если вы не хотите, чтобы ваши пользователи звонили connect(), вы можете просто ограничить доступ к socket.h.

    • Статический анализ кода;запретить ассемблерный код, «странные» строковые литералы (т. е. шелл-код) и использование ограниченных системных функций.

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

  • Уровень 0-5 - Мониторинг и регистрация:

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

    • Позвоните любым сотрудникам службы безопасности, отвечающим за такие вопросы.

    • и обнаружите вашего настойчивого маленького хакера и предложите им работу.

Степень защиты, в которой вы нуждаетесь, и ресурсы, которые вы готовы потратить на ее установку, зависит от вас.

8 голосов
/ 15 августа 2012

Я разработчик libsandbox , упомянутого @thkala, и рекомендую его для использования в вашем проекте.

Некоторые дополнительные комментарии к ответу @ thkala,

  1. было бы справедливо классифицировать libsandbox как инструмент пользователя, но libsandbox интегрирует стандартные механизмы безопасности на уровне ОС (то есть chroot, setuid и квоту ресурсов);
  2. ограничение доступа к заголовкам C / C ++ или статический анализ пользовательского кода НЕ препятствует вызову системных функций, таких как connect(). Это связано с тем, что пользовательский код может (1) самостоятельно объявлять прототипы функций без включения системных заголовков или (2) вызывать базовые системные вызовы ядра-земли, не затрагивая функции-оболочки в libc;
  3. Защита во время компиляции также заслуживает внимания, поскольку вредоносный код C / C ++ может исчерпать ваш процессор с бесконечной рекурсией шаблона или расширением макроса предварительной обработки;
...