CVE-2026-76787

Estado: RecibidaMedia (5.9)—
Gravedad5.9Media · CVSS 3.1
Probabilidad de explotación0.29 %mayor que el 20 % de las CVE
Explotación activaNono figura en el catálogo de CISA
Exploit públicoNo conocidosin código público localizado

El cliente de actualización over-the-air de firmware 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 todos los campos del descriptor como opcionales: json_obj_parse() devuelve una máscara de bits con los campos que realmente decodificó y nunca falla ante uno ausente; por tanto, una respuesta que omite la cadena "sha256sum" deja el correspondiente const char * en NULL dentro de la estructura inicializada a cero struct resp_probe_any_boards / struct resp_probe_some_boards.

Leer descripción completaMostrar menos

Ambas ramas de metadatos calculaban entonces sha256size = strlen(...objects.sha256sum) + 1 antes de cualquier validación, desreferenciando ese puntero NULL; la comprobación SHA256_HEX_DIGEST_SIZE que sigue opera sobre un valor que la lectura incorrecta ya ha producido y no puede impedirlo.

Los metadatos los suministra enteramente el par de red: probe_cb() acepta el datagrama, ejecuta coap_packet_parse() y copia la carga útil sin comprobar el token ni realizar ninguna verificación criptográfica. Con CONFIG_UPDATEHUB_DTLS sin definir, que es el valor por defecto, start_coap_client() utiliza CoAP en texto plano sobre UDP en el puerto 5683, sin autenticación del par, y resuelve el servidor mediante DNS no autenticado; por ello, un atacante en la ruta, un suplantador de DNS o un atacante fuera de la ruta que gane la carrera con una dirección de origen falsificada puede entregar los metadatos malformados. Basta una respuesta de sondeo tan simple como "objects":[[{}],[{}]] y no se requiere interacción del usuario, porque updatehub_autohandler() sondea según CONFIG_UPDATEHUB_POLL_INTERVAL. Cuando CONFIG_UPDATEHUB_DTLS=y, el desencadenante se reduce a un servidor de actualizaciones malicioso o comprometido.

La primitiva es una lectura en la dirección cero, no una escritura, por lo que el impacto se limita a la disponibilidad. En objetivos donde el rango bajo de direcciones no está mapeado o está protegido (arquitecturas basadas en MMU, compilaciones con CONFIG_NULL_POINTER_EXCEPTION_DETECTION_DWT/_MPU/_PMP, imágenes no seguras de TrustZone y SoC como nRF54L, cuya ventana 0x0–0x400 no está mapeada), la carga provoca un fallo y el manejador de errores fatales por defecto de Zephyr detiene el sistema, lo que supone una denegación de servicio (DoS) reactivable de forma remota en cada sondeo. En los objetivos Cortex-M clásicos donde la tabla de vectores es legible en la dirección cero, el recorrido suele terminar de inmediato 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 en memoria, y los bytes copiados solo se comparan con el hash de la imagen calculado localmente, así que no existe un canal de fuga de información.

La corrección añade una comprobación explícita sha256sum == NULL que devuelve UPDATEHUB_METADATA_ERROR antes del strlen() en ambas ramas de metadatos. Las compilaciones de depuración (CONFIG_UPDATEHUB_LOG_LEVEL=4) siguen formateando los mismos punteros con %s en un bucle LOG_DBG() que se ejecuta antes de las nuevas comprobaciones, por lo que esta variante permanece únicamente en las configuraciones de depuración.

Traducción automática del texto original de NVD (en inglés).

CVSS

Puntuación base
5.9
Versión
3.1
Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H

Probabilidad de explotación (EPSS)

Probabilidad de explotación en los próximos 30 días
0.29 %
Percentil entre todas las CVEs puntuadas
20
Fecha de la puntuación
20/10/2026

EPSS (Exploit Prediction Scoring System, de FIRST) estima la probabilidad de que una vulnerabilidad sea explotada en 30 días. Complementa a CVSS (impacto) y a CISA KEV (explotación confirmada).

Técnicas ATT&CK

Cómo se explota esta vulnerabilidad y qué consigue el atacante, en el lenguaje de MITRE ATT&CK.

Vector AV:N/PR:N/UI:N permite explotarlo remotamente sin autenticación; la lectura en dirección cero provoca un fallo que detiene el sistema (solo disponibilidad, A:H).

Inferido por nuestro agente de análisis a partir de la descripción oficial, el vector CVSS y la CWE, y comprobado por un supervisor. Puede contener errores.

Mitigaciones ATT&CK que cubren estas técnicas

Tecnologías afectadas (2)

⚠ Inferidas por IA a partir de la descripción — NVD aún no ha analizado esta CVE; no son CPE verificados.

CWE

Referencias

Mostrar las 2 referencias

JSON original (NVD)

