[Tradução] Por que um programa eBPF funciona em um kernel, mas não em outro

[Tradução] Por que um programa eBPF funciona em um kernel, mas não em outro

Este artigo explora os desafios de criar programas eBPF portáveis que funcionem em diferentes versões do kernel Linux. Ele aborda o problema das mudanças nas estruturas de dados do kernel e como o BPF CO-RE (Compile Once – Run Everywhere) e o BTF (BPF Type Format) podem ser usados para resolver esse problema, além de alternativas para kernels sem suporte a BTF.

MundiX News·13 de abril de 2026·10 min de leitura·👁 2 views

Neste artigo, vamos discutir como criar programas eBPF verdadeiramente portáveis.

Em um mundo ideal, todos os sistemas estariam totalmente atualizados, com patches aplicados regularmente e executando a versão mais recente do kernel. Mas sejamos realistas, isso raramente acontece. Alguns ambientes ainda usam versões desatualizadas do Ubuntu ou Fedora, e em outros, o kernel nem sequer é compilado com suporte a BTF (BPF Type Format). E se você oferece suporte a alguma ferramenta de código aberto, a situação se torna ainda mais complexa. Você não tem controle sobre em qual sistema os usuários executarão seu programa.

Tudo isso torna mais difícil garantir que seus programas eBPF funcionem de forma estável em diferentes distribuições e afeta diretamente se sua ferramenta eBPF será usada ou não. Então, como tornar os programas eBPF verdadeiramente portáveis?

Para entender melhor o problema, vamos considerar um exemplo hipotético. Suponha que você compile um programa eBPF no kernel versão 5.3, mas ele não é executado na versão 5.4. Por quê? Porque cada versão do kernel vem com seus próprios arquivos de cabeçalho do kernel, que definem as estruturas de dados e o layout da memória. Mesmo pequenas alterações nessas definições podem quebrar os programas eBPF.

Tomemos, por exemplo, as estruturas. Digamos que temos uma estrutura representando o cabeçalho TCP no kernel 5.3:

c
struct tcp_header {
 __be16 source_port;
 __be16 dest_port;
 __be32 seq_number;
 __be32 ack_number;
 // ...
};

Na próxima versão do kernel, 5.4, os desenvolvedores do kernel podem decidir mover esses campos para uma nova estrutura, renomear o campo seq para sequence ou simplesmente mover esses campos para cima ou para baixo, alterando seu deslocamento:

c
struct tcp_header {
 struct tcp_ports ports;
 __be32 seq_number;
 __be32 ack_number;
 // ...
};

struct tcp_ports {
 __be16 source_port;
 __be16 dest_port;
};

Consegue ver o problema? Seu código pode depender de campos ou deslocamentos específicos, e eles podem mudar de versão para versão do kernel. Como o próprio programa eBPF não pode influenciar tais mudanças, surge uma necessidade natural de uma solução que garanta a portabilidade dos programas eBPF.

Se você pesquisar informações na internet, encontrará muitos materiais que recomendam o uso de BPF CO-RE (Compile Once – Run Everywhere, "compile uma vez – execute em qualquer lugar") para resolver este problema. Em outras palavras, em vez de escrever programas assim:

c
bpf_probe_read(dest, size, src);

Você deve substituir a família de funções auxiliares (helpers) BPF_PROBE_READ() pela família BPF_CORE_READ(), que permite acessar os campos das estruturas de forma que esse acesso seja automaticamente ajustado para diferentes versões do kernel:

c
bpf_core_read(dest, size, src);

Em resumo, a família de helpers BPF_CORE_READ() permite realizar leituras portáveis de estruturas do kernel. Isso significa que, se um determinado campo de uma estrutura (por exemplo, filename no exemplo) estiver em um deslocamento diferente em outro sistema operacional ou versão do kernel, essas funções ainda serão capazes de encontrá-lo e lê-lo corretamente.

Por baixo dos panos, isso funciona graças às informações de realocação BPF CO-RE e BTF (BPF Type Format).

Espere um pouco, o quê? Informações de realocação CO-RE? BTF?

