
PJSIP DNS Compression Pointer Heap OOB Read (удалённый DoS)
Внеграничное чтение кучи по указателю сжатия DNS в PJSIP (удалённый DoS)
Функции get_name_len() и get_name() в pjlib-util/src/pjlib-util/dns.c считывают
2-байтовый указатель сжатия DNS через pj_memcpy(&offset, p, 2) без проверки того,
что оба байта находятся в пределах буфера пакета. Когда байт 0xC0 (маркер указателя
сжатия) является самым последним байтом DNS-ответа, memcpy считывает один байт
за границей выделенной области кучи.
Один сформированный 20-байтовый DNS-ответ вызывает внеграничное чтение и приводит к сбою любого приложения PJSIP (включая Asterisk и FreeSWITCH), которое разрешает домен через контролируемый сетью DNS-сервер.
ASan подтверждает: heap-buffer-overflow READ of size 2, 0 bytes after 20-byte region в get_name_len().
Это третья CVE, связанная с DNS-парсером в dns.c проекта pjproject с 2022 года (после
CVE-2022-24793 и CVE-2023-27585). Исправление CVE-2022-24793 добавило проверки длины
по всему парсеру, но пропустило путь указателя сжатия.
Затронуты: pjproject <= 2.16. Исправлено в pjproject 2.17 (коммит 5311aee).
# Автономный ASan-харнесс (установка pjproject не требуется):
./run.sh
# Или сборка и запуск вручную:
gcc -fsanitize=address,undefined -g -O0 harness.c -o harness
./harness
# Сетевой PoC — мошеннический DNS-сервер:
python3 poc.py --port 5353
# Затем укажите приложению PJSIP на мошеннический сервер:
# pjsua --nameserver 127.0.0.1:5353 sip:[email protected]
# Docker (собирает pjproject 2.16 из исходников с ASan):
docker compose build
docker compose run harness
gcc с поддержкой AddressSanitizer| Файл | Описание |
|---|---|
harness.c | Автономный ASan-харнесс — повторяет уязвимую get_name_len() с точными типами pjproject |
harness_pjlib.c | Альтернативный харнесс, вызывающий реальную pj_dns_parse_packet() (для Docker) |
poc.py | Мошеннический DNS-сервер — отвечает на любой запрос сформированным 20-байтовым пакетом |
run.sh | Собирает и запускает ASan-харнесс |
Dockerfile | Собирает pjproject 2.16 из исходников с ASan |
docker-compose.yml | Настройка Docker для pjlib-харнесса |
proof_output.txt | Полный вывод ASan из живой проверки |
Этот проект выпущен под лицензией GNU GPLv3.
Он предоставляется для оборонительных исследований безопасности, обучения и авторизованного тестирования. Не используйте этот код против систем или сервисов без явного разрешения владельца.
Несанкционированное использование может нарушать действующее законодательство. Авторы не дают разрешения на тестирование сторонних систем и не несут ответственности за неправомерное использование.
Условия гарантии и ответственности см. в файле LICENSE.