
PJSIP DNS Compression Pointer Heap OOB Read (Remote DoS)
Lettura OOB dell'heap del puntatore di compressione DNS in PJSIP (DoS remoto)
get_name_len() e get_name() in pjlib-util/src/pjlib-util/dns.c leggono un
puntatore di compressione DNS a 2 byte tramite pj_memcpy(&offset, p, 2) senza
verificare che entrambi i byte rientrino nel buffer del pacchetto. Quando un byte
0xC0 (marcatore di puntatore di compressione) è l'ultimo byte di una risposta DNS,
la memcpy legge un byte oltre il limite di allocazione dell'heap.
Una singola risposta DNS craftata di 20 byte innesca la lettura OOB e causa il crash di qualsiasi applicazione PJSIP (inclusi Asterisk e FreeSWITCH) che risolve un dominio tramite un server DNS controllato dalla rete.
ASan conferma: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region in get_name_len().
Questa è la terza CVE del parser DNS in dns.c di pjproject dal 2022 (dopo
CVE-2022-24793 e CVE-2023-27585). La correzione di CVE-2022-24793 ha aggiunto controlli
di lunghezza in tutto il parser ma ha mancato il percorso del puntatore di compressione.
Interessati: pjproject <= 2.16. Corretto in pjproject 2.17 (commit 5311aee).
# Harness ASan standalone (nessuna installazione di pjproject richiesta):
./run.sh
# Oppure compila ed esegui manualmente:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# PoC di rete -- server DNS rogue:
python3 poc.py --port 5353
# Quindi punta un'applicazione PJSIP al server rogue:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (compila pjproject 2.16 dal sorgente con ASan):
docker compose build
docker compose run harness
gcc con supporto AddressSanitizerQuesto progetto è rilasciato sotto GNU GPLv3.
È fornito per ricerca sulla sicurezza difensiva, istruzione e test autorizzati. Non utilizzare questo codice contro sistemi o servizi senza esplicita autorizzazione del proprietario.
L'uso non autorizzato può violare la legge applicabile. Gli autori non concedono il permesso di testare sistemi di terze parti e non sono responsabili per un uso improprio.
Vedere il file LICENSE per i termini di garanzia e responsabilità.
| File | Descrizione |
|---|
harness.c | Harness ASan standalone -- reimplementa la vulnerabile get_name_len() con gli esatti tipi di pjproject |
harness_pjlib.c | Harness alternativo che chiama la reale pj_dns_parse_packet() (per Docker) |
poc.py | Server DNS rogue -- risponde a qualsiasi query con il pacchetto craftato di 20 byte |
run.sh | Compila ed esegue l'harness ASan |
Dockerfile | Compila pjproject 2.16 dal sorgente con ASan |
docker-compose.yml | Configurazione Docker per l'harness pjlib |
proof_output.txt | Output ASan completo dalla verifica dal vivo |