
PJSIP DNS Compression Pointer Heap OOB Read (DoS à distance)
Lecture hors limites du tas du pointeur de compression DNS PJSIP (DoS à distance)
get_name_len() et get_name() dans pjlib-util/src/pjlib-util/dns.c lisent un
pointeur de compression DNS de 2 octets via pj_memcpy(&offset, p, 2) sans vérifier
que les deux octets se trouvent dans le tampon du paquet. Lorsqu'un octet 0xC0 (marqueur
de pointeur de compression) est le tout dernier octet d'une réponse DNS, le memcpy lit un
octet au-delà de la limite d'allocation du tas.
Une seule réponse DNS malveillante de 20 octets déclenche la lecture hors limites et fait planter toute application PJSIP (y compris Asterisk et FreeSWITCH) qui résout un domaine via un serveur DNS contrôlé par le réseau.
ASan confirme : heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region dans .
get_name_len()Il s'agit de la troisième CVE du parseur DNS dans le fichier dns.c de pjproject depuis 2022 (après
CVE-2022-24793 et CVE-2023-27585). Le correctif de CVE-2022-24793 a ajouté des vérifications de longueur
dans tout le parseur mais a manqué le chemin du pointeur de compression.
Affecté : pjproject <= 2.16. Corrigé dans pjproject 2.17 (commit 5311aee).
# Harnais ASan autonome (aucune installation de pjproject requise) :
./run.sh
# Ou compilation et exécution manuelles :
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# PoC réseau -- serveur DNS malveillant :
python3 poc.py --port 5353
# Puis pointez une application PJSIP vers le serveur malveillant :
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (compile pjproject 2.16 depuis les sources avec ASan) :
docker compose build
docker compose run harness
gcc avec prise en charge d'AddressSanitizer| Fichier | Description |
|---|---|
harness.c | Harnais ASan autonome -- réimplémente la fonction vulnérable get_name_len() avec les types exacts de pjproject |
harness_pjlib.c | Harnais alternatif appelant la vraie fonction pj_dns_parse_packet() (pour Docker) |
poc.py | Serveur DNS malveillant -- répond à toute requête avec le paquet malveillant de 20 octets |
run.sh | Compile et exécute le harnais ASan |
Dockerfile | Compile pjproject 2.16 depuis les sources avec ASan |
docker-compose.yml | Configuration Docker pour le harnais pjlib |
proof_output.txt | Sortie ASan complète issue de la vérification en conditions réelles |
Ce projet est publié sous licence GNU GPLv3.
Il est fourni à des fins de recherche défensive en sécurité, d'éducation et de tests autorisés. N'utilisez pas ce code contre des systèmes ou des services sans autorisation explicite du propriétaire.
Toute utilisation non autorisée peut enfreindre la loi applicable. Les auteurs n'accordent pas la permission de tester des systèmes tiers et ne sont pas responsables d'une mauvaise utilisation.
Consultez le fichier LICENSE pour les conditions de garantie et de responsabilité.