Il progetto bpftime sviluppa un'implementazione di eBPF che opera nello spazio utente

È stato presentato il progetto bpftime, che sviluppa un runtime e una macchina virtuale per l'esecuzione di gestori eBPF nello spazio utente. Bpftime consente l'esecuzione di programmi eBPF per il tracciamento e l'intercettazione di processi interamente nello spazio utente, utilizzando funzionalità come uprobe e intercettazioni programmatiche delle chiamate di sistema. Si segnala che, eliminando i passaggi di contesto superflui, bpftime consente di ottenere una riduzione delle spese generali dieci volte inferiore rispetto all'utilizzo delle funzionalità uprobe e uretprobe fornite dal kernel Linux. Inoltre, bpftime semplifica notevolmente il debug, può essere utilizzato su sistemi senza kernel Linux e non richiede privilegi elevati necessari per caricare un'applicazione eBPF nel kernel. Il codice del progetto è scritto in C/C++ e distribuito sotto licenza MIT.

L'intercettazione delle chiamate di sistema e l'integrazione delle verifiche uprobe sono state implementate utilizzando tecniche di riscrittura del codice binario (binary rewriting), in cui le chiamate alle chiamate di sistema, ai punti di ingresso e alle funzioni locali vengono sostituite con passaggi a gestori di debug attraverso la modifica del codice macchina dell'applicazione in esecuzione, risultando significativamente più efficiente rispetto all'organizzazione dell'intercettazione mediante uprobe a livello del kernel Linux.

Sono supportate operazioni di sostituzione o modifica di funzioni, attacco di gestori (hook) e filtri, reindirizzamento, blocco o sostituzione dei parametri delle chiamate di sistema, intercettazione dei punti di ingresso e uscita dalle funzioni, nonché sostituzione di gestori a un offset arbitrario nel codice. Bpftime può essere attaccato a qualsiasi processo in esecuzione nel sistema senza la necessità di riavviarli o ricompilarli. La sostituzione di bpftime nei processi può essere effettuata per processi in esecuzione tramite ptrace e per quelli caricati tramite LD_PRELOAD.

Nel contesto di bpftime si sviluppa un runtime che consente di attaccare programmi eBPF ai punti di tracciamento delle chiamate di sistema e agli uprobe; macchina virtuale eBPF con JIT per l'esecuzione isolata di programmi eBPF a livello di processo utente (supporto aggiuntivo per la compilazione AOT); un processo in background per interagire con il kernel e garantire la compatibilità con il sottosistema uprobe del kernel (bpftime supporta la modalità di caricamento eBPF nello spazio utente dal kernel per facilitare la cooperazione con i programmi eBPF nel kernel, utilizzati, ad esempio, per l'elaborazione di kprobe o per l'impostazione di filtri di rete).

La macchina virtuale eBPF è progettata come una libreria plug-in e fornisce un'API simile a ubpf, consentendo di integrarne le funzionalità in altri progetti. Per l'aggregazione complessiva dei dati da più processi, è supportata la creazione di eBPF Map condivisi, collocati nella memoria condivisa. Insieme a bpftime è possibile utilizzare gestori eBPF standard, scritti per l'uso nel kernel, e per la compilazione possono essere impiegati strumenti standard basati su clang e libbpf.

Con bpftime nello spazio utente possono essere eseguiti sistemi di tracciamento come BCC, bpftrace e Deepflow. Ad esempio, è stato dimostrato l'uso dello script sslsniff del framework BCC per analizzare e salvare il traffico crittografato in nginx. Nei test condotti, le prestazioni di nginx durante l'esecuzione di sslsniff nel kernel vengono ridotte del 58%, mentre spostando il gestore nello spazio utente si riducono del 12,3%.

Architettura di tracciamento dei processi utilizzando l'originale eBPF nel kernel:

Il progetto bpftime sviluppa un'implementazione di eBPF che opera nello spazio utente

Architettura di tracciamento nello spazio utente utilizzando bpftime:

Il progetto bpftime sviluppa un'implementazione di eBPF che opera nello spazio utente

Modalità ibrida in cui bpftime lavora insieme a eBPF nel kernel, ad esempio per l'impostazione di filtri di rete o il trasferimento di gestori singoli nello spazio utente:

Il progetto bpftime sviluppa un'implementazione di eBPF che opera nello spazio utente

Tra i piani futuri si segnalano: la possibilità di iniettare eccezioni (Fault Injection); l'applicazione di patch a caldo (Hot Patching) per modificare la logica operativa o correggere errori nelle build binarie; la creazione di un modulo per Nginx che consenta di generare estensioni mediante programmi eBPF (ad esempio, per la selezione dinamica dei percorsi, caching, applicazione di politiche di sicurezza e bilanciamento del carico); l'espansione delle capacità del sottosistema FUSE (ad esempio, la creazione di estensioni al FS sotto forma di programmi eBPF per caching o gestione degli accessi).

Fonte: opennet.ru

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster