
PJSIP DNS-Komprimierungszeiger Heap-Out-of-Bounds-Read (Remote DoS)
PJSIP DNS-Komprimierungszeiger Heap-OOB-Read (Remote DoS)
get_name_len() und get_name() in pjlib-util/src/pjlib-util/dns.c lesen einen
2-Byte-DNS-Komprimierungszeiger über pj_memcpy(&offset, p, 2), ohne zu prüfen,
dass beide Bytes innerhalb des Paketpuffers liegen. Wenn ein 0xC0-Byte
(Komprimierungszeiger-Marker) das allerletzte Byte einer DNS-Antwort ist, liest
das memcpy ein Byte über die Heap-Allokationsgrenze hinaus.
Eine einzelne manipulierte 20-Byte-DNS-Antwort löst den OOB-Read aus und bringt jede PJSIP-Anwendung (einschließlich Asterisk und FreeSWITCH) zum Absturz, die einen Domainnamen über einen netzwerkgesteuerten DNS-Server auflöst.
ASan bestätigt: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region in .
get_name_len()Dies ist die dritte DNS-Parser-CVE in pjprojects dns.c seit 2022 (nach
CVE-2022-24793 und CVE-2023-27585). Der CVE-2022-24793-Fix fügte Längenprüfungen
im gesamten Parser hinzu, übersah jedoch den Komprimierungszeiger-Pfad.
Betroffen: pjproject <= 2.16. Behoben in pjproject 2.17 (Commit 5311aee).
# Eigenständige ASan-Harness (keine pjproject-Installation erforderlich):
./run.sh
# Oder manuell bauen und ausführen:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# Netzwerk-PoC -- Schurken-DNS-Server:
python3 poc.py --port 5353
# Dann eine PJSIP-Anwendung auf den Schurken-Server ausrichten:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (baut pjproject 2.16 aus dem Quellcode mit ASan):
docker compose build
docker compose run harness
gcc mit AddressSanitizer-Unterstützung| Datei | Beschreibung |
|---|---|
harness.c | Eigenständige ASan-Harness -- implementiert die verwundbare get_name_len() mit exakten pjproject-Typen neu |
harness_pjlib.c | Alternative Harness, die die echte pj_dns_parse_packet() aufruft (für Docker) |
poc.py | Schurken-DNS-Server -- antwortet auf jede Abfrage mit dem manipulierten 20-Byte-Paket |
run.sh | Baut und führt die ASan-Harness aus |
Dockerfile | Baut pjproject 2.16 aus dem Quellcode mit ASan |
docker-compose.yml | Docker-Setup für die pjlib-Harness |
proof_output.txt | Vollständige ASan-Ausgabe aus der Live-Verifizierung |
Dieses Projekt wird unter der GNU GPLv3 veröffentlicht.
Es wird für defensive Sicherheitsforschung, Bildung und autorisierte Tests bereitgestellt. Verwenden Sie diesen Code nicht gegen Systeme oder Dienste ohne ausdrückliche Genehmigung des Eigentümers.
Unbefugte Nutzung kann gegen geltendes Recht verstoßen. Die Autoren erteilen keine Erlaubnis zum Testen von Drittsystemen und sind nicht für Missbrauch verantwortlich.
Siehe die LICENSE-Datei für Gewährleistungs- und Haftungsbedingungen.