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

Авторът на стандартната C-библиотека 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, която се отличава с възможността за изолация на приложения без making изменения в техния код, докато в 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 за управление на ограниченията в кода на приложения, написани на C, което позволява също така създаването на анклави за селективно ограничаване на достъпа, свързан с конкретни функции на приложението.

Реализацията не изисква промени в ядрото — ограниченията на 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster