CVE-2026-76787 in Zephyr
Resumen
por VulDB • 2026-10-19
El cliente de firmware-over-the-air de UpdateHub analiza la respuesta de sondeo CoAP con la biblioteca JSON de Zephyr en z_impl_updatehub_probe() (subsys/mgmt/updatehub/updatehub.c). El decodificador trata cada campo del descriptor como opcional: json_obj_parse() devuelve una máscara de bits de los campos que realmente analizó y nunca falla ante uno ausente, por lo que una respuesta que omite la cadena "sha256sum" deja el correspondiente const char * en las estructuras resp_probe_any_boards / struct resp_probe_some_boards inicializadas a cero (NULL). Ambas ramas del metadato calculan entonces sha256size = strlen(...objects.sha256sum) + 1 antes de cualquier validación, desreferenciando ese puntero NULL; la prueba SHA256_HEX_DIGEST_SIZE que sigue opera sobre un valor ya producido por una lectura incorrecta y no puede evitarlo.
Los metadatos son proporcionados completamente por el par de red: probe_cb() acepta el datagrama, ejecuta coap_packet_parse() y copia la carga útil sin coincidencia de token ni verificación criptográfica. Con CONFIG_UPDATEHUB_DTLS desactivado (el valor predeterminado), start_coap_client() utiliza CoAP plano sobre UDP en el puerto 5683 sin autenticación del par y resuelve el servidor mediante DNS no autentificado, por lo que un atacante on-path, un suplantador de DNS o un atacante off-path que gane la carrera con una dirección fuente falsificada puede entregar los metadatos malformados. Una respuesta de sondeo tan simple como "objects":[[{}],[{}]] es suficiente, y no se requiere interacción del usuario porque updatehub_autohandler() realiza consultas periódicas según CONFIG_UPDATEHUB_POLL_INTERVAL. Cuando CONFIG_UPDATEHUB_DTLS=y el desencadenante se reduce a un servidor de actualización malicioso o comprometido.
La primitiva es una lectura en la dirección cero, no una escritura, por lo que el impacto es solo de disponibilidad. En objetivos donde el rango de direcciones bajo está mapeado o protegido — arquitecturas basadas en MMU, compilaciones con CONFIG_NULL_POINTER_EXCEPTION_DETECTION_DWT/_MPU/_PMP, imágenes TrustZone no seguras y SoCs como nRF54L cuya ventana 0x0–0x400 está sin mapear — la carga provoca una falta (fault) y el manejador fatal predeterminado de Zephyr detiene el sistema, proporcionando un denegación de servicio reactivable remotamente en cada consulta. En objetivos Cortex-M clásicos donde la tabla de vectores es legible en la dirección cero, el recorrido suele terminar inmediatamente y la solicitud se rechaza por la comprobación de longitud, por lo que el resultado depende de la configuración y del SoC. No hay escritura de memoria, y los bytes copiados solo se comparan contra el hash de imagen calculado localmente, por lo que no existe un canal de divulgación de información.
La corrección añade una prueba explícita sha256sum == NULL que devuelve UPDATEHUB_METADATA_ERROR antes del strlen() en ambas ramas del metadato. Las compilaciones con depuración (CONFIG_UPDATEHUB_LOG_LEVEL=4) aún formatean los mismos punteros con %s en un bucle LOG_DBG() que se ejecuta antes de las nuevas comprobaciones, por lo que esa variante permanece solo en configuraciones de depuración.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.