Se você observar praticamente qualquer código eBPF industrial, notará que o arquivo de cabeçalho vmlinux.h é incluído em todos os lugares. Este arquivo contém as definições de todas as estruturas do kernel, como trace_event_raw_sys_enter do exemplo acima, geradas com base no kernel em execução atual.

💡 Este arquivo de cabeçalho pode ser gerado usando o comando:

bash
bpftool btf dump file /sys/kernel/btf/vmlinux format c > vmlinux.h

E aqui começa o mais interessante — este arquivo de cabeçalho contém várias linhas especiais tanto no início quanto no fim:

c
#pragma clang attribute push(__attribute__((preserve_access_index)), apply_to = any(record, enum, union))

// ... definições de estrutura ...

#pragma clang attribute pop

Na parte superior de vmlinux.h, você verá a linha __attribute((preserve_access_index)), que informa ao compilador que é necessário adicionar informações de realocação BPF CO-RE (Compile Once – Run Everywhere) para cada campo de estrutura que seu programa eBPF acessa, no arquivo objeto eBPF. Em outras palavras, quando você acessa um campo de estrutura do kernel (por exemplo, filename no exemplo fornecido), o compilador não apenas fixa seu deslocamento. Em vez disso, ele salva metadados — como o nome do campo, seu tipo, deslocamento e estrutura pai — na estrutura bpf_core_relo.

O atributo clang attribute push garante que esta regra se aplique a todas as definições de estrutura até o correspondente clang attribute pop no final do arquivo.

A estrutura de realocação BPF CO-RE (ou, se preferir, informações de realocação) inclui os seguintes campos:

  • insn_off: indica a instrução à qual a realocação se aplica, por exemplo, a instrução que define o valor do registro.
  • type_id: refere-se aos metadados BTF (BPF Type Format) que descrevem a estrutura da estrutura de kernel de destino.
  • access_str_off: especifica como acessar um campo específico em relação à estrutura.

Para o exemplo de tracepoint acima, as informações BTF se parecem com isto:

bash
bpftool btf dump id <prog-btf-id>

Para que seu programa eBPF funcione em diferentes versões do kernel, onde o layout das estruturas pode ser diferente, o kernel de destino também deve ser compilado com suporte a BTF. Sem isso, o programa não conseguirá determinar os deslocamentos de campo corretos em tempo de execução.

Por que isso é necessário?

Quando seu programa eBPF é carregado usando um carregador BPF, como libbpf, o carregador compara os dados BTF do programa com os dados BTF do kernel de destino. Em seguida, ele mapeia os tipos, atualiza os deslocamentos e ajusta o acesso aos campos para que o programa possa ler os dados do kernel corretamente. Este processo é chamado de realocação de deslocamento de campo (field offset relocation).

Uma das limitações não óbvias desta abordagem é que as ferramentas que usam dados BTF dependem implicitamente de que o kernel de destino seja construído com suporte a BTF.

Verifique se o seu kernel tem suporte a BTF:

bash
ls /sys/kernel/btf/vmlinux

Sem suporte a BTF no kernel de destino, o carregador não poderá realizar a realocação de deslocamento de campo e o programa não será carregado ou funcionará incorretamente.

Mas existe alguma maneira de se livrar dessa dependência?

Sim, existe.

Agora vou mostrar como.

A Aqua Security mantém um repositório btfhub-archive, que coleta arquivos BTF prontos para um amplo conjunto de kernels que não contêm BTF integrado. Você pode baixar os arquivos BTF apropriados para os kernels que deseja suportar e incorporá-los diretamente em seu programa eBPF. Isso elimina completamente a necessidade de suporte a BTF no sistema de destino.

Neste ponto, poderíamos parar e mostrar um exemplo simples de como isso é feito, mas eu fui um pouco mais longe. No meu repositório no GitHub, compilei uma solução completa que:

  • gera um esqueleto eBPF para meu programa de exemplo
  • carrega e incorpora automaticamente dados BTF de btfhub-archive para todas as versões de kernel e sistemas operacionais suportados
  • minimiza os dados BTF, deixando apenas os tipos que são realmente usados no programa eBPF de exemplo
  • cria um único arquivo executável que pode ser executado em uma ampla gama de kernels sem a necessidade de suporte a BTF no sistema de destino

