Поместите процесс в песочницу, где он может нанести наименьший вред
Я ищу концепцию, чтобы породить такой процесс, который:
- он имеет доступ только к определенным библиотекам /API
- он не может получить доступ к файловой системе или только определенным частям
- это может принести наименьший вред, если вредоносный код работает в нем
Эта концепция известна как песочница или тюрьма.
Это необходимо сделать для каждой основной операционной системы (Windows, MacOSX и Linux), и вопрос является концептуальным (как в том, что делать, какие API использовать и что наблюдать), а не в зависимости от языка.
отвечать требованиям
Я действительно хочу принять ответ и дать вам 20 баллов за это. Я не могу принять свой собственный ответ, и у меня его пока нет. Поэтому, если вы действительно хотите, чтобы ваш ответ был принят, пожалуйста, соблюдайте:
- Ответ должен быть конкретным и полным
- Под конкретным я подразумеваю, что это больше, чем указатель на какой-то ресурс в интернете. Он должен резюмировать, что ресурс говорит по крайней мере о теме.
- Он может содержать или не содержать пример кода, но если это так, пожалуйста, напишите его на C
- Я не могу принять ответ, который является 2/3 полным, даже если 2/3, которые там есть, прекрасны.
этот вопрос FAQ
- Это домашнее задание? Нет.
- Почему вы задаете это как домашнее задание? Если вы задаете конкретный вопрос и хотите получить конкретный ответ, и вы знаете, как этот ответ должен выглядеть, даже если вы не знаете ответ, это стиль вопроса, который вы получаете.
- Если вы знаете, как это должно выглядеть, почему вы спрашиваете? 1) потому что я не знаю всего ответа 2) потому что в интернете нет единого места, которое содержало бы все детали этого вопроса в одном месте. Пожалуйста, прочтите также FAQ по stackru
- Почему основная часть вашего вопроса, как ответить на этот вопрос? Потому что никто не читает FAQ.
9 ответов
Mac OS X имеет средство песочницы под кодовым названием Seatbelt. Открытый API для него задокументирован в песочнице (7), sandbox_init(3) и на соответствующих страницах справочника. Публичный API несколько ограничен, но само средство очень мощное. Хотя общедоступный API-интерфейс позволяет выбирать только из некоторых предопределенных "песочниц" (например, "Все сети на основе сокетов запрещены"), вы также можете использовать более мощную базовую реализацию, которая позволяет вам точно указать, какие ресурсы операционной системы доступны через Схемоподобный язык. Например, вот выдержка из песочницы, используемой для portmap:
(allow process-exec (regex #"^/usr/sbin/portmap$"))
(allow file-read-data file-read-metadata (regex
#"^/etc"
#"^/usr/lib/.*\.dylib$"
#"^/var"
#"^/private/var/db/dyld/"
#"^/dev/urandom$"))
(allow file-write-data (regex
#"^/dev/dtracehelper$"))
Вы можете увидеть много песочниц, используемых системой в /usr/share/sandbox. С песочницами легко экспериментировать с помощью команды sandbox-exec(1).
В случае с Windows вы можете взглянуть на выступление Дэвида Леблана "Практическая песочница", которое было дано на Black Hat USA 2007. В Windows нет встроенной технологии песочницы как таковой, поэтому описанные методы используют неполный механизм, представленный в Windows 2000, называемый SAFER. Используя ограниченные токены, можно создать процесс с ограниченным доступом к ресурсам операционной системы.
Для Linux вы можете исследовать сложный механизм SELinux: SELinux home, HOWTO. Например, Red Hat использует его для защиты некоторых системных служб в некоторых своих продуктах.
Для Windows в Google Chrome есть песочница. Вы можете исследовать это. Он использует либеральную BSD-подобную лицензию.
For Linux there would be good old chroot or more sophisticated http://plash.beasts.org/wiki/.
OS X since Leopard has some SELinux-like protection available.
На сайте http://codepad.org/ есть хорошая страница "О программе" о том, как они безопасно разрешают выполнение любых фрагментов кода.
Выполнение кода осуществляется супервизором на основе geordi. Стратегия состоит в том, чтобы запускать все под ptrace, при этом многие системные вызовы запрещены или игнорируются. Компиляторы и финальные исполняемые файлы выполняются в изолированной тюрьме со строгими ограничениями ресурсов. Руководитель написан на Хаскеле.
Когда ваше приложение выполняет удаленное выполнение кода, вы должны ожидать проблем с безопасностью. Вместо того, чтобы полагаться только на супервизор chroot и ptrace, я принял некоторые дополнительные меры предосторожности:
Процессы супервизора выполняются на виртуальных машинах, которые защищены брандмауэром, так что они не могут устанавливать исходящие соединения.
Машины, на которых работают виртуальные машины, также сильно защищены брандмауэром и периодически восстанавливаются из их исходных образов.
У FreeBSD есть определенные концепции джейлов, а у Solaris есть контейнеры. В зависимости от того, что вы ищете, это может помочь.
тюрьмы chroot могут помочь ограничить возможности приложения (хотя любое приложение с привилегиями root может избежать тюрьмы), и они доступны в большинстве UNIXen, включая OS X.
Что касается Windows, я не уверен. Если бы существовал простой способ изолированного приложения для Windows, большинство из них были бы гораздо более безопасными, я уверен.
В Windows (2000 и более поздних версиях) вы можете использовать объекты Job для ограничения процессов.
Если вам действительно нужен метод, который будет работать со всеми этими платформами, в отличие от отдельного решения для каждой платформы, то я думаю, что ваш единственный ответ - настроить виртуальную машину для каждой среды тестирования. Вы можете вернуться к снимку в любое время.
Еще одним большим преимуществом использования виртуализации является то, что вы можете иметь все среды тестирования с их гостевыми операционными системами в одной коробке.
Обычно любой виртуальный частный сервер будет делать:
Linux VServer http://linux-vserver.org/Welcome_to_Linux-VServer.org
Parallels Virtuozzo Containers http://www.parallels.com/products/pvc/
и, как уже упоминалось, FreeBSD и Solaris имеют собственные реализации.
Ой. на самом деле я заметил, что вы просите его работать на любой ОС. Ну, это может быть немного сложно, так как я думаю, что меньше усилий - это просто использовать несколько виртуальных машин, которые могут поддерживать некоторый уровень песочницы, например:
- Джава
- .СЕТЬ
Я не эксперт по этой теме, но я думаю, что стандартный ответ для linux - определить политику SeLinux с правильными возможностями для этого процесса.