Mostrar
{
  "id": "CVE-2026-76787",
  "cveTags": [],
  "metrics": {
    "cvssMetricV31": [
      {
        "type": "Secondary",
        "source": "vulnerabilities@zephyrproject.org",
        "cvssData": {
          "scope": "UNCHANGED",
          "version": "3.1",
          "baseScore": 5.9,
          "attackVector": "NETWORK",
          "baseSeverity": "MEDIUM",
          "vectorString": "CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H",
          "integrityImpact": "NONE",
          "userInteraction": "NONE",
          "attackComplexity": "HIGH",
          "availabilityImpact": "HIGH",
          "privilegesRequired": "NONE",
          "confidentialityImpact": "NONE"
        },
        "impactScore": 3.6,
        "exploitabilityScore": 2.2
      }
    ]
  },
  "affected": [
    {
      "source": "vulnerabilities@zephyrproject.org",
      "affectedData": [
        {
          "vendor": "zephyrproject",
          "product": "zephyr",
          "versions": [
            {
              "status": "affected",
              "version": "2.4.0",
              "lessThan": "4.5.0",
              "versionType": "semver"
            }
          ],
          "packageName": "zephyr",
          "programFiles": [
            "subsys/mgmt/updatehub/updatehub.c"
          ],
          "collectionURL": "https://github.com/zephyrproject-rtos/zephyr",
          "defaultStatus": "unaffected",
          "programRoutines": [
            {
              "name": "z_impl_updatehub_probe"
            }
          ]
        }
      ]
    }
  ],
  "published": "2026-10-19T21:18:01.230",
  "references": [
    {
      "url": "https://github.com/zephyrproject-rtos/zephyr/commit/6fc4f27a74021b52c509e4f7912d68145dfa7728",
      "source": "vulnerabilities@zephyrproject.org"
    },
    {
      "url": "https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-82gq-cmqw-xgx2",
      "source": "vulnerabilities@zephyrproject.org"
    }
  ],
  "vulnStatus": "Received",
  "weaknesses": [
    {
      "type": "Secondary",
      "source": "vulnerabilities@zephyrproject.org",
      "description": [
        {
          "lang": "en",
          "value": "CWE-476"
        }
      ]
    }
  ],
  "descriptions": [
    {
      "lang": "en",
      "value": "The UpdateHub firmware-over-the-air client parses the CoAP probe response with Zephyr's JSON library in z_impl_updatehub_probe() (subsys/mgmt/updatehub/updatehub.c). The decoder treats every descriptor field as optional — json_obj_parse() returns a bitmask of the fields it actually decoded and never fails on a missing one — so a response that omits the \"sha256sum\" string leaves the corresponding const char * in the zero-initialised struct resp_probe_any_boards / struct resp_probe_some_boards at NULL. Both metadata branches then computed sha256size = strlen(...objects.sha256sum) + 1 before any validation, dereferencing that NULL pointer; the SHA256_HEX_DIGEST_SIZE test that follows operates on a value the bad read has already produced and cannot prevent it.\n\nThe metadata is supplied entirely by the network peer: probe_cb() accepts the datagram, runs coap_packet_parse() and copies the payload with no token matching and no cryptographic check. With CONFIG_UPDATEHUB_DTLS unset — the default — start_coap_client() uses plain CoAP over UDP on port 5683 with no peer authentication and resolves the server via unauthenticated DNS, so an on-path attacker, a DNS spoofer, or an off-path attacker who wins the race with a forged source address can deliver the malformed metadata. A probe response as simple as \"objects\":[[{}],[{}]] suffices, and no user interaction is required because updatehub_autohandler() polls on CONFIG_UPDATEHUB_POLL_INTERVAL. When CONFIG_UPDATEHUB_DTLS=y the trigger narrows to a malicious or compromised update server.\n\nThe primitive is a read at address zero, not a write, so the impact is availability only. On targets where the low address range is unmapped or protected — MMU-based architectures, builds with CONFIG_NULL_POINTER_EXCEPTION_DETECTION_DWT/_MPU/_PMP, TrustZone non-secure images, and SoCs such as nRF54L whose 0x0–0x400 window is unmapped — the load faults and Zephyr's default fatal handler halts the system, giving a remotely re-triggerable denial of service on every poll. On classic Cortex-M targets where the vector table is readable at address zero the walk usually terminates immediately and the request is rejected by the length check, so the outcome is configuration- and SoC-dependent. There is no memory write, and the copied bytes are only compared against the locally computed image hash, so there is no information-disclosure channel.\n\nThe fix adds an explicit sha256sum == NULL test that returns UPDATEHUB_METADATA_ERROR ahead of the strlen() in both metadata branches. Debug builds (CONFIG_UPDATEHUB_LOG_LEVEL=4) still format the same pointers with %s in a LOG_DBG() loop that runs before the new checks, so that variant remains in debug configurations only."
    }
  ],
  "lastModified": "2026-10-19T21:18:01.230",
  "sourceIdentifier": "vulnerabilities@zephyrproject.org"
}