Adicionei muitos detalhes e comentários úteis ao repositório, então certifique-se de dar uma olhada lá se quiser se aprofundar no assunto ou adaptar esta solução para suas tarefas.

Se você já se deparou com o fato de que o código está vinculado a detalhes específicos do kernel, então é hora de entender não apenas o eBPF, mas também a estrutura do Linux mais profundamente. O curso "Desenvolvimento do Kernel Linux" ajuda a construir esta base na prática: desde a arquitetura do kernel e módulos até estruturas de dados, sincronização, interrupções e gerenciamento de memória. Este é o nível de compreensão que permite trabalhar com confiança com mecanismos de baixo nível e tarefas de sistema complexas.

Faça o teste introdutório para descobrir se o programa do curso é adequado para você. Até 30 de abril, há um desconto de 15% no curso para quem passar no teste com sucesso.

Para se familiarizar com o formato de treinamento e os especialistas, participe das aulas gratuitas:

  • 14 de abril, 20:00. "Grafana Stack — fechando todas as necessidades modernas de Observabilidade".
  • 21 de abril, 20:00. "Listas encadeadas no kernel Linux: da API ao código real".

Assista a mais aulas de demonstração de professores sobre infraestrutura e muito mais no calendário de eventos.

🛡️⚡

Pare de pesquisar. Comece a hackear.

O MundiX é seu copiloto de pentest com IA: comandos exatos, análise de outputs e próximo passo na kill chain — em segundos.

Testar grátis por 7 dias →

Sem cartão para começar · Planos a partir de R$49/mês

📤 Compartilhar & Baixar

🧰 Ferramentas recomendadas

Divulgação: alguns links são patrocinados. Podemos receber comissão se você comprar — sem custo extra para você. Só indicamos o que faz sentido para a comunidade.

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Aprendendo Kali Linux: Teste de segurança, pentest e hacking ético

Com centenas de ferramentas pré-instaladas, a distribuição Kali Linux facilita o trabalho de os profissionais de segurança começarem a fazer testes de segurança rapidamente. No entanto, com mais de 600 ferramentas em seu arsenal, o Kali Linux também pode ser desafiador. A nova edição deste prático livro abrange as atualizações nas ferramentas e inclui uma melhor abordagem da análise forense e da engenharia reversa. Ric Messier, autor, não fica apenas no teste de segurança, mas também faz uma abordagem sobre a execução de análise forense, incluindo a análise em disco e na memória, assim como alguma análise básica de malware. • Explore as diversas ferramentas disponíveis no Kali Linux • Entenda o valor do teste de segurança e examine os tipos de teste disponíveis • Aprenda os aspectos básicos do pentest em todo o ciclo de vida do ataque • Instale o Kali Linux em vários sistemas, tanto físicos quanto virtuais • Descubra como usar diferentes ferramentas destinadas à segurança • Estruture um teste de segurança baseado nas ferramentas do Kali Linux • Estenda as ferramentas do Kali para criar técnicas de ataque avançadas • Use o Kali Linux para ajudar a criar relatórios quando o teste terminar “A abordagem concisa, clara e baseada na experiência adotada por Ric Messier para a introdução do Kali Linux e dos testes de cibersegurança é incomparável. Este livro é uma leitura excelente e acessível para iniciantes e um recurso valioso para qualquer pessoa.” —Alexander Arlt, Consultor sênior de segurança, Google

Ver na Amazon
Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Gshield 2 em 1 Hub Extensor Conector USB-C + USB-A e Adaptador de Rede Ethernet LAN RJ45 com 3 Entradas USB 3.0 até 5 Gbps em Liga de Alumínio para Computador e Notebook, Cinza

