Simple Science

Ciência de ponta explicada de forma simples

# Informática# Criptografia e segurança# Engenharia de software

Avanços nos Testes de eBPF: O Fuzzer de Runtime BPF

Uma nova ferramenta melhora os testes de programas eBPF e identifica vulnerabilidades.

― 6 min ler


Testes de eBPF FicaramTestes de eBPF FicaramMais DifíceiseBPF.Novo fuzzer encontra falhas críticas no
Índice

EBPF, que significa "extended Berkeley Packet Filter," é uma tecnologia usada no sistema operacional Linux. Ela permite que os usuários executem programas diretamente no kernel, que é a parte central do sistema operacional. Essa função é útil para várias tarefas, como rede, segurança e monitoramento do sistema. Como os programas eBPF podem ser executados no kernel, eles oferecem flexibilidade e eficiência.

Mas essa capacidade também traz riscos novos. Se alguém fornecer um programa eBPF malicioso, ele pode explorar fraquezas do sistema. Para se proteger contra isso, os programas precisam passar por uma verificação de segurança feita por um componente chamado verifier eBPF antes de serem executados.

A Segurança dos Programas eBPF

O verifier eBPF é essencial para garantir que os programas sejam seguros para execução. Ele verifica cada programa eBPF para se certificar de que não vai travar o sistema ou acessar a memória de forma errada. Se um programa não passar nessa verificação, ele não será permitido de rodar.

O desafio é que, apesar dessas medidas de segurança, Vulnerabilidades ainda podem existir dentro do sistema eBPF. Encontrar e corrigir essas fraquezas é crucial para manter a integridade do sistema. Um método promissor para descobrir esses problemas é o Fuzzing.

O que é Fuzzing?

Fuzzing é uma técnica de teste usada para descobrir bugs ou vulnerabilidades em softwares. Ela envolve fornecer dados aleatórios ou inesperados a um programa para ver como ele se comporta. Se o programa travar ou agir de forma inesperada, isso indica que pode haver uma falha a ser investigada.

As ferramentas atuais de fuzzing mostraram-se ineficazes em testar o runtime eBPF de forma completa. Por exemplo, uma ferramenta, o Syzkaller, tem dificuldades para encontrar problemas em programas eBPF devido aos checagens rígidas impostas pelo verifier. É aí que entra uma nova ferramenta, conhecida como BPF Runtime Fuzzer.

O BPF Runtime Fuzzer

O BPF Runtime Fuzzer foi projetado para superar as limitações de ferramentas existentes como o Syzkaller. Ele pretende criar programas eBPF que possam passar pelas verificações do verifier, garantindo ao mesmo tempo que os programas gerados sejam úteis para testar os componentes do runtime eBPF.

O BPF Runtime Fuzzer é capaz de gerar programas eBPF mais expressivos em comparação com os produzidos pelo Syzkaller. Em testes, mostrou-se capaz de executar significativamente mais programas eBPF do que o Syzkaller no mesmo período de tempo. Além disso, identificou vulnerabilidades com sucesso, demonstrando sua eficácia nos testes.

Como os Programas eBPF Funcionam

Para entender como os programas eBPF operam, é importante olhar para seu fluxo de trabalho. Existem três etapas principais nesse processo: carregar, anexar e executar.

Carregar

A primeira etapa envolve carregar o programa eBPF no kernel. Esse processo requer a criação de estruturas de dados e a resolução de referências a outros recursos. O verifier eBPF então verifica o programa quanto à segurança. Se o verifier aprovar, o programa pode ser executado.

Anexar

Uma vez carregado, o programa eBPF precisa ser anexado a pontos específicos no kernel conhecidos como hooks. Esses hooks são onde o programa pode ser acionado por eventos no sistema.

Executar

Por fim, quando os eventos apropriados ocorrem, o kernel executará os programas eBPF anexados. Durante a execução, o programa pode interagir com vários recursos fornecidos pelo kernel, como armazenar dados ou ler da memória.

A Importância de Gerar Programas eBPF Válidos

Gerar programas eBPF válidos que possam passar pelo verifier é crucial para um fuzzing eficaz. O BPF Runtime Fuzzer aborda isso elaborando cuidadosamente programas que atendam às condições exigidas.

Ele garante que os programas sigam as regras rigorosas impostas pelo verifier, o que os torna mais seguros para execução. Como resultado, o fuzzer pode testar de maneira mais eficaz o runtime eBPF e descobrir vulnerabilidades.

Superando Desafios no Fuzzing de eBPF

Existem desafios significativos em fuzzing com sucesso os programas eBPF. O BPF Runtime Fuzzer enfrenta esses obstáculos focando em três áreas principais:

