Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
centipede — Mecanismo de fuzzing distribuído orientado por cobertura, compatível com alvos libFuzzer; escala para milhares de tarefas concorrentes, usa sanitizers e destilação de corpus para revelar bugs. | Kitploit
Ferramentas/GitHubGitHub/dvyukov/centipede
Análise de VulnerabilidadesAnálise Dinâmica de Código (DAST)Fuzzing
GitHubdvyukov/centipede

centipede

Mecanismo de fuzzing distribuído orientado por cobertura, compatível com alvos libFuzzer; escala para milhares de tarefas concorrentes, usa sanitizers e destilação de corpus para revelar bugs.

Ver Repositório
795há 1 anoRevisado pelo Kitploit

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Centipede - um mecanismo de fuzzing distribuído. Em desenvolvimento.

Por que Centipede

Por que não? Atualmente, estamos tentando fuzzar alguns alvos muito grandes e muito lentos para os quais o libFuzzer, o AFL e afins não escalam necessariamente bem. Para um dos nossos exemplos motivadores, veja SiliFuzz. Ao trabalhar no Centipede, planejamos experimentar novas abordagens para fuzzing diferencial em escala massiva, que os mecanismos de fuzzing existentes não tentam fazer.

Recursos notáveis:

  • Suporte pronto para uso para fuzz targets baseados em libFuzzer. Para usar o seu LLVMFuzzerTestOneInput() favorito, você só precisa compilar seu alvo com as opções de compilador e linker do Centipede.

  • Em desenvolvimento. Testamos o centipede em uma pequena equipe com alguns alvos. A menos que você faça parte do projeto Centipede ou queira nos ajudar, provavelmente você ainda não quer continuar lendo.

  • Escala. A intenção é poder executar qualquer número de jobs simultaneamente, com muito pouca sobrecarga de comunicação. Atualmente testamos com 100 jobs locais e com 10 mil jobs em um cluster.

  • Fora do processo. O alvo é executado em um processo separado. Qualquer crash nele não afetará o fuzzer. O Centipede também pode ser usado em processo, mas esse modo não é o objetivo principal. Se o seu alvo for pequeno e rápido, você provavelmente ainda prefere o libFuzzer.

  • A integração com os sanitizers é alcançada por meio de builds separados. Se durante o fuzzing você quiser encontrar bugs com ASAN, MSAN ou TSAN, você precisará fornecer binários separados para cada sanitizer, além de um binário principal para o próprio Centipede. O binário principal não deve usar nenhum dos sanitizers.

  • Nenhuma parte da interface interna é estável. Tudo pode mudar nesta fase.

Terminologia

