Можно ли ограничить стандартные потоки, доступные для Linux на уровне процесса? - PullRequest
3 голосов
/ 09 октября 2008

Я хотел бы иметь возможность порождать процесс linux, который будет иметь доступ только к stdin, stdout и stderr (не больше и не меньше). Могу ли я сделать это на самом уровне процесса? Я также неявно заявляю (оксюморон), что не хочу, чтобы порожденный процесс мог изменять «вещь», на которую указывает другой конец потока.

Образно:

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

Я также сейчас смотрю на SElinux. Позволит ли это мне создать процесс, который имел доступ только к этим трем потокам? Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 июня 2009

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

Ядро управляет доступом к определенным объектам (со связанным набором разрешений), например, файл - это объект, каталог - это объект, сокет датаграммы unix - это объект и многие другие.

вероятно, самое простое - написать небольшую политику. К счастью, SELinux по умолчанию запрещен, поэтому запустите вашу программу и посмотрите в журналах сообщения об отказах SELinux и разрешите вашей программе делать только то, что вы хотите. Другими словами, вам следует избегать добавления прав доступа, которые включают такие классы объектов, как msg (сообщения в очереди сообщений systemV), msgq (сама очередь сообщений SystemV), sem (семафоры), shm (разделяемая память) и, возможно, другие, в зависимости от того, что он делает.

Я предлагаю в первый раз включить SELinux, но в разрешающем (см. Setenforce 0)

Я бы также предложил инструменты, которые помогут вам построить какую-то политику, может быть немного сложно написать в основном raw M4

2 голосов
/ 09 октября 2008

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

1 голос
/ 09 октября 2008

SELinux может сделать эту работу; Вы можете назначить разрешения для определенных программ для использования определенных системных вызовов. Отказывая в доступе open, pipe и другим, вы сможете делать именно то, что вы описываете.

Второй возможный путь - использовать возможность LD_PRELOAD и предоставить свой собственный open, pipe и т. Д. функции. Это не на 100% безопасно, так как программа все еще может обращаться к системным вызовам более напрямую (при условии, что это потенциально враждебная программа)

1 голос
/ 09 октября 2008

Если вы root, вы можете выполнить chroot в каталог, удалить привилегии, чтобы у вас больше не было доступа на запись в файловую систему, а затем выполнить exec. Это не позволит программе создавать новые файлы. Но нет никакого способа помешать программе создавать каналы и сокеты (ну, в SELinux невозможны сокеты), и нет способа предотвратить перестановку программы и закрытие файловых дескрипторов.

Ну, я полагаю, вы могли бы использовать ptrace, чтобы перехватить все системные вызовы, и разрешить только те, которые вы одобряете, поэтому когда я говорю "нет пути", я имею в виду "нет простого пути". Это влечет за собой заметные накладные расходы, но если вы достаточно осторожны, вы можете сделать это безопасно. Проекты strace или UMview могут стать хорошей отправной точкой, если вы решите пойти по этому пути.

...