1. Gerar Programas Válidos

O fuzzer cria programas eBPF semanticamente corretos. Ao elaborar cuidadosamente esses programas, ele garante que possam passar nas verificações de segurança do verifier.

2. Atender Dependências

Os programas eBPF frequentemente dependem de outras chamadas de sistema para funcionar corretamente. O fuzzer gera chamadas de sistema necessárias para garantir que os programas tenham o contexto certo para execução.

3. Acionar Execução de Programas

Para testar o runtime de forma eficaz, o fuzzer gera chamadas para anexar e acionar a execução de programas eBPF. Ao fazer isso, ele garante que o processo de teste cubra todos os componentes relevantes do runtime.

Resultados do BPF Runtime Fuzzer

Em testes práticos, o BPF Runtime Fuzzer superou o Syzkaller significativamente. Por exemplo, durante uma sessão de testes de 48 horas, ele conseguiu executar mais programas eBPF, descobrindo várias vulnerabilidades no processo.

A eficácia do BPF Runtime Fuzzer é atribuída à sua capacidade de gerar programas eBPF mais complexos e expressivos comparados aos criados por outras ferramentas. Essa complexidade permite uma exploração mais profunda das potenciais fraquezas dentro do runtime eBPF.

Descobrindo Vulnerabilidades

O BPF Runtime Fuzzer encontrou com sucesso múltiplas vulnerabilidades dentro do runtime eBPF. Algumas dessas vulnerabilidades eram significativas o suficiente para receber números CVE (Common Vulnerabilities and Exposures), indicando sua severidade.

Encontrar tais problemas é crucial porque ajuda os desenvolvedores a corrigir falhas no sistema, tornando-o mais seguro e confiável.

O Futuro do Fuzzing de Programas eBPF

À medida que a tecnologia eBPF continua a evoluir, é importante que ferramentas de fuzzing como o BPF Runtime Fuzzer se adaptem. Isso pode envolver a atualização da ferramenta para refletir mudanças no subsistema eBPF, como novos tipos de programas, funções ou outros componentes.

No entanto, a base já estabelecida pelo BPF Runtime Fuzzer facilitará a incorporação dessas atualizações com o mínimo esforço manual.

Conclusão

O BPF Runtime Fuzzer representa um avanço significativo na capacidade de testar programas eBPF de forma eficaz. Ao gerar programas válidos e expressivos, ele não apenas melhora o processo de fuzzing, mas também contribui para a segurança e estabilidade geral do kernel Linux.

Por meio de testes bem-sucedidos e da descoberta de vulnerabilidades, o BPF Runtime Fuzzer demonstrou seu potencial para melhorar a segurança da tecnologia eBPF em aplicações do mundo real. À medida que essa tecnologia cresce, ferramentas como o BPF Runtime Fuzzer desempenharão um papel crítico em garantir sua confiabilidade e segurança.

Fonte original

Título: BRF: eBPF Runtime Fuzzer

Resumo: The eBPF technology in the Linux kernel has been widely adopted for different applications, such as networking, tracing, and security, thanks to the programmability it provides. By allowing user-supplied eBPF programs to be executed directly in the kernel, it greatly increases the flexibility and efficiency of deploying customized logic. However, eBPF also introduces a new and wide attack surface: malicious eBPF programs may try to exploit the vulnerabilities in the eBPF subsystem in the kernel. Fuzzing is a promising technique to find such vulnerabilities. Unfortunately, our experiments with the state-of-the-art kernel fuzzer, Syzkaller, shows that it cannot effectively fuzz the eBPF runtime, those components that are in charge of executing an eBPF program, for two reasons. First, the eBPF verifier (which is tasked with verifying the safety of eBPF programs) rejects many fuzzing inputs because (1) they do not comply with its required semantics or (2) they miss some dependencies, i.e., other syscalls that need to be issued before the program is loaded. Second, Syzkaller fails to attach and trigger the execution of eBPF programs most of the times. This paper introduces the BPF Runtime Fuzzer (BRF), a fuzzer that can satisfy the semantics and dependencies required by the verifier and the eBPF subsystem. Our experiments show, in 48-hour fuzzing sessions, BRF can successfully execute 8x more eBPF programs compared to Syzkaller. Moreover, eBPF programs generated by BRF are much more expressive than Syzkaller's. As a result, BRF achieves 101% higher code coverage. Finally, BRF has so far managed to find 4 vulnerabilities (some of them have been assigned CVE numbers) in the eBPF runtime, proving its effectiveness.

Autores: Hsin-Wei Hung, Ardalan Amiri Sani

Última atualização: 2023-05-15 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2305.08782

Fonte PDF: https://arxiv.org/pdf/2305.08782

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes