Проект по портированию механизма изоляции pledge для Linux

Автор стандартной Си-библиотеки Cosmopolitan и платформы Redbean объявил о реализации механизма изоляции pledge() для Linux. Изначально pledge разработан проектом OpenBSD и позволяет выборочно запретить приложениям обращения к неиспользуемым системным вызовам (для приложения формируется подобие белого списка системных вызовов, а остальные вызовы запрещаются). В отличие от доступных в Linux механизмов ограничения доступа к системным вызовам, таких как seccomp, механизм pledge изначально разработан с оглядкой на максимальное упрощение применения.

Завершившаяся неудачей инициатива изоляции приложений базового окружения OpenBSD с использованием механизма systrace показала, что изоляция на уровне отдельных системных вызовов слишком сложна и трудоёмка. В качестве альтернативы был предложен pledge, который позволял создавать правила изоляции не вникая в детали и манипулируя готовыми классами доступа. Например, предлагаются классы stdio (ввод/вывод), rpath (только чтение файлов), wpath (запись файлов), cpath (создание файлов), tmppath (работа со временными файлами), inet (сетевые сокеты), unix (unix-сокеты), dns (резолвинг в DNS), getpw (доступ на чтение к базе пользователей), ioctl (вызов ioctl), proc (управление процессами), exec (запуск процессов) и id (управление правами доступа).

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

Отдельно развивается реализация pledge для FreeBSD, которая отличается возможностью изоляции приложений без внесения изменений в их код, в то время как в OpenBSD вызов pledge нацелен на тесную интеграцию с базовым окружением и добавление аннотаций в код каждого приложения.

Разработчики порта pledge для Linux воспользовались примером FreeBSD и вместо внесения изменений в код подготовили утилиту-надстройку pledge.com, позволяющую применить ограничения без изменения кода приложения. Например, для запуска утилиты curl с открытиям доступа только к классам системных вызовов stdio, rpath, inet и threadstdio достаточно выполнить “./pledge.com -p ‘stdio rpath inet thread’ curl https://example.com”.

Утилита pledge работает во всех дистрибутивах Linux, начиная с RHEL6, и не требует root-доступа. Дополнительно на базе библиотеки cosmopolitan предоставляется API для управления ограничениями в коде программ на языке Си, позволяющий в том числе создавать анклавы для выборочного ограничения доступа в привязке к определённым функциям приложения.

Реализация не требует внесения изменений в ядро – ограничения pledge транслируются в правила SECCOMP BPF и обрабатываются при помощи родного для Linux механизма изоляции системных вызовов. Например, вызов pledge(“stdio rpath”, 0) будет преобразован в BPF-фильтр

Release. Ссылка here.