Недавно автор стандартной библиотеки Cosmopolitan C и платформы Redbean объявил о реализации механизма изоляции pledge() для Linux.
Разработанная изначально проектом OpenBSD , утилита pledge позволяет выборочно запрещать приложениям доступ к неиспользуемым системным вызовам (создавая белый список системных вызовов для приложения и запрещая другие вызовы). В отличие от механизмов контроля доступа к системным вызовам, доступных в Linux, таких как seccomp, pledge изначально разработана с учетом максимального удобства для пользователя.
Неудачная инициатива по изоляции приложений в базовой среде OpenBSD с помощью механизма systrace продемонстрировала, что изоляция на уровне отдельных системных вызовов слишком сложна и трудоемка.
В качестве альтернативы было предложено использовать механизм «залога», который позволял создавать правила изоляции без углубления в детали и манипулирования подготовленными классами доступа.
Например, предлагаются следующие классы: stdio (ввод/вывод), rpath (файлы только для чтения), wpath (запись файлов), cpath (создание файлов), tmppath (работа с временными файлами), inet (сетевые сокеты), unix (сокеты unix). ), dns (разрешение DNS), getpw (доступ на чтение к пользовательской базе данных), ioctl (вызов ioctl), proc (управление процессами), exec (процессы запуска) и id (управление разрешениями).
Правила работы с системными вызовами задаются в виде аннотаций, содержащих список разрешенных классов системных вызовов и массив путей к файлам, к которым разрешен доступ. После компиляции и запуска модифицированного приложения ядро берет на себя задачу контроля за соблюдением указанных правил.
Отдельно разрабатывается реализация залога для FreeBSD, которая отличается возможностью изолировать приложения без внесения изменений в их код, в то время как в OpenBSD вызов залога направлен на тесную интеграцию с базовой средой и добавление аннотаций в код каждого из них.
Обещание похоже на запретный плод, которого мы все жаждем, когда босс говорит, что мы должны использовать такие вещи, как Linux. Почему это имеет значение? Это потому, что залог () на самом деле делает безопасность понятной. В Linux никогда не было уровня безопасности, понятного простым смертным.
Разработчики порта Pledge для Linux последовали примеру FreeBSD и вместо внесения изменений в код подготовили дополнительную утилиту с сайта pledge.com, которая позволяет применять ограничения без изменения кода приложения. Например, чтобы запустить утилиту curl с доступом только к системным классам вызовов stdio, rpath, inet и threadstdio, просто выполните команду `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.
Эта утилита работает на всех дистрибутивах Linux, начиная с RHEL6 , и не требует прав root. Кроме того, на основе библиотеки cosmopolitan предоставляется API для управления ограничениями в программном коде на языке C, позволяющий, помимо прочего, создавать анклавы для выборочного ограничения доступа к определенным функциям приложения.
В прошлом было несколько разработчиков, которые пытались это сделать. Я не буду называть имен, потому что большинство этих проектов так и не были завершены. Когда дело доходит до SECOMP, онлайн-учебники объясняют только, как внести системные вызовы в белый список, поэтому большинство людей теряют интерес, прежде чем выяснят, как фильтровать аргументы. В проектах, которые продвигались вперед, также были упущения, такие как возможность изменения битов setuid/setgid/sticky. Поэтому не следует использовать ни одну из существующих альтернатив. Я думаю, что это усилие приближает нас к залогу(), чем когда-либо прежде.
Реализация не требует изменений ядра: ограничения утилит транслируются в правила SECCOMP BPF и обрабатываются с использованием встроенного в Linux механизма изоляции системных вызовов. Например, вызов promise("stdio rpath", 0) преобразуется в фильтр BPF.
Наконец, если вас интересует более подробная информация, вы можете найти ее по следующей ссылке.