banner

blog

Aug 07, 2023

Use nosso conjunto de bibliotecas eBPF

Home » Rede de Bloggers de Segurança » Use nosso conjunto de bibliotecas eBPF

Por Artem Dinaburg

A Trail of Bits desenvolveu um conjunto de bibliotecas de código aberto projetadas para agilizar a criação e implantação de aplicações eBPF. Essas bibliotecas facilitam o monitoramento eficiente de processos e eventos de rede, rastreamento de funções, análise de símbolos de depuração de kernel e geração de código eBPF.

Anteriormente, a implantação de aplicativos eBPF portáteis e livres de dependências representava desafios significativos devido às disparidades de versão do kernel Linux e à necessidade de ferramentas externas para tradução de bytecode C para eBPF. Resolvemos esses problemas com nossas bibliotecas inovadoras, que usam os recursos mais recentes do eBPF e do kernel Linux para reduzir dependências externas. Essas ferramentas, ideais para criar agentes na máquina e permitir o monitoramento nativo da nuvem, são mantidas ativamente e compatíveis com uma variedade de distribuições Linux e versões de kernel. Alguns são até parte integrante da funcionalidade do osquery, a renomada estrutura de visibilidade de endpoint.

As bibliotecas neste conjunto são linuxevents, ebpfpub, btfparse e ebpf-common. Juntos, eles podem ser usados ​​para desenvolver monitoramento simplificado de eventos com alto grau de precisão e eficiência. Suas aplicações variam desde monitoramento de eventos de rede, rastreamento de funções e análise de símbolos de depuração de kernel até assistência na geração e uso de código eBPF.

A biblioteca linuxevents mostra como o eBPF pode monitorar eventossem exigir cabeçalhos de kernel precisos ou outras dependências externas . Chega de envio de cabeçalhos de kernel, múltiplas cópias de bytecode eBPF pré-compilado ou dependências de BCC! A biblioteca linuxevents oferece suporte à geração de código em tempo de execução para criar testes personalizados em tempo de execução, não apenas durante a construção. Também é muito mais rápido do que a captura tradicional baseada em chamadas de sistema, um recurso essencial ao monitorar eventos de vários contêineres em uma única máquina. Como o linuxevents faz isso?

Primeiro, linuxevents usa os dados de depuração BTF do kernel Linux (por meio de nossa biblioteca btfparse) para identificar com precisão protótipos de funções e estruturas de dados do kernel. Isso permite que os eventos linux se ajustem automaticamente às variações no layout da estrutura de dados e conectem símbolos não públicos arbitrários de uma forma que simplifica bastante o rastreamento.

Essa abordagem é mais rápida do que a conexão tradicional baseada em chamadas de sistema, não apenas porque precisa conectar menos coisas (sched_process_exec vs execve, execveat, etc.), mas também porque pode evitar correlações caras. Por exemplo, para rastrear qual programa no disco é executado via execve, normalmente seria necessário correlacionar um descritor de arquivo passado para execve com uma chamada aberta e múltiplas chamadas chdir para obter o caminho completo de um programa. A correlação é computacionalmente cara, especialmente em uma máquina com vários contêineres ativos. A biblioteca linuxevents usa uma representação precisa da estrutura de dados do kernel para conectar apenas uma função e simplesmente extrair o caminho da camada vfs do kernel.

Uma gravação da biblioteca linuxevents sendo usada como parte do exemplo execsnoop que vem com a biblioteca

A biblioteca linuxevents ainda é uma prova de conceito; está em uso pelo osquery como um experimento alternável. A biblioteca também possui um exemplo canônico de rastreamento de processos executados com visibilidade entre contêineres.

A biblioteca ebpfpub permite monitorar chamadas do sistema em várias versões do kernel Linux, contando com dependências mínimas de tempo de execução externo. No ebpfpub, os testes eBPF são gerados automaticamente a partir de protótipos de funções definidos por meio de uma linguagem personalizada simples, que pode ser criada a partir de descritores de tracepoint. Essa abordagem exigia cabeçalhos adequados para o kernel em execução e trazia penalidades de desempenho, como a necessidade de combinar descritores de arquivo com chamadas de sistema.

Dependendo do evento de destino desejado, o ebpfpub pode usar tracepoints de kernel, kprobes ou uprobes como mecanismo de rastreamento subjacente. A biblioteca inclui os seguintes exemplos:

A biblioteca ebpfpub é atualmente usada pelo osquery para capturar eventos de processos e soquetes rastreando chamadas de sistema executadas. Embora o ebpfpub ainda seja mantido e útil em circunstâncias específicas (como a necessidade de suportar kernels mais antigos e usar a geração de código em tempo de execução), novos projetos devem usar a abordagem linuxevents.

COMPARTILHAR