banner

Blog

Aug 07, 2023

Utilizza la nostra suite di librerie eBPF

Home » Rete di Blogger di sicurezza » Utilizza la nostra suite di librerie eBPF

Di Artem Dinaburg

Trail of Bits ha sviluppato una suite di librerie open source progettate per semplificare la creazione e l'implementazione delle applicazioni eBPF. Queste librerie facilitano il monitoraggio efficiente dei processi e degli eventi di rete, il tracciamento delle funzioni, l'analisi dei simboli di debug del kernel e la generazione di codice eBPF.

In precedenza, l’implementazione di applicazioni eBPF portatili e prive di dipendenze poneva sfide significative a causa delle disparità tra le versioni del kernel Linux e della necessità di strumenti esterni per la traduzione del bytecode da C a eBPF. Abbiamo affrontato questi problemi con le nostre librerie innovative, che utilizzano le più recenti funzionalità eBPF e del kernel Linux per ridurre le dipendenze esterne. Questi strumenti, ideali per creare agenti on-machine e abilitare il monitoraggio nativo del cloud, sono gestiti attivamente e compatibili con una varietà di distribuzioni Linux e versioni del kernel. Alcuni sono addirittura parte integrante della funzionalità di osquery, il rinomato framework di visibilità degli endpoint.

Le librerie di questa suite sono linuxevents, ebpfpub, btfparse ed ebpf-common. Insieme possono essere utilizzati per sviluppare un monitoraggio ottimizzato degli eventi con un elevato grado di precisione ed efficienza. Le loro applicazioni spaziano dal monitoraggio degli eventi di rete, al tracciamento delle funzioni e all'analisi dei simboli di debug del kernel, all'assistenza nella generazione e nell'utilizzo del codice eBPF.

La libreria linuxevents mostra come eBPF può monitorare gli eventisenza richiedere intestazioni del kernel precise o altre dipendenze esterne . Niente più intestazioni del kernel spedite, copie multiple di bytecode eBPF precompilato o dipendenze da BCC! La libreria linuxevents supporta la generazione di codice runtime per creare sonde personalizzate in fase di runtime, non solo durante la compilazione. È anche molto più veloce del tradizionale hook basato su chiamate di sistema, una caratteristica essenziale quando si monitorano eventi da più contenitori su una singola macchina. Come fa LinuxEvents a farlo?

Innanzitutto, linuxevents utilizza i dati di debug BTF del kernel Linux (tramite la nostra libreria btfparse) per identificare accuratamente i prototipi di funzioni e le strutture dei dati del kernel. Ciò consente agli eventi Linux di adattarsi automaticamente alle variazioni nel layout della struttura dei dati e di agganciare simboli arbitrari non pubblici in un modo che semplifica notevolmente il tracciamento.

Questo approccio è più veloce dell'hooking tradizionale basato sulle chiamate di sistema, non solo perché deve agganciare meno cose (sched_process_exec vs execve, execveat, ecc.) ma anche perché può evitare costose correlazioni. Ad esempio, per tracciare quale programma su disco viene eseguito tramite execve, normalmente si dovrebbe correlare un descrittore di file passato a execve con una chiamata open e più chiamate chdir per ottenere il percorso completo di un programma. La correlazione è computazionalmente costosa, soprattutto su una macchina con più contenitori attivi. La libreria linuxevents utilizza un'accurata rappresentazione della struttura dati del kernel per agganciare solo una funzione ed estrarre semplicemente il percorso dal livello vfs del kernel.

Una registrazione della libreria linuxevents utilizzata come parte dell'esempio execsnoop fornito con la libreria

La libreria linuxevents è ancora una prova di concetto; è utilizzato da Osquery come esperimento attivabile. La libreria dispone anche di un esempio canonico di tracciamento dei processi eseguiti con visibilità tra contenitori.

La libreria ebpfpub consente di monitorare le chiamate di sistema su più versioni del kernel Linux facendo affidamento su dipendenze di runtime esterne minime. In ebpfpub, le sonde eBPF vengono generate automaticamente da prototipi di funzioni definite tramite un semplice linguaggio personalizzato, che può essere creato da descrittori di tracepoint. Questo approccio richiedeva intestazioni adeguate per il kernel in esecuzione e comportava penalità in termini di prestazioni, come la necessità di abbinare i descrittori di file con le chiamate di sistema.

A seconda dell'evento di destinazione desiderato, ebpfpub può utilizzare i tracepoint del kernel, i kprobes o gli uprobes come meccanismo di tracciamento sottostante. La libreria include i seguenti esempi:

La libreria ebpfpub è attualmente utilizzata da osquery per acquisire eventi di processi e socket tracciando le chiamate di sistema eseguite. Sebbene ebpfpub sia ancora mantenuto e utile in circostanze specifiche (come la necessità di supportare kernel più vecchi e utilizzare la generazione di codice runtime), i nuovi progetti dovrebbero invece utilizzare l'approccio linuxevents.

CONDIVIDERE