Mecanismo de fuzzing, também conhecido como fuzzer {#fuzzer}

Um programa que produz um fluxo infinito de entradas para um alvo e orquestra a execução.

Fuzz target {#target}

Um binário, uma biblioteca, uma API, ou melhor, qualquer coisa que possa consumir bytes como entrada e produzir algum tipo de dados de cobertura como saída. Um alvo do libFuzzer pode ser um alvo do Centipede. Leia mais aqui.

Entrada {#input}

Uma sequência de bytes que pode ser fornecida a um alvo. A entrada pode ser um saco arbitrário de bytes ou algum dado estruturado, por exemplo, um proto serializado.

Feature

Um número que representa algum comportamento único do alvo. Por exemplo, uma feature 1234567 pode representar o fato de que o bloco básico número 987 no alvo foi executado 7 vezes. Ao executar uma entrada com o alvo, o fuzzer coleta as features que foram observadas durante a execução.

Conjunto de features

Um conjunto de features associado a uma entrada específica.

Cobertura

Algumas informações sobre o comportamento do alvo quando ele executa uma determinada entrada. A cobertura geralmente é representada como o conjunto de features que a entrada acionou no alvo.

Mutator

Uma função que recebe bytes como entrada e produz uma pequena mutação aleatória da entrada. Veja também: fuzzing ciente de estrutura.

Executor {#executor}

Uma função que sabe como alimentar uma entrada em um alvo e obter cobertura em troca (ou seja, executar).

Centipede

Um mecanismo de fuzzing personalizável que permite ao usuário substituir o Mutator e o Executor.

Centipede runner {#runner}

Uma biblioteca que implementa a interface de executor esperada pelo fuzzer Centipede. O runner sabe como executar um alvo instrumentado com sancov, coletar a cobertura resultante e passá-la de volta ao Centipede. Futuros fuzz targets do Centipede podem ser linkados com essa biblioteca para se tornarem executáveis pelo Centipede.

Corpus (plural: corpora)

Um conjunto de entradas.

Destilação (criação de um corpus destilado)

Um processo de escolha de um subconjunto de um corpus maior, de modo que o subconjunto tenha as mesmas features de cobertura do corpus original.

Shard

Um arquivo que representa um subconjunto do corpus e outro arquivo que representa os conjuntos de features para esse mesmo subconjunto do corpus.

Mesclando shards

Mesclar o shard B no shard A significa: para cada entrada no shard B que tenha features ausentes no shard A, adicionar essa entrada a A.

Job

Um único processo de fuzzer. Um job escreve apenas em um shard, mas pode ler vários shards.

Workdir ou WD

Um diretório local ou remoto que contém dados produzidos ou consumidos por um fuzzer.

Compilar o Centipede

root@kitploit:~
git clone https://github.com/google/centipede.git
cd centipede
CENTIPEDE_SRC=`pwd`
BIN_DIR=$CENTIPEDE_SRC/bazel-bin
bazel build -c opt :all

O que você precisará para as etapas seguintes:

  • $BIN_DIR/centipede - o binário do mecanismo (o fuzzer).
  • $BIN_DIR/libcentipede_runner.pic.a - a biblioteca que você precisa linkar com seu fuzz target (o runner).
  • $CENTIPEDE_SRC/clang-flags.txt - flags de compilação recomendadas do clang para o alvo.

Você pode manter esses arquivos onde estão ou copiá-los para algum lugar.

Compilar seu fuzz target

Fornecemos dois exemplos de compilação do alvo: um alvo minúsculo de arquivo único e o libpng. Depois de compilar seu alvo, prossiga para a etapa de execução do fuzz target.

O exemplo simples

Este exemplo usa um dos fuzz targets de exemplo simples, também conhecidos como puzzles, incluídos no repositório do Centipede.

Compilar

NOTA: Os comandos abaixo usam as flags de $CENTIPEDE_SRC/clang-flags.txt. Você pode optar por usar outro conjunto de flags de instrumentação: clang-flags.txt apenas fornece uma opção padrão simples.

root@kitploit:~
FUZZ_TARGET=byte_cmp_4  # or any other source under $CENTIPEDE_SRC/puzzles
clang++ @$CENTIPEDE_SRC/clang-flags.txt -c $CENTIPEDE_SRC/puzzles/$FUZZ_TARGET.cc -o $BIN_DIR/$FUZZ_TARGET.o

Linkar

Esta etapa linka o fuzz target recém-compilado com libcentipede_runner.pic.a e outras bibliotecas necessárias.

root@kitploit:~
clang++ $BIN_DIR/$FUZZ_TARGET.o $BIN_DIR/libcentipede_runner.pic.a \
    -ldl -lrt -lpthread -o $BIN_DIR/$FUZZ_TARGET

Pule para a etapa de execução.

O exemplo do libpng

Baixar e compilar o libpng

root@kitploit:~

LIBPNG_BRANCH=v1.6.37  # You can experiment with other branches if you'd like
git clone --branch $LIBPNG_BRANCH --single-branch https://github.com/glennrp/libpng.git
cd libpng
CC=clang CFLAGS=@$CENTIPEDE_SRC/clang-flags.txt ./configure --disable-shared
make -j

Linkar o fuzz target do próprio libpng com libcentipede_runner.pic.a

root@kitploit:~
FUZZ_TARGET=libpng_read_fuzzer
clang++ -include cstdlib \
    ./contrib/oss-fuzz/$FUZZ_TARGET.cc \
    ./.libs/libpng16.a \
    $BIN_DIR/libcentipede_runner.pic.a \
    -ldl -lrt -lpthread -lz \
    -o $BIN_DIR/$FUZZ_TARGET

Executar o Centipede localmente {#run-step}

Executar localmente não dará a escala completa, mas pode ser útil durante a fase de desenvolvimento do fuzzer. Recomendamos que tanto o fuzzer quanto o alvo sejam copiados para um diretório local antes da execução, a fim de evitar sobrecarregar um sistema de arquivos de rede.

Preparar para uma execução

root@kitploit:~
WD=$HOME/centipede_run
mkdir -p $WD

NOTA: Talvez seja necessário adicionar o llvm-symbolizer ao seu $PATH para que algumas funcionalidades do Centipede funcionem. O simbolizador pode ser instalado como parte da distribuição do LLVM:

root@kitploit:~
sudo apt install llvm
which llvm-symbolizer  # normally /usr/bin/llvm-symbolizer

Executar um job de fuzzing

root@kitploit:~
rm -rf $WD/*
$BIN_DIR/centipede --binary=$BIN_DIR/$FUZZ_TARGET --workdir=$WD --num_runs=100

Veja o que há no diretório de trabalho

root@kitploit:~
tree $WD
root@kitploit:~
...
├── <fuzz target name>-d9d90139ee2ccc687f7c9d5821bcc04b8a847df5
│   └── features.0
└── corpus.0

Executar 5 jobs de fuzzing simultâneos

AVISO: Não exceda o número de núcleos da sua máquina para a flag --j.

root@kitploit:~
rm -rf $WD/*
$BIN_DIR/centipede --binary=$BIN_DIR/$FUZZ_TARGET --workdir=$WD --num_runs=100 --j=5

Veja o que há no diretório de trabalho:

root@kitploit:~
tree $WD
root@kitploit:~
...
├── <fuzz target name>-d9d90139ee2ccc687f7c9d5821bcc04b8a847df5
│   ├── features.0
│   ├── features.1
│   ├── features.2
│   ├── features.3
│   └── features.4
├── corpus.0
├── corpus.1
├── corpus.2
├── corpus.3
└── corpus.4

Destilação de corpus

Cada shard do Centipede normalmente não cobre todas as features que o corpus inteiro cobre. Para destilar o corpus, um processo do Centipede precisará ler todos os shards. Atualmente, a destilação funciona assim:

  • Execute o fuzzing conforme descrito acima, para que todos os shards tenham seus conjuntos de features calculados. Pare o fuzzing.
  • Em seguida, execute os mesmos jobs de fuzzing, mas com --distill_shards=N. Isso fará com que os primeiros N jobs produzam N arquivos de corpus destilado independentes (um por job). Cada um dos corpora destilados deve ter as mesmas features do corpus completo, mas as entradas podem ser bem diferentes entre esses corpora destilados.

Se você também precisar exportar o corpus destilado para um diretório no estilo libFuzzer (diretório local com um arquivo por entrada), adicione --corpus_dir=DIR.

Relatório de cobertura

O Centipede gera um relatório de cobertura simples na forma de um arquivo de texto. O shard 123 gera um arquivo workdir/coverage-report-BINARY.000123.txt antes do fuzzing real começar, ou seja, o relatório reflete a cobertura observada pelo shard 123 após carregar o corpus.

O relatório mostra funções totalmente cobertas (todas as arestas do fluxo de controle são observadas pelo menos uma vez), não cobertas ou parcialmente cobertas. Para funções parcialmente cobertas, o relatório contém informações simbólicas para todas as arestas cobertas e não cobertas.

O relatório será algo assim:

root@kitploit:~
FULL: FUNCTION_A a.cc:1:0
NONE: FUNCTION_BB bb.cc:1:0
PARTIAL: FUNCTION_CCC ccc.cc:1:0
+ FUNCTION_CCC ccc.cc:1:0
- FUNCTION_CCC ccc.cc:2:0
- FUNCTION_CCC ccc.cc:3:0

Personalização

TBD

Leitura relacionada

  • Design do Centipede
Baixar ferramenta