Проект по портированию механизма изоляции pledge для Linux
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Автор стандартной Си-библиотеки 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 http://example.com".
Утилита pledge работает во всех дистрибутивах Linux, начиная с RHEL6, и не требует root-доступа. Дополнительно на базе библиотеки cosmopolitan предоставляется API для управления ограничениями в коде программ на языке Си, позволяющий в том числе создавать анклавы для выборочного ограничения доступа в привязке к определённым функциям приложения.
Реализация не требует внесения изменений в ядро - ограничения pledge транслируются в правила SECCOMP BPF и обрабатываются при помощи родного для Linux механизма изоляции системных вызовов. Например, вызов pledge("stdio rpath", 0) будет преобразован в BPF-фильтр
static const struct sock_filter kFilter[] = {
/* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1),
/* L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])),
/* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0),
/* L3*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4),
/* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])),
/* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800),
/* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0),
/* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8),
/* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])),
/* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0),
/*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0),
/*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11),
/*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW),
/*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)),
/*L14*/ /* next filter */
};
===========
Источник:
OpenNet.RU
===========
Похожие новости
- Главная ссылка к новости (https://justine.lol/pledge/...)
- OpenNews: Для FreeBSD развивается механизм изоляции, похожий на pledge и unveil
- OpenNews: Выпуск OpenBSD 7.0
- OpenNews: В Firefox для OpenBSD реализована поддержка unveil
- OpenNews: OpenBSD развивает Pledge, новый механизм изоляции приложений
- OpenNews: Планы по усилению механизма защиты W^X в OpenBSD
Похожие новости:
- Релиз дистрибутива Rocky Linux 9.0, развиваемого основателем CentOS
- Google представил сборку Rocky Linux, оптимизированную для Google Cloud
- Обновление сборки DogLinux для проверки оборудования
- Создатель GeckoLinux представил новый дистрибутив SpiralLinux
- Выпуск дистрибутива EuroLinux 9.0, совместимого с Red Hat Enterprise Linux
- Предварительный выпуск Oracle Linux 9
- Проект browser-linux развивает дистрибутив Linux для запуска в web-браузере
- В конце июня будут проведены детско-юношеские соревнования по Linux
- Ещё одна уязвимость в подсистеме ядра Linux Netfilter
- Компания Paragon Software возобновила сопровождение модуля NTFS3 в ядре Linux
Теги для поиска: #_pledge, #_linux, #_chroot, #_syscall, #_limit
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:54
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Автор стандартной Си-библиотеки 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 http://example.com". Утилита pledge работает во всех дистрибутивах Linux, начиная с RHEL6, и не требует root-доступа. Дополнительно на базе библиотеки cosmopolitan предоставляется API для управления ограничениями в коде программ на языке Си, позволяющий в том числе создавать анклавы для выборочного ограничения доступа в привязке к определённым функциям приложения. Реализация не требует внесения изменений в ядро - ограничения pledge транслируются в правила SECCOMP BPF и обрабатываются при помощи родного для Linux механизма изоляции системных вызовов. Например, вызов pledge("stdio rpath", 0) будет преобразован в BPF-фильтр static const struct sock_filter kFilter[] = {
/* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1), /* L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8), /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* next filter */ }; =========== Источник: OpenNet.RU =========== Похожие новости
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 08:54
Часовой пояс: UTC + 5