Compatível com portas USB-C e USB-A, ideal para ampliar a conectividade de dispositivos como MacBook Pro e outros com portas USB-C. Inclui um adaptador USB-A extra, proporcionando uma conexão Ethernet estável e veloz de até 1 Gbps, perfeita para filmes, jogos online e videoconferências. Oferece três portas USB 3.0 com velocidades de transferência de até 5 Gbps, permitindo conectar mouse, teclado, discos rígidos e outros periféricos. Fabricado em alumínio durável, garantindo longa vida útil e resistência ao uso diário. Design compacto e leve, ideal para viagens de negócios e uso diário, facilitando o transporte e armazenamento. Funciona com Windows 10/8.1/8, Mac OS e Chrome OS, oferecendo versatilidade incomparável para diversas necessidades de conectividade. Assegura uma conectividade estável e rápida, perfeita para tarefas exigentes como transferência de dados, streaming e mais.

Ver na Amazon
Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs: Breaking Web Application Programming Interfaces

Hacking APIs is a crash course on web API security testing that will prepare you to penetration-test APIs, reap high rewards on bug bounty programs, and make your own APIs more secure. You'll learn how REST and GraphQL APIs work in the wild and set up a streamlined API testing lab with Burp Suite and Postman. Then you'll master tools useful for reconnaissance, endpoint analysis, and fuzzing, such as Kiterunner and OWASP Amass. Next, you'll learn to perform common attacks, like those targeting an API's authentication mechanisms and the injection vulnerabilities commonly found in web applications. You'll also learn techniques for bypassing protections against these attacks. In the book's nine guided labs, which target intentionally vulnerable APIs, you'll practice: Enumerating APIs users and endpoints using fuzzing techniques Using Postman to discover an excessive data exposure vulnerability Performing a JSON Web Token attack against an API authentication process Combining multiple API attack techniques to perform a NoSQL injection Attacking a GraphQL API to uncover a broken object level authorization vulnerability

Ver oferta
Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition

Up-to-date strategies for thwarting the latest, most insidious network attacks This fully updated, industry-standard security resource shows, step by step, how to fortify computer networks by learning and applying effective ethical hacking techniques. Based on curricula developed by the authors at major security conferences and colleges, the book features actionable planning and analysis methods as well as practical steps for identifying and combating both targeted and opportunistic attacks. Gray Hat Hacking: The Ethical Hacker's Handbook, Sixth Edition clearly explains the enemy's devious weapons, skills, and tactics and offers field-tested remedies, case studies, and testing labs. You will get complete coverage of Internet of Things, mobile, and Cloud security along with penetration testing, malware analysis, and reverse engineering techniques. State-of-the-art malware, ransomware, and system exploits are thoroughly explained. Fully revised content includes 7 new chapters covering the latest threats Includes proof-of-concept code stored on the GitHub repository Authors train attendees at major security conferences, including RSA, Black Hat, Defcon, and B-Sides

Ver na Amazon
Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Bloqueador USB de privacidade de porta USB para PC, notebook, bloco de laptop,

Proteção de privacidade aprimorada: protege o link de transmissão de dados para evitar roubo de informações, fornecendo proteção de segurança robusta que protege a privacidade do usuário durante transferências de arquivos e garante uma conexão segura para interações de dispositivos sem preocupações em vários ambientes Uso a longo prazo: a camada protetora resistente ao desgaste, combinada com um corpo de metal resistente, oferece gerenciamento de calor confiável e qualidade duradoura durante o uso diário Entrega eficiente de energia: a tecnologia de chip inteligente garante a identificação automática dos requisitos de energia, fornecendo carregamento eficiente alinhando-se com vários protocolos de carregamento rápido para maior conveniência Proteção contra sobrecarga: evitando riscos de sobrecarga, este bloqueador de dados USB protege a vida útil da bateria e garante um desempenho estável, mantendo um fluxo estável de energia para melhorar a longevidade do dispositivo de forma eficaz Prático de transportar: com atenção à portabilidade, este bloqueador de dados USB oferece um design compacto que é leve e fácil de transportar, melhorando a conveniência do usuário e operação eficiente

Ver na Amazon

📩 Newsletter MundiX

Receba novidades de cibersegurança + um checklist de pentest grátis. Sem spam.

Ao assinar você concorda em receber e-mails. Cancele quando quiser.