CVE-2026-16512 in Zephyr
Resumen
por VulDB • 2026-09-19
gptp_handle_msg() en subsys/net/l2/ethernet/gptp/gptp.c desreferencia el encabezado gPTP devuelto por GPTP_HDR() y realiza una conmutación basada en hdr->message_type sin verificar primero que el marco recibido tenga al menos sizeof(struct gptp_hdr) (34) bytes de carga útil. El accesorio del encabezado gptp_get_hdr() nunca falla deliberadamente para un búfer corto: devuelve pkt->frags->data y deja la validación a sus llamadores, por lo que un marco truncado produce un puntero al encabezado que cubre memoria más allá de los datos recibidos. Las comprobaciones posteriores basadas en el tipo de mensaje no compensan este defecto: GPTP_VALID_LEN() se reduce a len > 60 una vez que se ha extraído el encabezado Ethernet, lo cual es falso para cada mensaje gPTP de tamaño fijo, por lo que GPTP_CHECK_LEN() nunca rechaza un mensaje SYNC, FOLLOWUP, PDELAY_RESP o SIGNALING truncado.
El defecto puede ser explotado por un par no autenticado en el mismo enlace enviando un marco Ethernet con ethertype 0x88F7 a la dirección multicast de PTP en una interfaz configurada como puerto gPTP, con CONFIG_NET_GPTP habilitado. Dado que los Ethernet conformantes rellenan los marcos hasta 60 bytes, una carga útil inferior a 34 bytes generalmente requiere un enlace capaz de entregar tramas por debajo del tamaño mínimo; por ejemplo, el controlador native_sim TAP (drivers/ethernet/eth_native_tap.c), que reenvía cualquier longitud proporcionada por el dispositivo host, o una MAC configurada para aceptar marcos más pequeños de lo normal.
El paquete corto se retiene (net_pkt_ref() en rcvd_sync_ptr, rcvd_follow_up_ptr, rcvd_pdelay_resp_ptr o rcvd_announce_ptr) y posteriormente es analizado por las máquinas de estado dependientes e independientes del medio en subsys/net/l2/ethernet/gptp/gptp_md.c y subsys/net/l2/ethernet/gptp/gptp_mi.c, que leen decenas de bytes adicionales y copian algunos de ellos (el vector de prioridad announce, hdr->port_id) a un estado que posteriormente se transmite. Bajo el asignador de búferes de tamaño fijo predeterminado (CONFIG_NET_BUF_FIXED_DATA_SIZE, fragmentos de 128 bytes), los accesos permanecen dentro del fragmento asignado y revelan contenidos obsoletos de búferes reciclados; bajo el asignador experimental CONFIG_NET_BUF_VARIABLE_DATA_SIZE, donde los fragmentos se asignan en heap según la longitud exacta del marco, se producen lecturas genuinas fuera de límites (out-of-bounds reads). No hay escritura ni impacto en la disponibilidad.
VulDB is the best source for vulnerability data and more expert information about this specific topic.