fsfuzz e mangle
Quer ajudar a achar bugs no kernel? Especialmente em sistema de arquivos?
Uma maneira simples é usar o fsfuzz.
Basicamente, é só construir o binário e executar ‘mkdir /media && ./fsfuzz’ como root. Mas você vai ter que conhecer um pouco sobre kernel para saber fazer o bug report corretamente e ATENÇÃO: você pode peder seus dados.
O fsfuzz é composto de um programa em C e três scripts em bash, ele funciona assim:
- Um sistema de arquivos é criado em um arquivo
- Esse arquivo é aberto e bytes randômicos são escritos de maneira aleatória
- O arquivo (agora contendo um sistema de arquivos provavelmente corrompido) é montado no dispositivo de loop e alguns testes simples, como criação e remoção de arquivos, são executados
No pior caso o sistema de arquivos sendo testado vai explodir, mas outros erros não esperados são possíveis. Alguns bugs já descobertos podem ser encontrados aqui e aqui.
Se o script principal (fsfuzz) for executado sem argumentos, os testes rodarão para os sistemas de arquivos ext3, ext2, cramfs e swap (este último tem testes diferentes, claro) se as ferramentas para manipulação dos mesmos estiverem disponíveis em seu sistema. Mas você também pode especificar um sistema de arquivos na linha de comando. Leia o README para mais informações.
O principal componente do fsfuzz é um programinha em C, chamado mangle. Ele é o responsável por executar o passo número 2 na explicação acima e faz exatamente isto: abre um arquivo e espalha bytes randômicos nele.
Por padrão os bytes randômicos são escritos nos primeiros 1K bytes do arquivo (onde costumam residir cabeçalhos em arquivos binários) mas isso é configurável através de opções de linha de comando. Você pode até especificar um offset, que determina onde o mangle deve começar a escrever.
O mangle também pode ser usado em outras áreas do kernel. Por exemplo, você pode rodá-lo em um binário e depois tentar executá-lo (isso irá testar o código que carrega o binário).
E não é só isso!
Como você provavelmente já percebeu, o mangle pode ser usado em qualquer programa que aceite um arquivo como entrada. O mplayer por exemplo, rode o mangle em um arquivo mp3 ou avi e tente rodá-lo. Que tal o arquivo de configuração do Apache? E o interpretador Python?
As possibilidades são muitas, e para programas em user-level o comportamento esperado é que eles identifiquem o problema e tomem alguma ação, como imprimir uma mensagem de erro e sair. Se o programa travar, ganhar uma falha de segmentação ou qualquer outro comportamento bizarro, guarde o arquivo que você usou para reproduzir o problema e reporte o bug para o mantenedor do programa.
Note que todos esses testes não estão restritos ao Linux. O mangle deve compilar em qualquer Unix (se houver problemas com mmap() é fácil escrever uma versão com lseek() e write()) e você também pode rodar o mangle em arquivos do Windows no Linux e depois tentar usá-los no Windows (eg, arquivos .doc e binários).
Muito bom, não? :-)