
PJSIP DNS Compression Pointer Heap OOB Read (Remote DoS)
Leitura Fora dos Limites do Heap do Ponteiro de Compressão DNS do PJSIP (DoS Remoto)
get_name_len() e get_name() em pjlib-util/src/pjlib-util/dns.c leem um
ponteiro de compressão DNS de 2 bytes via pj_memcpy(&offset, p, 2) sem verificar
que ambos os bytes estão dentro do buffer do pacote. Quando um byte 0xC0 (marcador
de ponteiro de compressão) é o último byte de uma resposta DNS, o memcpy lê um
byte além do limite da alocação do heap.
Uma única resposta DNS maliciosa de 20 bytes aciona a leitura fora dos limites e derruba qualquer aplicação PJSIP (incluindo Asterisk e FreeSWITCH) que resolva um domínio por meio de um servidor DNS controlado pela rede.
O ASan confirma: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region em get_name_len().
Esta é a terceira CVE do parser DNS no dns.c do pjproject desde 2022 (após
CVE-2022-24793 e CVE-2023-27585). A correção da CVE-2022-24793 adicionou verificações
de comprimento em todo o parser, mas não cobriu o caminho do ponteiro de compressão.
Afetados: pjproject <= 2.16. Corrigido no pjproject 2.17 (commit 5311aee).
# Harness ASan autônomo (sem necessidade de instalação do pjproject):
./run.sh
# Ou compile e execute manualmente:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# PoC de rede -- servidor DNS malicioso:
python3 poc.py --port 5353
# Em seguida, aponte uma aplicação PJSIP para o servidor malicioso:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (compila o pjproject 2.16 a partir do código-fonte com ASan):
docker compose build
docker compose run harness
gcc com suporte a AddressSanitizer| Arquivo | Descrição |
|---|---|
harness.c | Harness ASan autônomo -- reimplementa a vulnerável get_name_len() com os tipos exatos do pjproject |
harness_pjlib.c | Harness alternativo que chama a função real pj_dns_parse_packet() (para Docker) |
poc.py | Servidor DNS malicioso -- responde a qualquer consulta com o pacote malicioso de 20 bytes |
run.sh | Compila e executa o harness ASan |
Dockerfile | Compila o pjproject 2.16 a partir do código-fonte com ASan |
docker-compose.yml | Configuração Docker para o harness pjlib |
proof_output.txt | Saída ASan completa da verificação ao vivo |
Este projeto é distribuído sob a GNU GPLv3.
Ele é fornecido para pesquisa de segurança defensiva, educação e testes autorizados. Não use este código contra sistemas ou serviços sem permissão explícita do proprietário.
O uso não autorizado pode violar a legislação aplicável. Os autores não concedem permissão para testar sistemas de terceiros e não são responsáveis pelo uso indevido.
Consulte o arquivo LICENSE para os termos de garantia e responsabilidade.