Проект 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 в други проекти. За общо агрегиранe на данни от няколко процеса се поддържа създаването на съвместни 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