
PJSIP DNS Compression Pointer Heap OOB Read (DoS remoto)
Lectura fuera de límites del puntero de compresión DNS en el heap de PJSIP (DoS remoto)
get_name_len() y get_name() en pjlib-util/src/pjlib-util/dns.c leen un
puntero de compresión DNS de 2 bytes mediante pj_memcpy(&offset, p, 2) sin
comprobar que ambos bytes se encuentren dentro del búfer del paquete. Cuando un
byte 0xC0 (marcador de puntero de compresión) es el último byte de una
respuesta DNS, el memcpy lee un byte más allá del límite de asignación del heap.
Una única respuesta DNS manipulada de 20 bytes provoca la lectura fuera de límites y bloquea cualquier aplicación PJSIP (incluidos Asterisk y FreeSWITCH) que resuelva un dominio a través de un servidor DNS controlado por la red.
ASan lo confirma: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region en .
get_name_len()Este es el tercer CVE del analizador DNS en dns.c de pjproject desde 2022
(después de CVE-2022-24793 y CVE-2023-27585). La corrección de CVE-2022-24793
añadió comprobaciones de longitud en todo el analizador, pero omitió la ruta del
puntero de compresión.
Afectados: pjproject <= 2.16. Corregido en pjproject 2.17 (commit 5311aee).
# Harness ASan independiente (no requiere instalación de pjproject):
./run.sh
# O compilar y ejecutar manualmente:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# PoC de red -- servidor DNS malicioso:
python3 poc.py --port 5353
# Luego apunte una aplicación PJSIP al servidor malicioso:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (compila pjproject 2.16 desde el código fuente con ASan):
docker compose build
docker compose run harness
gcc con soporte de AddressSanitizer| Archivo | Descripción |
|---|---|
harness.c | Harness ASan independiente -- reimplementa la vulnerable get_name_len() con los tipos exactos de pjproject |
harness_pjlib.c | Harness alternativo que llama a la real pj_dns_parse_packet() (para Docker) |
poc.py | Servidor DNS malicioso -- responde a cualquier consulta con el paquete manipulado de 20 bytes |
run.sh | Compila y ejecuta el harness ASan |
Dockerfile | Compila pjproject 2.16 desde el código fuente con ASan |
docker-compose.yml | Configuración de Docker para el harness pjlib |
proof_output.txt | Salida ASan completa de la verificación en vivo |
Este proyecto se publica bajo la GNU GPLv3.
Se proporciona para investigación de seguridad defensiva, educación y pruebas autorizadas. No utilice este código contra sistemas o servicios sin permiso explícito del propietario.
El uso no autorizado puede violar la legislación aplicable. Los autores no otorgan permiso para probar sistemas de terceros y no son responsables del mal uso.
Consulte el archivo LICENSE para conocer los términos de garantía y responsabilidad.