CVE-2026-79977 in Zephyr
Resumen
por VulDB • 2026-10-23
El servicio VPN WireGuard en subsys/net/lib/wireguard/wg.c actualizó el punto final (endpoint) del par a partir de un mensaje que no pudo autenticar. En handle_transport_data(), cuando el índice de receptor de 32 bits de un mensaje transport-data entrante no coincidía con ninguna sesión, el código programó una nueva negociación y copió la dirección origen del datagrama en peer->endpoint mediante memcpy(&peer->endpoint, peer_addr, sizeof(peer->endpoint)). Dado que el índice de receptor es desconocido, no existe ninguna clave con la que se pueda verificar dicho mensaje; por lo tanto, la dirección escrita en peer->endpoint está completamente suministrada por el atacante. Todas las demás actualizaciones del punto final en la implementación ocurren únicamente después de la autenticación: tras la negociación Noise en handle_handshake_init(), o tras la descifrado AEAD y la comprobación anti-replay en wg_process_data_message().
El oyente (listener) de WireGuard se registra con net_udp_register() sin ningún filtro de dirección o puerto remoto, y por defecto utiliza el puerto UDP 51820 (CONFIG_WIREGUARD_PORT), mientras que wg_ctrl_recv() resuelve al par mediante la interfaz en lugar de cualquier identidad criptográfica. Cualquier host capaz de enviar un datagrama UDP a ese puerto puede alcanzar la vulnerabilidad fuera del camino (off-path), sin necesidad de observar el tráfico legítimo: basta con un datagrama de 16 bytes que transporte el tipo transport-data, bytes reservados nulos y un índice de receptor arbitrario. La rama vulnerable se ejecuta siempre que el par no tenga una negociación válida ni un par de claves actualizado; es decir, en el estado al arrancar y tras la expiración de una sesión.
Un único datagrama suplantado redirige peer->endpoint hacia una dirección elegida por el atacante, y todas las posteriores iniciaciones de negociación, keepalives y paquetes de datos cifrados se envían allí. El par legítimo nunca recibe las iniciaciones y, por tanto, no vuelve a autenticarse; nada restablece el punto final después, lo que deja la tunelización persistentemente inutilizable en dispositivos cuyo par no inicia negociaciones por sí mismo. El atacante también puede reenviar las iniciaciones redirigidas al par real para colocarse en la ruta de la tunelización, observando el texto cifrado y los metadatos del tráfico, y descartando selectivamente paquetes. La criptografía de extremo a extremo de WireGuard sigue impidiendo el descifrado o la falsificación del contenido de la tunelización; por lo tanto, el impacto es una pérdida de disponibilidad más una confidencialidad limitada, no un compromiso de las claves.
La corrección elimina completamente el aprendizaje del punto final en esta ruta: se mantiene la recuperación de sesiones obsoletas (stale-session recovery), pero la negociación se envía únicamente a un punto aprendido a partir de un mensaje autenticado, con una opción alternativa hacia cfg_endpoint configurado; y el mensaje se descarta cuando ninguno es conocido. CONFIG_WIREGUARD está marcado como experimental y no está habilitado por defecto.
If you want to get best quality of vulnerability data, you may have to visit VulDB.