
PJSIP cve-2026-25994 BUFFER OVERFLOW POC
CVE-2026-25994 — это уязвимость переполнения стека буфера, затрагивающая реализацию ICE (Interactive Connectivity Establishment) в pjsip ≤ 2.16, а именно в компоненте PJNATH.
Уязвимость находится в функции:
pj_ice_sess_create_check_list()
расположенной в:
pjnath/src/pjnath/ice_session.c
Проблема вызвана небезопасной обработкой строк при формировании имени пользователя ICE:
char buf[128]; // Fixed-size stack buffer
username.ptr = buf;
pj_strcpy(&username, rem_ufrag); // No bounds checking
pj_strcat2(&username, ":");
pj_strcat(&username, &ice->rx_ufrag);
rem_ufrag берется напрямую из SDP-атрибута:
a=ice-ufrag:
Не выполняется проверка длины перед копированием в стековый буфер размером 128 байт.
Это позволяет атакующему вызвать переполнение стека, потенциально перезаписывая:
Адрес возврата
Кадр стека
Канарейка / данные выравнивания
Вредоносное SIP-приглашение (INVITE), содержащее длинное значение ice-ufrag, вызывает переполнение.
Надежная эксплуатация возможна при полезной нагрузке ≥ ~130 байт.
На практике ~500+ байт (например, 520) обеспечивает стабильное аварийное завершение.
✅ Уязвимые: pjsip ≤ 2.16
❌ Исправлено: pjsip ≥ 2.17
Исправление добавляет надлежащую проверку границ:
if (rem_ufrag->slen >= MAX_USERNAME_LEN ||
(rem_ufrag->slen + ice->rx_ufrag.slen + 1) >= 512)
{
return PJ_ETOOBIG;
}
Отказ в обслуживании (DoS) из-за ошибки сегментации
Потенциальная возможность удаленного выполнения кода (RCE) в зависимости от:
Защиты стека (ASLR, NX, канарейки)
Расположение памяти
Сложность эксплойта
1.200.000 затронутых машин
Shodan link : https://www.shodan.io/search?query=pjmedia
Предоставленный PoC отправляет поддельное SIP-приглашение (INVITE), содержащее увеличенное значение ice-ufrag, чтобы вызвать переполнение.
Полностью синхронный (без asyncio)
Настраивается через командную строку
Автоматические повторные попытки
Реалистичная полезная нагрузка SDP
Обнаружение сбоя по тайм-ауту
Запустите pjsua с включенным ICE:
pjsua-x86_64-unknown-linux-gnu --use-ice --local-port=5060 --log-level=5 --no-tcp --auto-answer=200
python3 pjsip.py -i <target_ip> -p 5060 -a 3
Arguments
Option Description Default
-i, --ip Target IP address 127.0.0.1
-p, --port SIP port 5060
-a, --attempts Number of attempts 3
Expected Behavior
Vulnerable Target
No response from server
Обновите до pjsip ≥ 2.17
Примените валидацию входных данных для SDP-атрибутов
Используйте защиты стека:
Канарейки стека
ASLR
NX (неисполняемый стек)
Данное доказательство концепции предоставлено только для образовательных целей и исследований в области безопасности.
Не используйте этот код против систем, которыми вы не владеете или на тестирование которых не имеете явного разрешения.
V.Nos