Aperfeiçoando Modelos MMIO pra Uma Segurança Melhor em Sistemas Embarcados
Melhorando os testes de fuzz em sistemas embarcados ao aprimorar modelos de MMIO.
― 9 min ler
Índice
- O Problema com os Modelos Atuais
- Solução Proposta
- Sistemas Embarcados e Sua Importância
- Fuzzing de Caixa Cinza Explicado
- Desafios em Emular Sistemas Embarcados
- Importância dos Modelos de MMIO
- A Necessidade de Melhoria
- Fluxo de Trabalho do Método Proposto
- Desafios Principais
- Sintaxe dos Pedaços de Dados
- Semântica dos Pedaços de Dados
- Avaliação
- Conclusão
- Fonte original
- Ligações de referência
Sistemas embarcados estão em todo lugar hoje em dia. Eles coletam informações importantes dos usuários e ajudam a tomar decisões críticas. Por causa disso, a segurança deles é vital. Se esses sistemas forem vulneráveis, podem colocar as informações pessoais e a segurança de milhões de usuários em risco. Um método usado para testar sistemas embarcados é chamado de fuzzing de caixa cinza. Esse método roda o Firmware em um ambiente simulado, permitindo testes eficientes.
Mas, quando se testa nesses ambientes, o fuzzer não consegue acessar o hardware real conectado ao firmware. Então, ele precisa entender como o firmware interage com esse hardware para garantir que cobre o máximo de código possível. O foco de muitos métodos atuais é modelar a maneira como o firmware se comunica com o hardware usando algo chamado I/O mapeado na memória (MMIO).
O Problema com os Modelos Atuais
Os modelos atuais de MMIO usados em fuzzer de firmware têm dificuldade em descrever com precisão como o firmware lê dados de Periféricos. Isso cria lacunas na cobertura do código, dificultando a identificação de bugs ou vulnerabilidades. Os modelos existentes geralmente não levam em conta situações onde o firmware recupera pedaços de dados por meio de várias leituras. Essa limitação se destaca por duas razões principais.
Primeiro, a maioria dos modelos atuais não reconhece o estado do sistema, ou seja, não consegue diferenciar várias leituras do mesmo registro MMIO. Isso é importante porque os pedaços de dados podem consistir em bytes diferentes que seguem regras diferentes. Em segundo lugar, quando uma leitura de MMIO é atribuída a um modelo, ela permanece fixa durante o teste. Isso significa que o modelo não consegue se adaptar a como o firmware processa os dados que lê, que pode mudar dependendo do contexto.
Solução Proposta
Para resolver esses problemas, um novo método é proposto para refinar os modelos de MMIO. Essa nova abordagem constrói um modelo de MMIO adaptável que pode mudar com base no contexto em que o firmware opera. Funciona usando um fuzzer de firmware para gerar modelos junto com os casos de teste. Após os testes, o fuzzer roda com o caso de teste de maior cobertura para coletar um rastreamento de execução.
Esse rastreamento vai guiar a criação de modelos MMIO que são stateful e adaptáveis. O objetivo do processo alternado entre o fuzzer e o refinamento é aumentar a cobertura durante o Fuzz Testing. O método proposto foi avaliado usando firmwares populares e mostrou melhorias na cobertura sem reduzir significativamente a eficácia em outros casos.
Sistemas Embarcados e Sua Importância
Sistemas embarcados são dispositivos de computação especializados que realizam funções ou tarefas dedicadas. Eles podem ser encontrados em várias aplicações, desde eletrodomésticos até máquinas industriais. À medida que esses sistemas se tornam cada vez mais integrados à vida diária, sua segurança se torna de extrema importância. Vulnerabilidades em sistemas embarcados podem levar a grandes violações de privacidade e segurança.
Dado seu uso crescente, é crucial detectar vulnerabilidades em sistemas embarcados de forma eficiente. O fuzzing é um método popular para isso. Ele gera entradas aleatórias para testar programas, procurando por possíveis travamentos ou paradas.
Fuzzing de Caixa Cinza Explicado
No fuzzing de caixa cinza, o fuzzer tem conhecimento parcial do código sendo testado. Ele utiliza feedback das execuções anteriores para criar entradas melhores com o tempo. Esse feedback geralmente vem da Cobertura de Código, que mede quanto do código do programa foi executado com as entradas testadas. Mais cobertura de código significa uma chance maior de descobrir novos bugs.
Quando aplicado a sistemas embarcados, o fuzzing de caixa cinza usa ambientes emulados para rodar o firmware sem precisar de hardware real. Esse método se tornou popular pela facilidade de gerar novos fuzzer, permitindo testes escaláveis. No entanto, o emulador precisa entender como o hardware pretendido do firmware se comporta.
Desafios em Emular Sistemas Embarcados
O desafio com a maioria dos emuladores é que nenhum emulador único contém todo o conhecimento necessário sobre os variados periféricos de hardware usados em sistemas embarcados. Isso levou ao desenvolvimento de plugins de emulador para criar um ambiente simulado onde o firmware possa interagir com seus periféricos pretendidos.
A maior parte dessas soluções se concentra em modelar MMIO, uma maneira comum de o firmware interagir com periféricos. MMIO usa endereços de memória para se comunicar com hardware. Existem normalmente três tipos de registros MMIO: registros de controle, registros de status e registros de dados.
- Registro de Controle (CR): Usado para configurar o comportamento do hardware.
- Registro de Status (SR): Relata o status atual de um periférico.
- Registro de Dados (DR): Contém dados de sensores ou comandos enviados para atuadores.
Cada tipo lida com dados de forma diferente, e essa diferença no manuseio de dados torna a modelagem deles de forma precisa bem desafiadora. Enquanto alguns modelos podem lidar efetivamente com interações básicas, eles têm dificuldade quando se trata de casos mais complexos, especialmente quando é necessário recuperar e processar pedaços de dados.
Importância dos Modelos de MMIO
Ter modelos de MMIO precisos é essencial para um fuzzer garantir que pode testar efetivamente o firmware. Se um modelo não consegue descrever corretamente como o firmware interage com seus periféricos, o fuzzer pode perder partes significativas do código. Isso resulta em uma chance menor de identificar vulnerabilidades e bugs.
Os modelos atuais de MMIO se saem bem em lidar com acessos de dados básicos, mas falham ao lidar com estruturas de dados mais complicadas. Por exemplo, em muitas situações, o firmware pode depender da leitura de múltiplos bytes para formar um pacote de dados completo. Se os modelos não refletirem isso corretamente, isso limita severamente a eficácia do fuzzer.
A Necessidade de Melhoria
Há uma necessidade de refinar os modelos de MMIO atuais para melhorar sua precisão. Modelos existentes podem descrever alguns aspectos das interações do firmware com periféricos, mas muitas vezes não são adaptáveis. Essa rigidez dificulta para o fuzzer detectar vulnerabilidades, especialmente quando o contexto de processamento do firmware muda.
Modelos stateful e adaptáveis têm o potencial de aprimorar o fuzz testing ao refletir com precisão o que acontece durante a execução do firmware. Ao incorporar contexto, os modelos conseguem descrever com mais precisão como os pedaços de dados são formados e processados.
Fluxo de Trabalho do Método Proposto
O método proposto busca refinar os modelos de MMIO em uso para representar melhor as interações do firmware com seus periféricos. O processo começa com o fuzzer de firmware gerando modelos MMIO iniciais e casos de teste ao realizar fuzz-testing no firmware de um sistema embarcado.
Em seguida, o sistema instrumenta um harness de teste que gera rastreamentos de execução detalhados com base na execução do firmware com a entrada de maior cobertura. Esses rastreamentos capturam informações importantes sobre quais partes do firmware foram executadas, junto com as leituras de MMIO associadas.
As informações de rastreamento são então usadas para agrupar leituras de MMIO que estão associadas a um pedaço de dados completo. Essa agrupamento é crucial para criar um modelo que capture com precisão como os dados são processados em diferentes contextos.
Por fim, os modelos stateful refinados são registrados para uso em rodadas subsequentes de fuzz-testing. Ao repetir esse processo, o método melhora iterativamente a cobertura de código do fuzzer de firmware.
Desafios Principais
Construir modelos precisos traz seu próprio conjunto de desafios. Ao desenvolver modelos MMIO stateful e adaptáveis, a abordagem deve abordar dois desafios principais: codificar a sintaxe e a semântica dos pedaços de dados que estão sendo processados.
Sintaxe dos Pedaços de Dados
Primeiro, deve refletir com precisão a sintaxe de como os dados estão estruturados dentro do firmware. Os modelos precisam considerar as dependências entre leituras individuais do mesmo registro MMIO. Isso significa modelar como diferentes bytes de um pedaço de dados podem seguir regras diferentes.
Agrupar leituras efetivamente durante o processo de construção do modelo é vital para alcançar esse objetivo. O sistema deve garantir que as leituras estejam agrupadas de uma maneira que reflita sua relação e como contribuem para formar um pedaço de dados completo.
Semântica dos Pedaços de Dados
Em segundo lugar, os modelos devem levar em conta a semântica dos dados. A interpretação do que um pedaço de dados significa pode mudar dependendo do contexto. Para lidar com isso dinamicamente, o método gera modelos mais simples com base em contextos diferentes durante a execução e então os mescla em um único modelo adaptável.
Ao abordar o problema dessa maneira, o objetivo é cobrir mais do código do firmware embarcado durante o fuzz-testing, levando a uma melhor identificação de vulnerabilidades e bugs.
Avaliação
O novo método foi implementado e avaliado para determinar sua eficácia em melhorar a cobertura de código dos fuzzer de firmware existentes. Em avaliações preliminares, o método mostrou resultados promissores, aumentando significativamente a cobertura de código em vários casos de firmware testados.
Por exemplo, em alguns casos, o novo método conseguiu melhorar a cobertura em até 160%. Isso foi alcançado sem reduzir significativamente a cobertura em outras versões de firmware que foram testadas.
Conclusão
À medida que os sistemas embarcados continuam a se tornar mais prevalentes na sociedade, garantir sua segurança é de extrema importância. O método proposto visa refinar a maneira como os fuzzer interagem com o firmware embarcado, melhorando a precisão dos modelos de MMIO. Ao transitar de modelos sem estado para modelos stateful e adaptáveis, aumenta a capacidade dos fuzzer de cobrir mais código, melhorando assim sua eficácia em identificar vulnerabilidades.
O processo demonstra a importância da modelagem adaptativa ao testar firmware e destaca o potencial para melhorias contínuas nas técnicas de teste de segurança. Com a evolução contínua dos sistemas embarcados, a necessidade de métodos de teste robustos só crescerá, tornando os avanços no fuzzing de firmware uma área crítica de pesquisa.
Título: ES-FUZZ: Improving the Coverage of Firmware Fuzzing with Stateful and Adaptable MMIO Models
Resumo: Grey-box fuzzing is widely used for testing embedded systems (ESes). The fuzzers often test the ES firmware in a fully emulated environment without real peripherals. To achieve decent code coverage, some state-of-the-art (SOTA) fuzzers infer the memory-mapped I/O (MMIO) behavior of peripherals from the firmware binary. We find the thus-generated MMIO models stateless, fixed, and poor at handling ES firmware's MMIO reads for retrieval of a data chunk. This leaves ample room for improving the code coverage. We propose ES-Fuzz to enhance the coverage of firmware fuzz-testing with stateful MMIO models that adapt to the fuzzer's coverage bottleneck. ES-Fuzz runs concurrently with a given fuzzer and starts a new run whenever the fuzzer's coverage stagnates. It exploits the highest-coverage test case in each run and generates new stateful MMIO models that boost the fuzzer's coverage at that time. We have implemented ES-Fuzz upon Fuzzware and evaluated it with 24 popular ES firmware. ES-Fuzz is shown to improve Fuzzware's coverage by up to $47\%$ and find new bugs in these firmware.
Autores: Wei-Lun Huang, Kang G. Shin
Última atualização: 2024-09-13 00:00:00
Idioma: English
Fonte URL: https://arxiv.org/abs/2403.06281
Fonte PDF: https://arxiv.org/pdf/2403.06281
Licença: https://creativecommons.org/licenses/by-nc-sa/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.