Нещодавно автор стандартної бібліотеки Cosmopolitan C та платформи Redbean оголосив про реалізацію механізму ізоляції pledge() для Linux.
Спочатку розроблений проектом OpenBSD , Pledge дозволяє вибірково забороняти програмам доступ до невикористовуваних системних викликів (створюючи білий список системних викликів для програми та забороняючи інші виклики). На відміну від механізмів контролю доступу до системних викликів, доступних у 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 спрямований на тісну інтеграцію з базовим середовищем і додавання анотацій до коду. кожного з них.
Запорука — це як заборонений плід, якого ми всі прагнемо, коли бос каже, що ми повинні використовувати такі речі, як Linux. Чому це має значення? Це тому, що pledge() насправді робить безпеку зрозумілою. У Linux ніколи не було рівня безпеки, зрозумілого простим смертним.
Розробники порту Linux pledge наслідували приклад 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. Тому не слід використовувати жодну з існуючих альтернатив. Я думаю, що ці зусилля наблизили нас до pledge(), ніж будь-коли раніше.
Реалізація не потребує змін ядра: обмеження утиліт транслюються в правила SECCOMP BPF і обробляються за допомогою власного механізму ізоляції системних викликів Linux. Наприклад, виклик promise("stdio rpath", 0) перетворить на фільтр BPF
Зрештою, якщо ви зацікавлені дізнатися більше, ви можете знайти деталі за наступним посиланням.