Projekt bpftime është prezantuar, i cili zhvillon runtime dhe makinë virtuale për ekzekutimin e përpunuesve eBPF në hapësirën e përdoruesit. Bpftime lejon ekzekutimin e plotë në hapësirën e përdoruesit të programeve eBPF për gjurmimin dhe ndërhyrjen në funksionimin e proceseve, duke përdorur mundësi të tilla si uprobe dhe kapjen programore të thirrjeve sistemike. Vlerësohet se falë përjashtimit të kalimeve të panevojshme të kontekstit, bpftime arriti një ulje dhjetëfish të kostos krahasuar me funksionalitetin e ofruar nga uprobe dhe uretprobe, që ofrohet nga bërthama e Linux. Për më tepër, bpftime ndjeshëm e thjeshtëson debugimin, mund të përdoret potencialisht në sisteme pa bërthamën Linux dhe nuk kërkon privilegje të avancuara të nevojshme për ngarkimin e aplikacionit eBPF në bërthamë. Kodi i projektit është shkruar në gjuhët C/C++ dhe shpërndahet nën licencën MIT.
Kapja e thirrjeve sistemike dhe integrimi i verifikimeve uprobe janë realizuar duke përdorur teknikën e rishkrimit të kodit ekzekutiv (binary rewriting), ku thirrjet për thirrjet sistemike, pikave të hyrjes dhe funksioneve lokale zëvendësohen me kalimin në përpunuesit e debugimit përmes modifikimit të kodit makinerik të aplikacionit që ekzekutohet, që është ndjeshëm më efikase se organizimi i kapjes duke përdorur uprobe në nivelin e bërthamës Linux.
Nënkuptohen operacionet e zëvendësimit ose ndryshimit të funksioneve, bashkimin e përpunuesve (hook-ëve) dhe filtrave, ridrejtimin, bllokimin ose zëvendësimin e parametrave të thirrjeve sistemike, kapjen e pikave të hyrjes dhe daljes nga funksionet, si dhe zëvendësimin e përpunuesve në një zhvendosje të çfarëdoshme në kod. Bpftime mund të bashkohet me çdo proces që funksionon në sistem pa pasur nevojë për ripërsëritjen ose rinovimin e tij. Zëvendësimi i bpftime në procese mund të realizohet për proceset që funksionojnë përmes ptrace, dhe për ato që ngarkohen përmes LD_PRELOAD.
Në përbërje të bpftime po zhvillohet një runtime që lejon bashkimin e programeve eBPF në pikat e gjurmimit të thirrjeve sistemike dhe uprobe; makina virtuale eBPF me JIT për ekzekutimin të veçantë të programeve eBPF në nivelin e procesit të përdoruesit (për më tepër, mbështetet kompilimi AOT); një proces në sfond për ndërveprimin me bërthamën dhe organizimin e kompatibilitetit me nën-sistemin uprobe të bërthamës (bpftime mbështet modin e ngarkimit të eBPF në hapësirën e përdoruesit nga bërthama për të mundësuar bashkëpunimin me programet e eBPF në bërthamë, të përdorura, për shembull, për të përpunuar kprobe ose për të instaluar filtre rrjetesh).
Makina virtuale eBPF është e dizajnuar si një bibliotekë e ngjitur dhe ofron një API të ngjashëm me ubpf, duke e bërë atë të dobishme për integrimin e funksionalitetit eBPF në projekte të tjera. Për agregimin e përgjithshëm të të dhënave nga disa procese, mbështetet krijimi i eBPF Map-ve të përbashkëta që vendosen në memorie të ndarë. Së bashku me bpftime, mund të përdoren trajtues të standardizuar eBPF, të shkruar për përdorim në bërthamë, dhe për ndërtimin mund të përdoren mjete standarde të bazuara në clang dhe libbpf.
Me bpftime në hapësirën e përdoruesit, mund të ekzekutohen sisteme gjurmimi si BCC, bpftrace dhe Deepflow. Për shembull, është demonstruar përdorimi i skriptit sslsniff nga frameworku BCC për analizimin dhe ruajtjen e trafikut të enkriptuar në nginx. Në testet e kryera, performanca e nginx-it gjatë ekzekutimit të sslsniff në anën e bërthamës zvogëlohet me 58%, ndërsa duke e kaluar trajtuesin në hapësirën e përdoruesit zvogëlohet me 12.3%.
Arkitektura e gjurmimit të proceseve duke përdorur origjinalin eBPF në bërthamë:

Arkitektura e gjurmimit në hapësirën e përdoruesit duke përdorur bpftime:

Një mod i hibridizuar, ku bpftime punon së bashku me eBPF në bërthamë, për shembull, për të vendosur filtre rrjetesh ose për të kaluar trajtues të veçantë në hapësirën e përdoruesit:

Nga planet për të ardhmen, përmendet: mundësia e vendosjes së përjashtimeve (Fault Injection); instalimi i nxehtë i patch-eve (Hot Patching) për të ndryshuar logjikën e funksionimit ose për të riparuar gabime në ndërtimet binarë; krijimi i një moduli për Nginx, duke lejuar krijimin e zgjerimeve përmes programeve eBPF (për shembull, për zgjedhjen dinamike të rrugëve, keq-mbajtjen, zbatimin e politikave të sigurisë dhe balancimin e ngarkesës); zgjerimi i mundësive të nën-sistemit FUSE (për shembull, krijimi në formën e programeve eBPF të zgjerimeve për FS për keq-mbajtjen ose menaxhimin e aksesit).
Burimi: opennet.ru
