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