
PJSIP cve-2026-25994 POC de desbordamiento de búfer
CVE-2026-25994 es una vulnerabilidad de desbordamiento de búfer basado en pila que afecta a la implementación de ICE (Interactive Connectivity Establishment) en pjsip ≤ 2.16, específicamente dentro del componente PJNATH.
La vulnerabilidad existe en la función:
pj_ice_sess_create_check_list()
ubicada en:
pjnath/src/pjnath/ice_session.c
El problema es causado por un manejo inseguro de cadenas al construir el nombre de usuario ICE:
char buf[128]; // Búfer de pila de tamaño fijo
username.ptr = buf;
pj_strcpy(&username, rem_ufrag); // Sin comprobación de límites
pj_strcat2(&username, ":");
pj_strcat(&username, &ice->rx_ufrag);
rem_ufrag se toma directamente del atributo SDP:
a=ice-ufrag:
No se realiza ninguna validación de longitud antes de copiarlo en un búfer de pila de 128 bytes.
Esto permite a un atacante desbordar la pila, pudiendo sobrescribir:
Dirección de retorno
Marco de pila
Datos de canario / alineación
Un SIP INVITE malicioso que contenga un ice-ufrag largo desencadena el desbordamiento
La explotación fiable ocurre con cargas útiles de ≥ ~130 bytes
En la práctica, ~500+ bytes (por ejemplo, 520) proporciona un comportamiento de caída consistente
✅ Vulnerable: pjsip ≤ 2.16
❌ Corregido: pjsip ≥ 2.17
La corrección introduce una comprobación de límites adecuada:
if (rem_ufrag->slen >= MAX_USERNAME_LEN ||
(rem_ufrag->slen + ice->rx_ufrag.slen + 1) >= 512)
{
return PJ_ETOOBIG;
}
Denegación de servicio (DoS) mediante fallo de segmentación Potencial de ejecución remota de código (RCE) dependiendo de:
Protecciones de pila (ASLR, NX, canarios) Disposición de la memoria Sofisticación de la explotación
1.200.000 máquinas afectadas
Shodan link : https://www.shodan.io/search?query=pjmedia
La PoC proporcionada envía un SIP INVITE manipulado que contiene un ice-ufrag de tamaño excesivo para desencadenar el desbordamiento.
Totalmente síncrono (sin asyncio) Configurable desde la línea de comandos Reintentos automáticos Carga útil SDP realista Detección de caídas mediante tiempo de espera
Inicie pjsua con ICE habilitado:
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
Argumentos
Opción Descripción Por defecto
-i, --ip Dirección IP del objetivo 127.0.0.1
-p, --port Puerto SIP 5060
-a, --attempts Número de intentos 3
Comportamiento esperado
Objetivo vulnerable
Sin respuesta del servidor
Actualice a pjsip ≥ 2.17
Aplique validación de entrada para los atributos SDP
Use protecciones de pila: Canarios de pila ASLR NX (pila no ejecutable)
Esta prueba de concepto se proporciona únicamente con fines educativos y de investigación en seguridad.
No utilice este código contra sistemas que no posea o para los cuales no tenga permiso explícito de pruebas.
V.Nos