Proiectul bpftime dezvoltă o implementare eBPF, care funcționează în spațiul utilizatorului

A fost prezentat proiectul bpftime, care dezvoltă un runtime și o mașină virtuală pentru executarea handler-elor eBPF în spațiul utilizatorului. Bpftime permite executarea completă a programelor eBPF de trasare și intervenție în procesele din spațiul utilizatorului, utilizând funcționalități precum uprobe și interceptarea programatică a apelurilor de sistem. Se observă că, prin eliminarea comutărilor de context inutile, bpftime permite obținerea unei reduceri de zece ori a cheltuielilor indirecte în comparație cu utilizarea funcționalității uprobe și uretprobe furnizate de kernel-ul Linux. În plus, bpftime simplifică semnificativ depanarea, poate fi aplicat pe sisteme fără kernel Linux și nu necesită privilegii extinse necesare pentru încărcarea aplicației eBPF în kernel. Codul proiectului este scris în limbajele C/C++ și este distribuit sub licența MIT.

Interceptarea apelurilor de sistem și integrarea verificărilor uprobe sunt realizate folosind tehnica rescrierii codului executabil (binary rewriting), prin care apelurile la sistemele de apel, punctele de intrare și funcțiile locale sunt înlocuite cu salturi către handler-e de depanare prin modificarea codului mașinii aplicației executate, ceea ce este mult mai eficient decât organizarea interceptării utilizând uprobe la nivelul kernel-ului Linux.

Sunt acceptate operații de înlocuire sau modificare a funcțiilor, atașarea handler-elor (hook-urilor) și a filtrilor, redirecționarea, blocarea sau înlocuirea parametrilor apelurilor de sistem, interceptarea punctelor de intrare și de ieșire din funcții, precum și înlocuirea handler-ului la o deplasare arbitrară în cod. Bpftime poate fi atașat la orice proces în execuție în sistem fără a fi necesară repornirea sau recompilarea acestora. Înlocuirea bpftime în procese poate fi realizată pentru procesele aflate în execuție prin ptrace, iar pentru cele care sunt încărcate prin LD_PRELOAD.

În cadrul bpftime se dezvoltă un runtime care permite atașarea programelor eBPF la punctele de trasare ale apelurilor de sistem și uprobe; mașină virtuală eBPF cu JIT pentru execuția separată a programelor eBPF la nivelul procesului utilizator (se suportă suplimentar compilarea AOT); un proces de fundal pentru interacțiunea cu nucleul și organizarea compatibilității cu subsistemul uprobe al nucleului (bpftime suportă modul de încărcare a eBPF în spațiul utilizator din nucleu pentru a colabora cu programele eBPF din nucleu, utilizate, de exemplu, pentru procesarea kprobe sau stabilirea filtrelor de rețea).

Mașina virtuală eBPF este realizată sub forma unei biblioteci plug-in și oferă un API similar cu ubpf, ceea ce permite utilizarea ei pentru integrarea funcționalității eBPF în alte proiecte. Pentru agregarea sumară a datelor din mai multe procese, se suportă crearea de hărți eBPF comune, plasate în memorie partajată. Împreună cu bpftime, pot fi utilizate manipulatoare standard eBPF, scrise pentru utilizarea în nucleu, iar pentru compilare se pot aplica instrumente standard bazate pe clang și libbpf.

Cu bpftime în spațiul utilizator, pot fi executate sisteme de urmărește precum BCC, bpftrace și Deepflow. De exemplu, a fost demonstrată utilizarea scriptului sslsniff din cadrul BCC pentru analizarea și salvarea traficului criptat în nginx. În testele realizate, performanța nginx la efectuarea sslsniff în nucleu scade cu 58%, iar atunci când manipulatoarele sunt mutate în spațiul utilizator cu 12,3%.

Arhitectura de urmărire a proceselor utilizând eBPF original în nucleu:

Proiectul bpftime dezvoltă o implementare eBPF, care funcționează în spațiul utilizatorului

Arhitectura de urmărire în spațiul utilizator utilizând bpftime:

Proiectul bpftime dezvoltă o implementare eBPF, care funcționează în spațiul utilizatorului

Modul hibrid, în care bpftime funcționează împreună cu eBPF în nucleu, de exemplu, pentru stabilirea filtrelor de rețea sau mutarea unor manipulatoare în spațiul utilizator:

Proiectul bpftime dezvoltă o implementare eBPF, care funcționează în spațiul utilizatorului

Printre planurile de viitor se notează: posibilitatea de a introduce excepții (Fault Injection); aplicarea de patch-uri la cald (Hot Patching) pentru a modifica logica de funcționare sau a corecta erori în versiunile binare; crearea unui modul pentru Nginx care să permită crearea de extensii folosind programe eBPF (de exemplu, pentru selectarea dinamică a rutei, caching, aplicarea politicilor de securitate și balansarea încărcăturii); extinderea capacităților subsistemului FUSE (de exemplu, crearea sub formă de programe eBPF a extensiilor FS pentru caching sau gestionarea accesului).

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster