Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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
codeql-buffer-overflow-variant — Variante sintética de estouro de buffer de pilha CWE-120 de CVE-2020-8597 (pppd EAP) como um alvo de análise estática CodeQL | Kitploit
Ferramentas/GitHubGitHub/anna-kravets/codeql-buffer-overflow-variant
Análise EstáticaAnálise Estática de Código (SAST)Análise de VulnerabilidadesAnálise de Código
GitHubanna-kravets/codeql-buffer-overflow-variant

codeql-buffer-overflow-variant

Variante sintética de estouro de buffer de pilha CWE-120 de CVE-2020-8597 (pppd EAP) como um alvo de análise estática CodeQL

Ver Repositório

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 →
17há 1 mêsAinda não revisado
Compartilhar

codeql-buffer-overflow-variant

Um programa C deliberadamente vulnerável, com ~170 linhas, usado como alvo de análise estática do CodeQL. Ele reproduz a classe de bug do CVE-2020-8597 — o estouro de buffer de pilha em rhostname do EAP do pppd (CWE-120) — em um programa que não compartilha nenhum dos nomes de função, profundidade de chamada ou estrutura de despacho do pppd.

O objetivo é um teste de generalidade: uma consulta CodeQL escrita para capturar o bug do pppd também deve disparar neste programa, sem edições. Se isso acontecer, a consulta expressa a classe de bug em vez da forma do código original.

Este programa é intencionalmente inseguro e existe apenas para análise. Não o implante. O bug que ele espelha é público (CVE-2020-8597, divulgado em 2020).

A classe de bug

Um comprimento derivado do atacante é copiado para um buffer de tamanho fixo, sem nenhuma proteção que relacione esse comprimento ao tamanho do buffer.

Em todos os casos há uma verificação de limites — ela simplesmente falha em relacionar as duas quantidades que importam. Existem exatamente duas maneiras de errar nisso, e o programa contém uma de cada:

  • Valor certo, limite errado. O comprimento da cópia é verificado, mas em relação ao frame recebido em vez de sizeof(dest). Impede uma leitura excessiva, não faz nada quanto à escrita excessiva. (handle_hello)
  • Limite certo, valor errado. A verificação nomeia sizeof(dest) — parece exatamente um limite de buffer — mas restringe uma variável diferente da usada como comprimento da cópia. (handle_stat)

A segunda é a mais difícil, e é o que a verificação morta do pppd vallen >= len + sizeof(rhostname) é: uma comparação que menciona o tamanho do destino enquanto restringe algo que não é o comprimento da cópia. Uma consulta que apenas pergunta "alguma comparação aqui menciona sizeof(dest)?" é silenciada por ela.

Estrutura vs. pppd (por que é uma variante real)

pppd / CVE-2020-8597este projeto
Origemread() no fd PPPrecvfrom() em um socket UDP
Despachostruct protent *protocols[] global, correspondência linear no nº do protocoloconst struct frame_op ops[] local ao arquivo, correspondência linear na tag de 1 byte
Profundidade até o sinkget_input → (*input) → eap_input → eap_requestdispatch_frame → (*handle) → handle_hello
Destinochar rhostname[256]char name[64]
Guarda erradavallen limitado pelo len do pacotevlen limitado pelo plen do frame

Ambos mantêm a única propriedade que torna isso fluxo de dados, e não grep: uma chamada indireta através de uma tabela de ponteiros de função entre a origem e o sink.

HandlerLinhaVerificação presenteVeredito
handle_hello()sink em :80vlen > plen - 2 — valor certo, limite erradodeve disparar
handle_echo()cópia em :106vlen >= sizeof(buf) — ambos certosdeve permanecer silencioso — controle negativo
handle_stat()sink em :145hlen >= sizeof(report) — limite certo, valor erradodeve disparar

handle_stat é o caso discriminante. Sua verificação nomeia sizeof(report), então uma consulta que aceita qualquer comparação mencionando o tamanho do destino o trata como protegido e perde o bug. Capturá-lo exige comparar o valor sendo verificado com o valor usado como comprimento da cópia — numeração global de valores. Remova isso da consulta e este handler se torna um falso negativo, enquanto todos os outros locais mantêm seu veredito.

Formato do protocolo

Um datagrama UDP = um frame:

[ type : 1 ] [ length : 2, big-endian ] [ value : length bytes ]

type 0x01 → hello, 0x02 → echo, 0x03 → stat. Um frame hello com um comprimento declarado entre 65 e ~2045 estoura name[64]. Um frame stat carrega dois comprimentos de um byte em vez disso — um comprimento de cabeçalho e um comprimento de corpo — e qualquer comprimento de corpo acima de 32 estoura report[32], independentemente do que o comprimento do cabeçalho diga.

Compilação

make            # gcc -Wall -Wextra -O0 -g -o tlv_server tlv_server.c

Linux/POSIX (sockets BSD). Compila limpo, sem avisos.

Construir um banco de dados CodeQL

O CodeQL rastreia uma compilação real, então compile a partir do estado limpo:

make clean
codeql database create db --language=cpp --command="make"
# ou, sem a etapa de limpeza:
codeql database create db --language=cpp --command="make -B"

Em seguida, execute a consulta da Parte 3 contra db; ela deve reportar o memcpy em handle_hello e o em handle_stat, e permanecer silenciosa em handle_echo. A consulta e suas instruções de execução estão em codeql/.

O código-fonte muda sempre que um handler é adicionado, então reconstrua o banco de dados — o CodeQL tira um snapshot do código no momento do database create e um db/ existente não verá o novo código.

Baixar ferramenta