2009-11-15 2 views
7

Я изучаю запуск проекта, который включает в себя выполнение кода Python, который пользователь вводит через HTML-форму. Я знаю, что это может быть смертельно опасно (exec), но я видел, как он успешно завершился, по крайней мере, one instance.Безопасное выполнение пользовательского кода python на сервере

Я отправил электронное письмо разработчикам Python Challenge, и мне сказали, что они используют решение, которое они придумали сами, и они только позволяют, чтобы они использовали «функции безопасности, предоставляемые операционной системой», и что «операционная система [Linux] обеспечивает большую часть необходимой вам безопасности, если вы знаете, как ее использовать».

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

+0

+1 для самоубийства теге .. лол –

+0

Давай думать об этом ... не этот вопрос лучше всего подходит для SF (или, возможно, SU)? – Stephan202

+1

@ Stephan202: не обязательно, потому что это * есть проблема ** программирования **. – voyager

ответ

0

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

2

Если вы запустите скрипт как пользователь nobody (в Linux), он может писать практически нигде и не читать данные, у которых есть соответствующие разрешения. Но она все еще может вызвать приступ DoS путем, например:

  • заполнения /tmp
  • едят все RAM
  • едят все CPU

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

Поэтому я считаю, что виртуальная машина без доступа к сети или реальному жесткому диску будет единственным (разумно) безопасным маршрутом. Возможно, разработчики Python Challenge используют KVM, который, в принципе, «предоставляется операционной системой».

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

3

На современном Linux в дополнение к chroot (2) вы можете ограничить процесс дальше, используя клон (2) вместо fork (2). Есть несколько интересных клонов (2) Флаги:

CLONE_NEWIPC (new namespace for semaphores, shared memory, message queues) 
CLONE_NEWNET (new network namespace - nice one) 
CLONE_NEWNS (new set of mountpoints) 
CLONE_NEWPID (new set of process identifiers) 
CLONE_NEWUTS (new hostname, domainname, etc) 

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

1

http://codepad.org/about успешно реализовал такую ​​систему (как общественный код вставки/работающей службы!)

codepad.org является онлайн компилятор/интерпретатор и простое средство для совместной работы. Это пастебин, который выполняет код для вас. [...]

Как это работает

выполнение кода обрабатывается наблюдателем на основе geordi. Стратегия заключается в том, чтобы запускать все под управлением ptrace, при этом многие системные вызовы запрещены или игнорируются.Компиляторы и конечные исполняемые файлы выполняются в chroot-тюрьме со строгими ограничениями ресурсов. Надзор написан в Haskell.

[...]

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

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

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

Смежные вопросы