безопасность памяти и безопасность - песочница произвольной программы? - PullRequest
3 голосов
/ 25 февраля 2011

В некоторых языках (Java, C # без небезопасного кода, ...) невозможно (должно быть) невозможно повредить память - нет ручного управления памятью и т. Д. Это позволяет им ограничивать ресурсы (доступ к файлам, доступ к сети , максимальное использование памяти, ...) приложениям довольно легко - например, Java-апплеты (веб-запуск Java). Иногда это называется песочницей.

Мой вопрос: возможно ли это с нативными программами (например, написанными на небезопасном для памяти языке, таком как C, C ++; но без исходного кода)? Я не имею в виду простую обходную песочницу или антивирусную программу.

Я думаю о двух возможностях:

  • запускать приложение от имени другого пользователя ОС, устанавливать ограничения для этого пользователя. Недостаток - много пользователей, для каждой комбинации параметров, прав доступа?
  • (каким-то образом) функции ограничения (OS API), которые можно вызывать Я не знаю, позволяют ли какие-либо возможности (по крайней мере, теоретически) в полной защите, без возможности обхода.

Редактировать: меня больше интересует теория - мне все равно, например. некоторые ОС имеют недокументированные функции, или как изолировать любое приложение в данной ОС. Например, я хочу поместить приложение в песочницу и разрешить только две функции: получить char из консоли, положить char в консоль. Как это можно сделать нерушимо, без возможности обхода?

Упомянутые ответы:

  • Google Native Client, использует в разработке подмножество x86 - вместе с (возможно?) PNaCl - переносным нативным клиентом
  • полная виртуальная машина - очевидно, излишняя, представьте десятки программ ...

Другими словами, может ли собственный код (небезопасный доступ к памяти) использоваться в ограниченной среде, например в веб-браузере со 100% (по крайней мере в теории) безопасностью?

Edit2: Собственный клиент Google - это именно то, что мне нужно - любой язык, безопасный или небезопасный, работающий на собственной скорости, песочница, даже в веб-браузере. Все используют любой язык, который вы хотите, в Интернете или на рабочем столе.

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

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

2 голосов
/ 25 февраля 2011

Возможно, вы захотите прочитать о собственном клиенте Google , который выполняет код x86 (и код ARM, который я считаю сейчас) в песочнице.

1 голос
/ 25 февраля 2011

Да, это возможно, если оборудование предоставляет механизмы, ограничивающие доступ к памяти.Процессоры для настольных ПК обычно оснащены MMU и уровнями доступа, поэтому ОС может использовать их для запрета доступа к любому адресу памяти, к которому поток не должен иметь доступ.

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

Все, что действительно нужно ОС - это правильно использовать эти функции, и любой код не сможет вырваться из песочницы.Конечно, это гораздо легче сказать, чем на практике.Главным образом потому, что ОС предпочитает производительность, упущения в том, что могут использоваться определенные вызовы ОС, и последние, но не менее важные ошибки в реализации.

1 голос
/ 25 февраля 2011

возможно?Да.Сложно?Тоже да.OS-зависимый?Очень да.

Большинство современных ОС поддерживают различные уровни изоляции процессов, которые можно использовать для достижения того, что вы хотите.Самый простой подход - просто подключить отладчик и прервать все системные вызовы;затем отфильтруйте эти вызовы в отладчике.Это, однако, сильно ухудшает производительность, и его трудно сделать безопасным при наличии нескольких потоков.Это также сложно реализовать безопасно в операционных системах, где низкоуровневый интерфейс системного вызова не задокументирован, таких как Mac OS или Windows.

Люди из браузера Chrome проделали большую работу в этой области.Они опубликовали документы по дизайну для Windows , Linux (в частности песочница SUID ) и Mac OS X .Их подход эффективен, но не полностью надежен - все еще могут быть небольшие утечки информации между внешней ОС и гостевым приложением.Кроме того, некоторые ОС требуют специальных модификаций гостевой программы для связи из песочницы.

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

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

...