Byl představen projekt bpftime, který vyvíjí runtime a virtuální stroj pro provádění eBPF handlerů v uživatelském prostoru. Bpftime umožňuje spouštět eBPF programy pro sledování a zasahování do činnosti procesů kompletně v uživatelském prostoru, přičemž využívá možnosti, jako jsou uprobe a softwarové zachytávání systémových volání. Je zdůrazněno, že díky vyloučení zbytečných přepínání kontextu umožňuje bpftime dosáhnout desetinásobného snížení režijních nákladů ve srovnání s využíváním funkcionality uprobe a uretprobe, kterou poskytuje jádro Linuxu. Kromě toho bpftime výrazně usnadňuje ladění, potenciálně může být použit na systémech bez jádra Linuxu a nevyžaduje rozšířená oprávnění, potřebná k načtení eBPF aplikace do jádra. Kód projektu je napsán v jazycích C/C++ a je distribuován pod licencí MIT.
Zachytávání systémových volání a integrace uprobe kontrol implementována za použití techniky přepisování spustitelného kódu (binary rewriting), při které jsou volání systémových volání, vstupní body a lokální funkce nahrazeny přechodem k ladicím handlerům prostřednictvím modifikace strojového kódu prováděné aplikace, což je výrazně efektivnější než organizace zachytávání pomocí uprobe na úrovni jádra Linuxu.
Podporovány jsou operace nahrazování nebo modifikace funkcí, připojování handlerů (hooků) a filtrů, přesměrování, blokování nebo nahrazování parametrů systémových volání, zachytávání vstupních a výstupních bodů funkcí, stejně jako nahrazování handleru na libovolném offsetu v kódu. Bpftime může být připojen k jakémukoli běžícímu procesu v systému bez potřeby jejich restartování nebo přebudování. Vložení bpftime do procesů může být prováděno pro běžící procesy pomocí ptrace, a pro načítané pomocí LD_PRELOAD.
V rámci bpftime se vyvíjí runtime, který umožňuje připojování eBPF programů k bodům sledování systémových volání a uprobe; virtuální stroj eBPF s JIT pro samostatné provádění eBPF programů na úrovni uživatelského procesu (podporována je také AOT-kompilace); běžící proces pro interakci s jádrem a organizaci kompatibility s podsystemem jádra uprobe (bpftime podporuje režim načítání eBPF do uživatelského prostoru z jádra pro zajištění spolupráce s eBPF programy v jádře, které se používají například pro zpracování kprobe nebo pro nastavení síťových filtrů).
Virtuální stroj eBPF je poskytován jako knihovna a nabízí API podobné ubpf, což umožňuje jeho použití pro integraci funkcí eBPF do dalších projektů. Pro agregaci dat z několika procesů je podporováno vytváření sdílených eBPF Map umístěných ve sdílené paměti. Spolu s bpftime mohou být použity standardní eBPF zpracovatele napsané pro použití v jádře, a pro sestavení mohou být použity standardní nástroje založené na clang a libbpf.
S bpftime v uživatelském prostoru mohou běžet systémy sledování jako BCC, bpftrace a Deepflow. Například byl demonstrován příklad použití skriptu sslsniff z rámce BCC pro analýzu a uchování šifrovaného provozu v nginx. V provedených testech výkon nginx při provádění sslsniff na úrovni jádra klesl o 58%, zatímco při přenesení zpracovatele do uživatelského prostoru o 12,3%.
Architektura sledování procesů s použitím originálního eBPF v jádře:

Architektura sledování v uživatelském prostoru s použitím bpftime:

Hybridní režim, v němž bpftime pracuje společně s eBPF v jádře, například pro nastavení síťových filtrů nebo přesunutí jednotlivých zpracovatelů do uživatelského prostoru:

Z plánů do budoucna se uvádí: možnost vkládání výjimek (Fault Injection); horké překrývání patchů (Hot Patching) pro změnu logiky práce nebo opravy chyb v binárních sestaveních; vytvoření modulu pro Nginx, který umožňuje vytvářet rozšíření pomocí eBPF programů (například pro dynamický výběr tras, cachování, uplatňování bezpečnostních politik a vyvažování zátěže); rozšíření schopností subsystému FUSE (například vytváření rozšíření k FS pro cachování nebo řízení přístupu ve formě eBPF programů).
Zdroj: opennet.ru
