Проектът bpftime развива реализация eBPF, работеща в потребителското пространство

Представен е проектът bpftime, който развива runtime и виртуална машина за изпълнение на обработчици eBPF в потребителското пространство. Bpftime позволява изпълнението на цели eBPF програми за трасировка и намеса в работата на процеси в потребителското пространство, използващи функции като uprobe и софтуерно прихващане на системни повиквания. Съобщава се, че благодарение на изключването на излишни превключвания на контекста, bpftime позволява десетократно намаляване на разходите в сравнение с използването на функционалността uprobe и uretprobe, предоставяна от ядрото на Linux. Освен това, bpftime значително улеснява дебъгинга, потенциално може да се прилага на системи без ядро на Linux и не изисква разширени привилегии, необходимите за зареждане на eBPF приложение в ядрото. Кодът на проекта е написан на езиците C/C++ и се разпространява под лицензия MIT.

Прихващането на системни повиквания и интеграцията на uprobe проверки са реализирани с използването на техника за презапис на изпълняемия код (binary rewriting), при която обажданията към системни повиквания, точки на вход и местни функции се заменят с преход към отладъчни обработчици чрез модификация на машинния код на изпълняваното приложение, което е значително по-ефективно от организирането на прихващане с използване на uprobe на ниво ядро на Linux.

Поддържат се операции по замяна или изменение на функции, прикрепяне на обработчици (hook-ове) и филтри, пренасочване, блокиране или замяна на параметри на системни повиквания, прихващане на точки на вход и изход от функции, а също и подмяна на обработчик на произволно местоположение в кода. Bpftime може да бъде прикрепен към всеки работещ процес в системата без необходимост от тяхното рестартиране или преизграждане. Подмяната на bpftime в процесите може да се извърши за работещи процеси чрез ptrace, а за зареждащи се чрез LD_PRELOAD.

В рамките на bpftime се развива runtime, който позволява прикрепянето на eBPF програми към точки на трасировка на системни повиквания и uprobe; виртуална машина eBPF с JIT за отделно изпълнение на eBPF програми на ниво потребителски процес (допълнително се поддържа AOT компилация); фонова програма за взаимодействие с ядрото и осигуряване на съвместимост с подсистемата uprobe на ядрото (bpftime поддържа режим на зареждане на eBPF в пространството на потребителя от ядрото, за да се осигури съвместна работа с eBPF програми в ядрото, използвани, например, за обработка на kprobe или поставяне на мрежови филтри).

Виртуалната машина eBPF е проектирана като динамична библиотека и предлага API, подобен на ubpf, което позволява използването ѝ за интегриране на функционалността на eBPF в други проекти. За сумарно агрегиране на данни от няколко процеса се поддържа създаването на споделени eBPF Map, разположени в споделена памет. В комбинация с bpftime могат да се използват стандартни eBPF обработвачи, написани за използване в ядрото, а за компилация могат да се прилагат стандартни инструменти, базирани на clang и libbpf.

С bpftime в пространството на потребителя могат да се изпълняват системи за трасировка като BCC, bpftrace и Deepflow. Например, демонстрирано е приложението на скрипта sslsniff от фреймворка BCC за анализ и запазване на шифрован трафик в nginx. В проведените тестове производителността на nginx при изпълнение на sslsniff от ядрото намалява с 58%, а при изнасяне на обработвача в пространството на потребителя с 12.3%.

Архитектура на трасировка на процеси с използване на оригиналното eBPF в ядрото:

Проектът bpftime развива реализация eBPF, работеща в потребителското пространство

Архитектура на трасировка в пространството на потребителя с използване на bpftime:

Проектът bpftime развива реализация eBPF, работеща в потребителското пространство

Хибриден режим, в който bpftime работи в сътрудничество с eBPF в ядрото, например за поставяне на мрежови филтри или изнасяне на отделни обработвачи в пространството на потребителя:

Проектът bpftime развива реализация eBPF, работеща в потребителското пространство

От плановете за бъдеще се отбелязват: възможност за поставяне на изключения (Fault Injection); горещо налагане на корекции (Hot Patching) за промяна на логиката на работа или поправяне на грешки в бинарни сборки; създаване на модул за Nginx, позволяващ изграждане на разширения с помощта на eBPF програми (например за динамичен избор на маршрути, кеширане, прилагане на политики за сигурност и балансиране на натоварването); разширяване на възможностите на подсистемата FUSE (например създаване във вид на eBPF програми на разширения към файлови системи за кеширане или управление на достъпа).

Източник: opennet.ru

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